From bb90f11ec87493cb7761f2ea721f14a1df560671 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Thu, 17 Mar 2022 16:47:42 +0530 Subject: [PATCH 001/824] Formify issue templates and improve existing (#395) * Update bug_report.md * Rename bug_report.md to bug_report.yml * Update and rename feature_request.md to feature_request.yml * Create config.yml * Update PULL_REQUEST_TEMPLATE.md --- .github/ISSUE_TEMPLATE/bug_report.md | 33 ------------ .github/ISSUE_TEMPLATE/bug_report.yml | 59 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 4 ++ .github/ISSUE_TEMPLATE/feature_request.md | 20 -------- .github/ISSUE_TEMPLATE/feature_request.yml | 35 +++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 6 +-- 6 files changed, 100 insertions(+), 57 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index e11afd59..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -#### Describe the bug -A clear and concise description of what the bug is. - -#### To Reproduce -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -#### Expected behavior -A clear and concise description of what you expected to happen. - -#### Screenshots -If applicable, add screenshots to help explain your problem. - -#### Desktop (please complete the following information): - - OS: [e.g. Windows, MacOS] - - Browser: [e.g. chrome, firefox] - - Version: [e.g. 3.22] - - Matrix homeserver: [e.g. matrix.org] - -#### Additional context -Add any other context about the problem here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..517d390e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,59 @@ +name: 🐞 Bug Report +title: '[bug] ' +description: Report a bug +labels: 'type: bug' + +body: + - type: markdown + attributes: + value: | + ## First of all + 1. Please search for [existing issues](https://github.com/ajbura/cinny/issues?q=is%3Aissue) about this problem first. + 2. Make sure Cinny is up to date. + 3. Make sure it's an issue with Cinny and not something else you are using. + 4. Remember to be friendly. + + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear description of what the bug is. Include screenshots if applicable. + placeholder: Bug description + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Reproduction + description: Steps to reproduce the behavior. + placeholder: | + 1. Go to ... + 2. Click on ... + 3. See error + + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: A clear description of what you expected to happen. + + - type: textarea + id: info + attributes: + label: Platform and versions + description: "Provide OS, browser and Cinny version with your Homeserver." + placeholder: | + 1. OS: [e.g. Windows 10, MacOS] + 2. Browser: [e.g. chrome 99.5, firefox 97.2] + 3. Cinny version: [e.g. 1.8.1 (app.cinny.in)] + 4. Matrix homeserver: [e.g. matrix.org] + render: shell + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..91ba4f0a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: 💬 Matrix Chat + url: https://matrix.to/#/#cinny:matrix.org + about: Ask questions and talk to other Cinny users and the maintainers diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 1d144c3c..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -#### Is your feature request related to a problem? Please describe. -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -#### Describe the solution you'd like -A clear and concise description of what you want to happen. - -#### Describe alternatives you've considered -A clear and concise description of any alternative solutions or features you've considered. - -#### Additional context -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..d45af200 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,35 @@ +name: 💡 Feature Request +title: '[feat] ' +description: Suggest an idea +labels: 'type: feature' + +body: + - type: textarea + id: problem + attributes: + label: Describe the problem + description: A clear description of the problem this feature would solve + placeholder: "I'm always frustrated when..." + validations: + required: true + + - type: textarea + id: solution + attributes: + label: "Describe the solution you'd like" + description: A clear description of what change you would like + placeholder: "I would like to..." + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: "Any alternative solutions you've considered" + + - type: textarea + id: context + attributes: + label: Additional context + description: Add any other context about the problem here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 87fb5c10..a8a04e76 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,13 @@ ### Description + -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. -Fixes # (issue) +Fixes # #### Type of change -Please delete options that are not relevant. - - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) From 5a299b21c554c412776559f227bbd6894bd1ea0d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 17 Mar 2022 16:55:16 +0530 Subject: [PATCH 002/824] Sort direct messages by activity (#393) * Add sort util Signed-off-by: Ajay Bura * Use sort util for members Signed-off-by: Ajay Bura * Sort dms by activity Signed-off-by: Ajay Bura * Sort dms activily Signed-off-by: Ajay Bura * Chanege roomIdByLastActive func name Signed-off-by: Ajay Bura --- .../molecules/room-members/RoomMembers.jsx | 23 +-------- src/app/organisms/navigation/Directs.jsx | 28 +++++++++-- src/app/organisms/navigation/Home.jsx | 40 +++++++++------- src/app/organisms/navigation/common.js | 30 ------------ src/app/organisms/room/PeopleDrawer.jsx | 23 +-------- .../shortcut-spaces/ShortcutSpaces.jsx | 4 +- src/util/sort.js | 47 +++++++++++++++++++ 7 files changed, 100 insertions(+), 95 deletions(-) delete mode 100644 src/app/organisms/navigation/common.js create mode 100644 src/util/sort.js diff --git a/src/app/molecules/room-members/RoomMembers.jsx b/src/app/molecules/room-members/RoomMembers.jsx index ac004f46..f931f9dd 100644 --- a/src/app/molecules/room-members/RoomMembers.jsx +++ b/src/app/molecules/room-members/RoomMembers.jsx @@ -9,6 +9,7 @@ import colorMXID from '../../../util/colorMXID'; import { openProfileViewer } from '../../../client/action/navigation'; import { getUsernameOfRoomMember, getPowerLabel } from '../../../util/matrixUtil'; import AsyncSearch from '../../../util/AsyncSearch'; +import { memberByAtoZ, memberByPowerLevel } from '../../../util/sort'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -19,26 +20,6 @@ import PeopleSelector from '../people-selector/PeopleSelector'; const PER_PAGE_MEMBER = 50; -function AtoZ(m1, m2) { - const aName = m1.name; - const bName = m2.name; - - if (aName.toLowerCase() < bName.toLowerCase()) { - return -1; - } - if (aName.toLowerCase() > bName.toLowerCase()) { - return 1; - } - return 0; -} -function sortByPowerLevel(m1, m2) { - const pl1 = m1.powerLevel; - const pl2 = m2.powerLevel; - - if (pl1 > pl2) return -1; - if (pl1 < pl2) return 1; - return 0; -} function normalizeMembers(members) { const mx = initMatrix.matrixClient; return members.map((member) => ({ @@ -65,7 +46,7 @@ function useMemberOfMembership(roomId, membership) { if (event && event?.getRoomId() !== roomId) return; const memberOfMembership = normalizeMembers( room.getMembersWithMembership(membership) - .sort(AtoZ).sort(sortByPowerLevel), + .sort(memberByAtoZ).sort(memberByPowerLevel), ); setMembers(memberOfMembership); }; diff --git a/src/app/organisms/navigation/Directs.jsx b/src/app/organisms/navigation/Directs.jsx index 61313479..c2a9798b 100644 --- a/src/app/organisms/navigation/Directs.jsx +++ b/src/app/organisms/navigation/Directs.jsx @@ -1,18 +1,38 @@ -import React, { useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import Postie from '../../../util/Postie'; +import { roomIdByActivity } from '../../../util/sort'; import RoomsCategory from './RoomsCategory'; -import { AtoZ } from './common'; - const drawerPostie = new Postie(); function Directs() { + const mx = initMatrix.matrixClient; const { roomList, notifications } = initMatrix; - const directIds = [...roomList.directs].sort(AtoZ); + const [directIds, setDirectIds] = useState([]); + + useEffect(() => setDirectIds([...roomList.directs].sort(roomIdByActivity)), []); + + useEffect(() => { + const handleTimeline = (event, room, toStartOfTimeline, removed, data) => { + if (!roomList.directs.has(room.roomId)) return; + if (!data.liveEvent) return; + if (directIds[0] === room.roomId) return; + const newDirectIds = [room.roomId]; + directIds.forEach((id) => { + if (id === room.roomId) return; + newDirectIds.push(id); + }); + setDirectIds(newDirectIds); + }; + mx.on('Room.timeline', handleTimeline); + return () => { + mx.removeListener('Room.timeline', handleTimeline); + }; + }, [directIds]); useEffect(() => { const selectorChanged = (selectedRoomId, prevSelectedRoomId) => { diff --git a/src/app/organisms/navigation/Home.jsx b/src/app/organisms/navigation/Home.jsx index 35e43a97..5e26a48b 100644 --- a/src/app/organisms/navigation/Home.jsx +++ b/src/app/organisms/navigation/Home.jsx @@ -5,11 +5,11 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import Postie from '../../../util/Postie'; +import { roomIdByActivity, roomIdByAtoZ } from '../../../util/sort'; import RoomsCategory from './RoomsCategory'; import { useCategorizedSpaces } from '../../hooks/useCategorizedSpaces'; -import { AtoZ, RoomToDM } from './common'; const drawerPostie = new Postie(); function Home({ spaceId }) { @@ -34,10 +34,6 @@ function Home({ spaceId }) { roomIds = roomList.getOrphanRooms(); } - spaceIds.sort(AtoZ); - roomIds.sort(AtoZ); - directIds.sort(AtoZ); - if (isCategorized) { categories = roomList.getCategorizedSpaces(spaceIds); categories.delete(spaceId); @@ -73,26 +69,36 @@ function Home({ spaceId }) { return ( <> { !isCategorized && spaceIds.length !== 0 && ( - + )} { roomIds.length !== 0 && ( - + )} { directIds.length !== 0 && ( - + )} - { isCategorized && [...categories].map(([catId, childIds]) => ( - - ))} + { isCategorized && [...categories].map(([catId, childIds]) => { + const rms = []; + const dms = []; + childIds.forEach((id) => { + if (directs.has(id)) dms.push(id); + else rms.push(id); + }); + rms.sort(roomIdByAtoZ); + dms.sort(roomIdByActivity); + return ( + + ); + })} ); } diff --git a/src/app/organisms/navigation/common.js b/src/app/organisms/navigation/common.js deleted file mode 100644 index 3c37e548..00000000 --- a/src/app/organisms/navigation/common.js +++ /dev/null @@ -1,30 +0,0 @@ -import initMatrix from '../../../client/initMatrix'; - -function AtoZ(aId, bId) { - let aName = initMatrix.matrixClient.getRoom(aId).name; - let bName = initMatrix.matrixClient.getRoom(bId).name; - - // remove "#" from the room name - // To ignore it in sorting - aName = aName.replaceAll('#', ''); - bName = bName.replaceAll('#', ''); - - if (aName.toLowerCase() < bName.toLowerCase()) { - return -1; - } - if (aName.toLowerCase() > bName.toLowerCase()) { - return 1; - } - return 0; -} - -const RoomToDM = (aId, bId) => { - const { directs } = initMatrix.roomList; - const aIsDm = directs.has(aId); - const bIsDm = directs.has(bId); - if (aIsDm && !bIsDm) return 1; - if (!aIsDm && bIsDm) return -1; - return 0; -}; - -export { AtoZ, RoomToDM }; diff --git a/src/app/organisms/room/PeopleDrawer.jsx b/src/app/organisms/room/PeopleDrawer.jsx index f00ff890..8f983247 100644 --- a/src/app/organisms/room/PeopleDrawer.jsx +++ b/src/app/organisms/room/PeopleDrawer.jsx @@ -9,6 +9,7 @@ import { getPowerLabel, getUsernameOfRoomMember } from '../../../util/matrixUtil import colorMXID from '../../../util/colorMXID'; import { openInviteUser, openProfileViewer } from '../../../client/action/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; +import { memberByAtoZ, memberByPowerLevel } from '../../../util/sort'; import Text from '../../atoms/text/Text'; import Header, { TitleWrapper } from '../../atoms/header/Header'; @@ -24,26 +25,6 @@ import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; -function AtoZ(m1, m2) { - const aName = m1.name; - const bName = m2.name; - - if (aName.toLowerCase() < bName.toLowerCase()) { - return -1; - } - if (aName.toLowerCase() > bName.toLowerCase()) { - return 1; - } - return 0; -} -function sortByPowerLevel(m1, m2) { - const pl1 = m1.powerLevel; - const pl2 = m2.powerLevel; - - if (pl1 > pl2) return -1; - if (pl1 < pl2) return 1; - return 0; -} function simplyfiMembers(members) { const mx = initMatrix.matrixClient; return members.map((member) => ({ @@ -111,7 +92,7 @@ function PeopleDrawer({ roomId }) { setMemberList( simplyfiMembers( getMembersWithMembership(membership) - .sort(AtoZ).sort(sortByPowerLevel), + .sort(memberByAtoZ).sort(memberByPowerLevel), ), ); }; diff --git a/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx b/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx index c379b6b9..62ec76a3 100644 --- a/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx +++ b/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx @@ -6,6 +6,7 @@ import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { createSpaceShortcut, deleteSpaceShortcut } from '../../../client/action/accountData'; import { joinRuleToIconSrc } from '../../../util/matrixUtil'; +import { roomIdByAtoZ } from '../../../util/sort'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -20,7 +21,6 @@ import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useSpaceShortcut } from '../../hooks/useSpaceShortcut'; -import { AtoZ } from '../navigation/common'; function ShortcutSpacesContent() { const mx = initMatrix.matrixClient; @@ -29,7 +29,7 @@ function ShortcutSpacesContent() { const [spaceShortcut] = useSpaceShortcut(); const spaceWithoutShortcut = [...spaces].filter( (spaceId) => !spaceShortcut.includes(spaceId), - ).sort(AtoZ); + ).sort(roomIdByAtoZ); const [process, setProcess] = useState(null); const [selected, setSelected] = useState([]); diff --git a/src/util/sort.js b/src/util/sort.js new file mode 100644 index 00000000..72ba3c43 --- /dev/null +++ b/src/util/sort.js @@ -0,0 +1,47 @@ +import initMatrix from '../client/initMatrix'; + +export function roomIdByActivity(id1, id2) { + const room1 = initMatrix.matrixClient.getRoom(id1); + const room2 = initMatrix.matrixClient.getRoom(id2); + + return room2.getLastActiveTimestamp() - room1.getLastActiveTimestamp(); +} + +export function roomIdByAtoZ(aId, bId) { + let aName = initMatrix.matrixClient.getRoom(aId).name; + let bName = initMatrix.matrixClient.getRoom(bId).name; + + // remove "#" from the room name + // To ignore it in sorting + aName = aName.replaceAll('#', ''); + bName = bName.replaceAll('#', ''); + + if (aName.toLowerCase() < bName.toLowerCase()) { + return -1; + } + if (aName.toLowerCase() > bName.toLowerCase()) { + return 1; + } + return 0; +} + +export function memberByAtoZ(m1, m2) { + const aName = m1.name; + const bName = m2.name; + + if (aName.toLowerCase() < bName.toLowerCase()) { + return -1; + } + if (aName.toLowerCase() > bName.toLowerCase()) { + return 1; + } + return 0; +} +export function memberByPowerLevel(m1, m2) { + const pl1 = m1.powerLevel; + const pl2 = m2.powerLevel; + + if (pl1 > pl2) return -1; + if (pl1 < pl2) return 1; + return 0; +} From b698982186f95e6b2f0d92408fea91980d7682f3 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Thu, 17 Mar 2022 12:49:14 +0100 Subject: [PATCH 003/824] Add recently used section to emoji board (#373) * Add recent section to emoji board * Add section to emoji board sidebar * Add emoji limit like element web has * Ignore custom emojis * Filter out invalid emojis * Update heart icon with clock Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- src/app/organisms/emoji-board/EmojiBoard.jsx | 31 +++++++++++++---- src/app/organisms/emoji-board/recent.js | 36 ++++++++++++++++++++ src/app/organisms/room/RoomViewCmdBar.jsx | 2 ++ 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/app/organisms/emoji-board/recent.js diff --git a/src/app/organisms/emoji-board/EmojiBoard.jsx b/src/app/organisms/emoji-board/EmojiBoard.jsx index 1e61abd8..864a0bf6 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.jsx +++ b/src/app/organisms/emoji-board/EmojiBoard.jsx @@ -12,6 +12,7 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; +import { addRecentEmoji, getRecentEmojis } from './recent'; import Text from '../../atoms/text/Text'; import RawIcon from '../../atoms/system-icons/RawIcon'; @@ -20,6 +21,7 @@ import Input from '../../atoms/input/Input'; import ScrollView from '../../atoms/scroll/ScrollView'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; +import RecentClockIC from '../../../../public/res/ic/outlined/recent-clock.svg'; import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import DogIC from '../../../../public/res/ic/outlined/dog.svg'; import CupIC from '../../../../public/res/ic/outlined/cup.svg'; @@ -29,10 +31,11 @@ import BulbIC from '../../../../public/res/ic/outlined/bulb.svg'; import PeaceIC from '../../../../public/res/ic/outlined/peace.svg'; import FlagIC from '../../../../public/res/ic/outlined/flag.svg'; +const ROW_EMOJIS_COUNT = 7; + const EmojiGroup = React.memo(({ name, groupEmojis }) => { function getEmojiBoard() { const emojiBoard = []; - const ROW_EMOJIS_COUNT = 7; const totalEmojis = groupEmojis.length; for (let r = 0; r < totalEmojis; r += ROW_EMOJIS_COUNT) { @@ -147,8 +150,9 @@ function EmojiBoard({ onSelect, searchRef }) { function selectEmoji(e) { if (isTargetNotEmoji(e.target)) return; - const emoji = e.target; - onSelect(getEmojiDataFromTarget(emoji)); + const emoji = getEmojiDataFromTarget(e.target); + onSelect(emoji); + if (emoji.hexcode) addRecentEmoji(emoji.unicode); } function setEmojiInfo(emoji) { @@ -188,6 +192,9 @@ function EmojiBoard({ onSelect, searchRef }) { } const [availableEmojis, setAvailableEmojis] = useState([]); + const [recentEmojis, setRecentEmojis] = useState([]); + + const recentOffset = recentEmojis.length > 0 ? 1 : 0; useEffect(() => { const updateAvailableEmoji = (selectedRoomId) => { @@ -215,6 +222,9 @@ function EmojiBoard({ onSelect, searchRef }) { const onOpen = () => { searchRef.current.value = ''; handleSearchChange(); + + // only update when board is getting opened to prevent shifting UI + setRecentEmojis(getRecentEmojis(3 * ROW_EMOJIS_COUNT)); }; navigation.on(cons.events.navigation.ROOM_SELECTED, updateAvailableEmoji); @@ -230,7 +240,7 @@ function EmojiBoard({ onSelect, searchRef }) { const $emojiContent = scrollEmojisRef.current.firstElementChild; const groupCount = $emojiContent.childElementCount; if (groupCount > emojiGroups.length) { - tabIndex += groupCount - emojiGroups.length - availableEmojis.length; + tabIndex += groupCount - emojiGroups.length - availableEmojis.length - recentOffset; } $emojiContent.children[tabIndex].scrollIntoView(); } @@ -246,6 +256,7 @@ function EmojiBoard({ onSelect, searchRef }) {
+ {recentEmojis.length > 0 && } { availableEmojis.map((pack) => (
+ {recentEmojis.length > 0 && ( + openGroup(0)} + src={RecentClockIC} + tooltip="Recent" + tooltipPlacement="right" + /> + )}
{ availableEmojis.map((pack) => { const src = initMatrix.matrixClient.mxcUrlToHttp(pack.avatar ?? pack.images[0].mxc); return ( openGroup(pack.packIndex)} + onClick={() => openGroup(recentOffset + pack.packIndex)} src={src} key={pack.packIndex} tooltip={pack.displayName} @@ -301,7 +320,7 @@ function EmojiBoard({ onSelect, searchRef }) { [7, FlagIC, 'Flags'], ].map(([indx, ico, name]) => ( openGroup(availableEmojis.length + indx)} + onClick={() => openGroup(recentOffset + availableEmojis.length + indx)} key={indx} src={ico} tooltip={name} diff --git a/src/app/organisms/emoji-board/recent.js b/src/app/organisms/emoji-board/recent.js new file mode 100644 index 00000000..d175f26c --- /dev/null +++ b/src/app/organisms/emoji-board/recent.js @@ -0,0 +1,36 @@ +import initMatrix from '../../../client/initMatrix'; +import { emojis } from './emoji'; + +const eventType = 'io.element.recent_emoji'; + +function getRecentEmojisRaw() { + return initMatrix.matrixClient.getAccountData(eventType).getContent().recent_emoji ?? []; +} + +export function getRecentEmojis(limit) { + const res = []; + getRecentEmojisRaw() + .sort((a, b) => b[1] - a[1]) + .find(([unicode]) => { + const emoji = emojis.find((e) => e.unicode === unicode); + if (emoji) return res.push(emoji) >= limit; + return false; + }); + return res; +} + +export function addRecentEmoji(unicode) { + const recent = getRecentEmojisRaw(); + const i = recent.findIndex(([u]) => u === unicode); + let entry; + if (i < 0) { + entry = [unicode, 1]; + } else { + [entry] = recent.splice(i, 1); + entry[1] += 1; + } + recent.unshift(entry); + initMatrix.matrixClient.setAccountData(eventType, { + recent_emoji: recent.slice(0, 100), + }); +} diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index 0c723196..4ccb20a4 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -21,6 +21,7 @@ import AsyncSearch from '../../../util/AsyncSearch'; import Text from '../../atoms/text/Text'; import ScrollView from '../../atoms/scroll/ScrollView'; import FollowingMembers from '../../molecules/following-members/FollowingMembers'; +import { addRecentEmoji } from '../emoji-board/recent'; const commands = [{ name: 'markdown', @@ -237,6 +238,7 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { viewEvent.emit('cmd_fired'); } if (myCmd.prefix === ':') { + if (!myCmd.result.mxc) addRecentEmoji(myCmd.result.unicode); viewEvent.emit('cmd_fired', { replace: myCmd.result.mxc ? `:${myCmd.result.shortcode}: ` : myCmd.result.unicode, }); From 13248962af133e12e37a7693b5fa23053b79eee3 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Thu, 17 Mar 2022 17:35:50 +0530 Subject: [PATCH 004/824] Update recent clock icon Signed-off-by: Ajay Bura --- public/res/ic/outlined/recent-clock.svg | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/public/res/ic/outlined/recent-clock.svg b/public/res/ic/outlined/recent-clock.svg index 70d9daa1..30b10d59 100644 --- a/public/res/ic/outlined/recent-clock.svg +++ b/public/res/ic/outlined/recent-clock.svg @@ -4,13 +4,14 @@ - - + + - - + + + From a2655ee6a551f911ff2ba180d2e2b889a7d469a6 Mon Sep 17 00:00:00 2001 From: Nitan Alexandru Marcel Date: Fri, 18 Mar 2022 03:36:48 +0000 Subject: [PATCH 005/824] Fix loading on older browsers (#397) --- src/app/molecules/space-add-existing/SpaceAddExisting.jsx | 4 ++-- src/client/state/RoomsInput.js | 4 ++-- src/util/AsyncSearch.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index f7a3120d..a9de7bdb 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -88,7 +88,7 @@ function SpaceAddExistingContent({ roomId }) { }; const handleSearch = (ev) => { - const term = ev.target.value.toLocaleLowerCase().replaceAll(' ', ''); + const term = ev.target.value.toLocaleLowerCase().replace(/\s/g, ''); if (term === '') { setSearchIds(null); return; @@ -100,7 +100,7 @@ function SpaceAddExistingContent({ roomId }) { if (!name) return false; name = name.normalize('NFKC') .toLocaleLowerCase() - .replaceAll(' ', ''); + .replace(/\s/g, ''); return name.includes(term); }); setSearchIds(searchedIds); diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 3bb36887..1e2fa192 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -97,13 +97,13 @@ function getFormattedBody(markdown) { function getReplyFormattedBody(roomId, reply) { const replyToLink = `In reply to`; const userLink = `${reply.userId}`; - const formattedReply = getFormattedBody(reply.body.replaceAll('\n', '\n> ')); + const formattedReply = getFormattedBody(reply.body.replace(/\n/g, '\n> ')); return `
${replyToLink}${userLink}
${formattedReply}
`; } function bindReplyToContent(roomId, reply, content) { const newContent = { ...content }; - newContent.body = `> <${reply.userId}> ${reply.body.replaceAll('\n', '\n> ')}`; + newContent.body = `> <${reply.userId}> ${reply.body.replace(/\n/g, '\n> ')}`; newContent.body += `\n\n${content.body}`; newContent.format = 'org.matrix.custom.html'; newContent['m.relates_to'] = content['m.relates_to'] || {}; diff --git a/src/util/AsyncSearch.js b/src/util/AsyncSearch.js index eb39f29c..d0a2130e 100644 --- a/src/util/AsyncSearch.js +++ b/src/util/AsyncSearch.js @@ -123,7 +123,7 @@ class AsyncSearch extends EventEmitter { _normalize(item) { let myItem = item.normalize(this.normalizeUnicode ? 'NFKC' : 'NFC'); if (!this.isCaseSensitive) myItem = myItem.toLocaleLowerCase(); - if (this.ignoreWhitespace) myItem = myItem.replaceAll(' ', ''); + if (this.ignoreWhitespace) myItem = myItem.replace(/\s/g, ''); return myItem; } From dc6e153b92adb8b34ace30f7974e6f8e441083b2 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Fri, 18 Mar 2022 04:37:11 +0100 Subject: [PATCH 006/824] Notification sounds (#367) * Basic notification sound support * Add settings option for notification sounds * Allow sound without desktop notifications --- public/sound/notification.ogg | Bin 0 -> 11295 bytes src/app/organisms/settings/Settings.jsx | 18 +++++++- src/client/action/settings.js | 6 +++ src/client/state/Notifications.js | 59 +++++++++++++++--------- src/client/state/cons.js | 2 + src/client/state/settings.js | 15 ++++++ webpack.common.js | 2 +- 7 files changed, 78 insertions(+), 24 deletions(-) create mode 100755 public/sound/notification.ogg diff --git a/public/sound/notification.ogg b/public/sound/notification.ogg new file mode 100755 index 0000000000000000000000000000000000000000..93b3a0144e69dc584f2e08e52e5547d6d9fa3f59 GIT binary patch literal 11295 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 Qi;41!p~6RfexMEh4-yrmW&i*H literal 0 HcmV?d00001 diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index f9cc6316..87f27660 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -7,7 +7,7 @@ import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; import { toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents, - toggleNotifications, + toggleNotifications, toggleNotificationSounds, } from '../../../client/action/settings'; import logout from '../../../client/action/logout'; import { usePermission } from '../../hooks/usePermission'; @@ -158,6 +158,16 @@ function NotificationsSection() { options={renderOptions()} content={Show notifications when new messages arrive.} /> + { toggleNotificationSounds(); updateState({}); }} + /> + )} + content={Play a sound when new messages arrive.} + />
); } @@ -200,7 +210,7 @@ function AboutSection() {
Cinny logo
- + Cinny {`v${cons.version}`} @@ -223,6 +233,10 @@ function AboutSection() { {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } The Twemoji emoji art is © Twitter, Inc and other contributors used under the terms of CC-BY 4.0. +
  • + {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } + The Material sound resources are © Google used under the terms of CC-BY 4.0. +
  • diff --git a/src/client/action/settings.js b/src/client/action/settings.js index 11923418..7b539c8d 100644 --- a/src/client/action/settings.js +++ b/src/client/action/settings.js @@ -36,3 +36,9 @@ export function toggleNotifications() { type: cons.actions.settings.TOGGLE_NOTIFICATIONS, }); } + +export function toggleNotificationSounds() { + appDispatcher.dispatch({ + type: cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS, + }); +} diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 11fd665e..7bcd9506 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -6,6 +6,8 @@ import cons from './cons'; import navigation from './navigation'; import settings from './settings'; +import NotificationSound from '../../../public/sound/notification.ogg'; + function isNotifEvent(mEvent) { const eType = mEvent.getType(); if (!cons.supportEventTypes.includes(eType)) return false; @@ -185,7 +187,7 @@ class Notifications extends EventEmitter { } async _displayPopupNoti(mEvent, room) { - if (!settings.showNotifications) return; + if (!settings.showNotifications && !settings.isNotificationSounds) return; const actions = this.matrixClient.getPushActionsForEvent(mEvent); if (!actions?.notify) return; @@ -196,28 +198,43 @@ class Notifications extends EventEmitter { await mEvent.attemptDecryption(this.matrixClient.crypto); } - let title; - if (!mEvent.sender || room.name === mEvent.sender.name) { - title = room.name; - } else if (mEvent.sender) { - title = `${mEvent.sender.name} (${room.name})`; + if (settings.showNotifications) { + let title; + if (!mEvent.sender || room.name === mEvent.sender.name) { + title = room.name; + } else if (mEvent.sender) { + title = `${mEvent.sender.name} (${room.name})`; + } + + const iconSize = 36; + const icon = await renderAvatar({ + text: mEvent.sender.name, + bgColor: cssColorMXID(mEvent.getSender()), + imageSrc: mEvent.sender?.getAvatarUrl(this.matrixClient.baseUrl, iconSize, iconSize, 'crop'), + size: iconSize, + borderRadius: 8, + scale: 8, + }); + + const noti = new window.Notification(title, { + body: mEvent.getContent().body, + icon, + silent: settings.isNotificationSounds, + }); + if (settings.isNotificationSounds) { + noti.onshow = () => this._playNotiSounds(); + } + noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); + } else { + this._playNotiSounds(); } + } - const iconSize = 36; - const icon = await renderAvatar({ - text: mEvent.sender.name, - bgColor: cssColorMXID(mEvent.getSender()), - imageSrc: mEvent.sender?.getAvatarUrl(this.matrixClient.baseUrl, iconSize, iconSize, 'crop'), - size: iconSize, - borderRadius: 8, - scale: 8, - }); - - const noti = new window.Notification(title, { - body: mEvent.getContent().body, - icon, - }); - noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); + _playNotiSounds() { + if (!this._notiAudio) { + this._notiAudio = new Audio(NotificationSound); + } + this._notiAudio.play(); } _listenEvents() { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 6ec6c27a..862bf5cf 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -67,6 +67,7 @@ const cons = { TOGGLE_MEMBERSHIP_EVENT: 'TOGGLE_MEMBERSHIP_EVENT', TOGGLE_NICKAVATAR_EVENT: 'TOGGLE_NICKAVATAR_EVENT', TOGGLE_NOTIFICATIONS: 'TOGGLE_NOTIFICATIONS', + TOGGLE_NOTIFICATION_SOUNDS: 'TOGGLE_NOTIFICATION_SOUNDS', }, }, events: { @@ -135,6 +136,7 @@ const cons = { MEMBERSHIP_EVENTS_TOGGLED: 'MEMBERSHIP_EVENTS_TOGGLED', NICKAVATAR_EVENTS_TOGGLED: 'NICKAVATAR_EVENTS_TOGGLED', NOTIFICATIONS_TOGGLED: 'NOTIFICATIONS_TOGGLED', + NOTIFICATION_SOUNDS_TOGGLED: 'NOTIFICATION_SOUNDS_TOGGLED', }, }, }; diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 25d0b2d5..0f476ef8 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -29,6 +29,7 @@ class Settings extends EventEmitter { this.hideMembershipEvents = this.getHideMembershipEvents(); this.hideNickAvatarEvents = this.getHideNickAvatarEvents(); this._showNotifications = this.getShowNotifications(); + this.isNotificationSounds = this.getIsNotificationSounds(); this.isTouchScreenDevice = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); } @@ -125,6 +126,15 @@ class Settings extends EventEmitter { return settings.showNotifications; } + getIsNotificationSounds() { + if (typeof this.isNotificationSounds === 'boolean') return this.isNotificationSounds; + + const settings = getSettings(); + if (settings === null) return true; + if (typeof settings.isNotificationSounds === 'undefined') return true; + return settings.isNotificationSounds; + } + setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { @@ -164,6 +174,11 @@ class Settings extends EventEmitter { setSettings('showNotifications', this._showNotifications); this.emit(cons.events.settings.NOTIFICATIONS_TOGGLED, this._showNotifications); }, + [cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS]: () => { + this.isNotificationSounds = !this.isNotificationSounds; + setSettings('isNotificationSounds', this.isNotificationSounds); + this.emit(cons.events.settings.NOTIFICATION_SOUNDS_TOGGLED, this.isNotificationSounds); + }, }; actions[action.type]?.(); diff --git a/webpack.common.js b/webpack.common.js index dd45a067..9ff58daf 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -39,7 +39,7 @@ module.exports = { use: ['html-loader'], }, { - test: /\.(png|jpe?g|gif|otf|ttf|woff|woff2)$/, + test: /\.(png|jpe?g|gif|otf|ttf|woff|woff2|ogg)$/, type: 'asset/resource', }, { From 8330f4fba90fea12cb02e912dc9d613b97037c42 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 18 Mar 2022 09:09:14 +0530 Subject: [PATCH 007/824] Improve jump to unread button (#396) * Improve jump to unread button Signed-off-by: Ajay Bura * Remove unused cod Signed-off-by: Ajay Bura * Fix mark as read not hidding jump to unread btn Signed-off-by: Ajay Bura * Add notification mark as read action Signed-off-by: Ajay Bura * Add esc as hotkey to mark room as read Signed-off-by: Ajay Bura * Add message icons Signed-off-by: Ajay Bura * Change jump to unread icon Signed-off-by: Ajay Bura --- public/res/ic/outlined/message-unread.svg | 15 ++++++++++ public/res/ic/outlined/message.svg | 12 ++++++++ .../molecules/room-options/RoomOptions.jsx | 5 ++-- src/app/organisms/room/Room.jsx | 2 +- src/app/organisms/room/RoomViewContent.jsx | 13 +++++---- src/app/organisms/room/RoomViewFloating.jsx | 24 ++++++++-------- src/app/organisms/room/RoomViewFloating.scss | 28 +++++++++---------- src/client/action/notifications.js | 26 +++++++++++++++++ src/client/event/hotkeys.js | 15 ++++++++-- src/client/state/RoomTimeline.js | 22 +-------------- src/client/state/cons.js | 1 - 11 files changed, 101 insertions(+), 62 deletions(-) create mode 100644 public/res/ic/outlined/message-unread.svg create mode 100644 public/res/ic/outlined/message.svg create mode 100644 src/client/action/notifications.js diff --git a/public/res/ic/outlined/message-unread.svg b/public/res/ic/outlined/message-unread.svg new file mode 100644 index 00000000..fc5e9ff0 --- /dev/null +++ b/public/res/ic/outlined/message-unread.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/public/res/ic/outlined/message.svg b/public/res/ic/outlined/message.svg new file mode 100644 index 00000000..d36e9a30 --- /dev/null +++ b/public/res/ic/outlined/message.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/app/molecules/room-options/RoomOptions.jsx b/src/app/molecules/room-options/RoomOptions.jsx index 734f93bd..85b2b5a5 100644 --- a/src/app/molecules/room-options/RoomOptions.jsx +++ b/src/app/molecules/room-options/RoomOptions.jsx @@ -6,6 +6,7 @@ import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import { openInviteUser } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; +import { markAsRead } from '../../../client/action/notifications'; import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; import RoomNotification from '../room-notification/RoomNotification'; @@ -20,10 +21,8 @@ function RoomOptions({ roomId, afterOptionSelect }) { const canInvite = room?.canInvite(mx.getUserId()); const handleMarkAsRead = () => { + markAsRead(roomId); afterOptionSelect(); - if (!room) return; - const events = room.getLiveTimeline().getEvents(); - mx.sendReadReceipt(events[events.length - 1]); }; const handleInviteClick = () => { diff --git a/src/app/organisms/room/Room.jsx b/src/app/organisms/room/Room.jsx index 015fb689..7c199bea 100644 --- a/src/app/organisms/room/Room.jsx +++ b/src/app/organisms/room/Room.jsx @@ -26,7 +26,7 @@ function Room() { roomInfo.roomTimeline?.removeInternalListeners(); if (mx.getRoom(rId)) { setRoomInfo({ - roomTimeline: new RoomTimeline(rId, initMatrix.notifications), + roomTimeline: new RoomTimeline(rId), eventId: eId ?? null, }); } else { diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index e3f2aba4..dd77e989 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -14,6 +14,7 @@ import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { openProfileViewer } from '../../../client/action/navigation'; import { diffMinutes, isInSameDay, Throttle } from '../../../util/common'; +import { markAsRead } from '../../../client/action/notifications'; import Divider from '../../atoms/divider/Divider'; import ScrollView from '../../atoms/scroll/ScrollView'; @@ -253,7 +254,7 @@ function useHandleScroll( ); roomTimeline.emit(cons.events.roomTimeline.AT_BOTTOM, isAtBottom); if (isAtBottom && readUptoEvtStore.getItem()) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); } }); autoPaginate(); @@ -263,7 +264,7 @@ function useHandleScroll( const timelineScroll = timelineScrollRef.current; const limit = eventLimitRef.current; if (readUptoEvtStore.getItem()) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); } if (roomTimeline.isServingLiveTimeline()) { limit.setFrom(roomTimeline.timeline.length - limit.maxEvents); @@ -286,7 +287,7 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event const limit = eventLimitRef.current; const trySendReadReceipt = (event) => { if (myUserId === event.getSender()) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); return; } const readUpToEvent = readUptoEvtStore.getItem(); @@ -295,7 +296,7 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event if (isUnread === false) { if (document.visibilityState === 'visible' && timelineScroll.bottom < 16) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); } else { readUptoEvtStore.setItem(roomTimeline.findEventByIdInTimelineSet(readUpToId)); } @@ -305,7 +306,7 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event const { timeline } = roomTimeline; const unreadMsgIsLast = timeline[timeline.length - 2].getId() === readUpToId; if (unreadMsgIsLast) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); } }; @@ -399,7 +400,7 @@ function RoomViewContent({ eventId, roomTimeline }) { if (timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward()) { const readUpToId = roomTimeline.getReadUpToEventId(); if (readUptoEvtStore.getItem()?.getId() === readUpToId || readUpToId === null) { - requestAnimationFrame(() => roomTimeline.markAllAsRead()); + requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); } } jumpToItemIndex = -1; diff --git a/src/app/organisms/room/RoomViewFloating.jsx b/src/app/organisms/room/RoomViewFloating.jsx index 1bec52d2..e65e854f 100644 --- a/src/app/organisms/room/RoomViewFloating.jsx +++ b/src/app/organisms/room/RoomViewFloating.jsx @@ -5,11 +5,13 @@ import './RoomViewFloating.scss'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; +import { markAsRead } from '../../../client/action/notifications'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; import IconButton from '../../atoms/button/IconButton'; +import MessageUnreadIC from '../../../../public/res/ic/outlined/message-unread.svg'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; @@ -23,7 +25,7 @@ function useJumpToEvent(roomTimeline) { }; const cancelJumpToEvent = () => { - roomTimeline.markAllAsRead(); + markAsRead(roomTimeline.roomId); setEventId(null); }; @@ -36,11 +38,12 @@ function useJumpToEvent(roomTimeline) { setEventId(readEventId); } + const { notifications } = initMatrix; const handleMarkAsRead = () => setEventId(null); - roomTimeline.on(cons.events.roomTimeline.MARKED_AS_READ, handleMarkAsRead); + notifications.on(cons.events.notifications.FULL_READ, handleMarkAsRead); return () => { - roomTimeline.removeListener(cons.events.roomTimeline.MARKED_AS_READ, handleMarkAsRead); + notifications.removeListener(cons.events.notifications.FULL_READ, handleMarkAsRead); setEventId(null); }; }, [roomTimeline]); @@ -96,17 +99,12 @@ function RoomViewFloating({ return ( <>
    - + -
    0 ? ' room-view__typing--open' : ''}`}>
    diff --git a/src/app/organisms/room/RoomViewFloating.scss b/src/app/organisms/room/RoomViewFloating.scss index 13de15ca..263025e1 100644 --- a/src/app/organisms/room/RoomViewFloating.scss +++ b/src/app/organisms/room/RoomViewFloating.scss @@ -90,33 +90,33 @@ &__unread { position: absolute; - top: var(--sp-extra-tight); - @include dir.prop(right, var(--sp-extra-tight), unset); - @include dir.prop(left, unset, var(--sp-extra-tight)); + top: 0; + @include dir.prop(left, var(--sp-normal), unset); + @include dir.prop(right, unset, var(--sp-normal)); z-index: 999; display: none; + width: calc(100% - var(--sp-extra-loose)); background-color: var(--bg-surface); - border-radius: var(--bo-radius); + border-radius: 0 0 var(--bo-radius) var(--bo-radius); box-shadow: var(--bs-primary-border); overflow: hidden; &--open { display: flex; } - - & .ic-btn { - padding: 6px var(--sp-extra-tight); - border-radius: 0; - } & .btn-primary { - @extend .cp-fx__item-one; - @include dir.side(margin, 0, 1px); + justify-content: flex-start; border-radius: 0; - padding: 0 var(--sp-tight); - &:focus { - background-color: var(--bg-primary-hover); + padding: 2px var(--sp-tight); + & .ic-raw { + width: 16px; + height: 16px; } } + & .btn-primary:first-child { + @extend .cp-fx__item-one; + padding: var(--sp-ultra-tight) var(--sp-extra-tight); + } } } \ No newline at end of file diff --git a/src/client/action/notifications.js b/src/client/action/notifications.js new file mode 100644 index 00000000..a869632a --- /dev/null +++ b/src/client/action/notifications.js @@ -0,0 +1,26 @@ +import initMatrix from '../initMatrix'; + +// eslint-disable-next-line import/prefer-default-export +export async function markAsRead(roomId) { + const mx = initMatrix.matrixClient; + const room = mx.getRoom(roomId); + if (!room) return; + initMatrix.notifications.deleteNoti(roomId); + + const timeline = room.getLiveTimeline().getEvents(); + const readEventId = room.getEventReadUpTo(mx.getUserId()); + + const getLatestValidEvent = () => { + for (let i = timeline.length - 1; i >= 0; i -= 1) { + const latestEvent = timeline[i]; + if (latestEvent.getId() === readEventId) return null; + if (!latestEvent.isSending()) return latestEvent; + } + return null; + }; + if (timeline.length === 0) return; + const latestEvent = getLatestValidEvent(); + if (latestEvent === null) return; + + await mx.sendReadReceipt(latestEvent); +} diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 41b6fc8f..11f72bea 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -1,5 +1,6 @@ import { openSearch, toggleRoomSettings } from '../action/navigation'; import navigation from '../state/navigation'; +import { markAsRead } from '../action/notifications'; function listenKeyboard(event) { // Ctrl/Cmd + @@ -18,11 +19,19 @@ function listenKeyboard(event) { return; } - // esc - close room settings panel - if (event.keyCode === 27 && navigation.isRoomSettings) { - toggleRoomSettings(); + // esc + if (event.keyCode === 27) { + if (navigation.isRoomSettings) { + toggleRoomSettings(); + return; + } + if (navigation.selectedRoomId) { + markAsRead(navigation.selectedRoomId); + return; + } } + // Don't allow these keys to type/focus message field if ((event.keyCode !== 8 && event.keyCode < 48) || (event.keyCode >= 91 && event.keyCode <= 93) || (event.keyCode >= 112 && event.keyCode <= 183)) { diff --git a/src/client/state/RoomTimeline.js b/src/client/state/RoomTimeline.js index bccb197d..57d91c14 100644 --- a/src/client/state/RoomTimeline.js +++ b/src/client/state/RoomTimeline.js @@ -77,7 +77,7 @@ function isTimelineLinked(tm1, tm2) { } class RoomTimeline extends EventEmitter { - constructor(roomId, notifications) { + constructor(roomId) { super(); // These are local timelines this.timeline = []; @@ -88,7 +88,6 @@ class RoomTimeline extends EventEmitter { this.matrixClient = initMatrix.matrixClient; this.roomId = roomId; this.room = this.matrixClient.getRoom(roomId); - this.notifications = notifications; this.liveTimeline = this.room.getLiveTimeline(); this.activeTimeline = this.liveTimeline; @@ -228,25 +227,6 @@ class RoomTimeline extends EventEmitter { return Promise.allSettled(decryptionPromises); } - markAllAsRead() { - const readEventId = this.getReadUpToEventId(); - const getLatestValidEvent = () => { - for (let i = this.timeline.length - 1; i >= 0; i -= 1) { - const latestEvent = this.timeline[i]; - if (latestEvent.getId() === readEventId) return null; - if (!latestEvent.isSending()) return latestEvent; - } - return null; - }; - this.notifications.deleteNoti(this.roomId); - if (this.timeline.length === 0) return; - const latestEvent = getLatestValidEvent(); - if (latestEvent === null) return; - if (readEventId === latestEvent.getId()) return; - this.matrixClient.sendReadReceipt(latestEvent); - this.emit(cons.events.roomTimeline.MARKED_AS_READ, latestEvent); - } - hasEventInTimeline(eventId, timeline = this.activeTimeline) { const timelineSet = this.getUnfilteredTimelineSet(); const eventTimeline = timelineSet.getTimelineForEvent(eventId); diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 862bf5cf..f7ffc8f9 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -116,7 +116,6 @@ const cons = { PAGINATED: 'PAGINATED', TYPING_MEMBERS_UPDATED: 'TYPING_MEMBERS_UPDATED', LIVE_RECEIPT: 'LIVE_RECEIPT', - MARKED_AS_READ: 'MARKED_AS_READ', EVENT_REDACTED: 'EVENT_REDACTED', AT_BOTTOM: 'AT_BOTTOM', SCROLL_TO_LIVE: 'SCROLL_TO_LIVE', From 6010b4c2521caf03d17c0e9cf1a726aafea00bfa Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 18 Mar 2022 09:22:16 +0530 Subject: [PATCH 008/824] Fix cyclic dependency in initMatrix Signed-off-by: Ajay Bura --- src/app/templates/client/Client.jsx | 5 +++++ src/client/initMatrix.js | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index b322360b..1342db55 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -1,6 +1,9 @@ import React, { useState, useEffect } from 'react'; import './Client.scss'; +import { initHotkeys } from '../../../client/event/hotkeys'; +import { initRoomListListener } from '../../../client/event/roomList'; + import Text from '../../atoms/text/Text'; import Spinner from '../../atoms/spinner/Spinner'; import Navigation from '../../organisms/navigation/Navigation'; @@ -38,6 +41,8 @@ function Client() { }, 15000); initMatrix.once('init_loading_finished', () => { clearInterval(iId); + initHotkeys(); + initRoomListListener(initMatrix.roomList); changeLoading(false); }); initMatrix.init(); diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index bcf5c284..f6fc9eb2 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -7,8 +7,6 @@ import RoomList from './state/RoomList'; import AccountData from './state/AccountData'; import RoomsInput from './state/RoomsInput'; import Notifications from './state/Notifications'; -import { initHotkeys } from './event/hotkeys'; -import { initRoomListListener } from './event/roomList'; global.Olm = require('@matrix-org/olm'); @@ -66,8 +64,6 @@ class InitMatrix extends EventEmitter { this.accountData = new AccountData(this.roomList); this.roomsInput = new RoomsInput(this.matrixClient); this.notifications = new Notifications(this.roomList); - initHotkeys(); - initRoomListListener(this.roomList); this.emit('init_loading_finished'); } }, From a7034d635153f455bd0d71590097e08ec17e858f Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 18 Mar 2022 11:37:31 +0530 Subject: [PATCH 009/824] Improve jump to bottom btn Signed-off-by: Ajay Bura --- src/app/organisms/room/RoomViewFloating.jsx | 11 ++--- src/app/organisms/room/RoomViewFloating.scss | 48 +++++++++++--------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/app/organisms/room/RoomViewFloating.jsx b/src/app/organisms/room/RoomViewFloating.jsx index e65e854f..d027aff2 100644 --- a/src/app/organisms/room/RoomViewFloating.jsx +++ b/src/app/organisms/room/RoomViewFloating.jsx @@ -9,10 +9,9 @@ import { markAsRead } from '../../../client/action/notifications'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; +import MessageIC from '../../../../public/res/ic/outlined/message.svg'; import MessageUnreadIC from '../../../../public/res/ic/outlined/message-unread.svg'; -import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; import { getUsersActionJsx } from './common'; @@ -111,11 +110,9 @@ function RoomViewFloating({ {getUsersActionJsx(roomId, [...typingMembers], 'typing...')}
    - +
    ); diff --git a/src/app/organisms/room/RoomViewFloating.scss b/src/app/organisms/room/RoomViewFloating.scss index 263025e1..2acf6740 100644 --- a/src/app/organisms/room/RoomViewFloating.scss +++ b/src/app/organisms/room/RoomViewFloating.scss @@ -72,51 +72,55 @@ } } + &__STB, + &__unread { + opacity: 0.9; + overflow: hidden; + background-color: var(--bg-surface-low); + border-radius: var(--bo-radius); + + & button { + justify-content: flex-start; + border-radius: 0; + box-shadow: none; + padding: 6px var(--sp-tight); + & .ic-raw { + width: 16px; + height: 16px; + } + } + } + &__STB { position: absolute; - @include dir.prop(right, var(--sp-normal), unset); - @include dir.prop(left, unset, var(--sp-normal)); + @include dir.prop(left, 50%, unset); + @include dir.prop(right, unset, 50%); bottom: 0; - border-radius: var(--bo-radius); box-shadow: var(--bs-surface-border); - background-color: var(--bg-surface-low); transition: transform 200ms ease-in-out; - transform: translateY(100%) scale(0); + transform: translate(-50%, 100%); &--open { - transform: translateY(-28px) scale(1); + transform: translate(-50%, -28px); } } &__unread { position: absolute; - top: 0; + top: var(--sp-extra-tight); @include dir.prop(left, var(--sp-normal), unset); @include dir.prop(right, unset, var(--sp-normal)); z-index: 999; display: none; width: calc(100% - var(--sp-extra-loose)); - background-color: var(--bg-surface); - border-radius: 0 0 var(--bo-radius) var(--bo-radius); - box-shadow: var(--bs-primary-border); - overflow: hidden; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 20%); &--open { display: flex; } - & .btn-primary { - justify-content: flex-start; - border-radius: 0; - padding: 2px var(--sp-tight); - & .ic-raw { - width: 16px; - height: 16px; - } - } - & .btn-primary:first-child { + & button:first-child { @extend .cp-fx__item-one; - padding: var(--sp-ultra-tight) var(--sp-extra-tight); } } } \ No newline at end of file From ae71a99aa4d3c447b06f7f752ff6e2c73c76064a Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:55:38 +0530 Subject: [PATCH 010/824] Sort search results by activity (#399) * Sort search result by activity Signed-off-by: Ajay Bura * Optimize generateResults function codes Signed-off-by: Ajay Bura --- src/app/organisms/search/Search.jsx | 63 ++++++++++++++--------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index 551b729e..1eddbf67 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -7,6 +7,7 @@ import navigation from '../../../client/state/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; import { selectRoom, selectTab } from '../../../client/action/navigation'; import { joinRuleToIconSrc } from '../../../util/matrixUtil'; +import { roomIdByActivity } from '../../../util/sort'; import Text from '../../atoms/text/Text'; import RawIcon from '../../atoms/system-icons/RawIcon'; @@ -47,27 +48,24 @@ function useVisiblityToggle(setResult) { return [isOpen, requestClose]; } -function mapRoomIds(roomIds, type) { +function mapRoomIds(roomIds) { const mx = initMatrix.matrixClient; const { directs, roomIdToParents } = initMatrix.roomList; return roomIds.map((roomId) => { - let roomType = type; - - if (!roomType) { - roomType = directs.has(roomId) ? 'direct' : 'room'; - } - const room = mx.getRoom(roomId); const parentSet = roomIdToParents.get(roomId); - const parentNames = parentSet - ? [...parentSet].map((parentId) => mx.getRoom(parentId).name) - : undefined; + const parentNames = parentSet ? [] : undefined; + parentSet?.forEach((parentId) => parentNames.push(mx.getRoom(parentId).name)); const parents = parentNames ? parentNames.join(', ') : null; + let type = 'room'; + if (room.isSpaceRoom()) type = 'space'; + else if (directs.has(roomId)) type = 'direct'; + return ({ - type: roomType, + type, name: room.name, parents, roomId, @@ -93,34 +91,32 @@ function Search() { const generateResults = (term) => { const prefix = term.match(/^[#@*]/)?.[0]; - if (term.length === 1) { - const { roomList } = initMatrix; - const spaces = mapRoomIds([...roomList.spaces], 'space').reverse(); - const rooms = mapRoomIds([...roomList.rooms], 'room').reverse(); - const directs = mapRoomIds([...roomList.directs], 'direct').reverse(); - - if (prefix === '*') { - asyncSearch.setup(spaces, { keys: 'name', isContain: true, limit: 20 }); - handleSearchResults(spaces, '*'); - } else if (prefix === '#') { - asyncSearch.setup(rooms, { keys: 'name', isContain: true, limit: 20 }); - handleSearchResults(rooms, '#'); - } else if (prefix === '@') { - asyncSearch.setup(directs, { keys: 'name', isContain: true, limit: 20 }); - handleSearchResults(directs, '@'); - } else { - const dataList = spaces.concat(rooms, directs); - asyncSearch.setup(dataList, { keys: 'name', isContain: true, limit: 20 }); - asyncSearch.search(term); - } - } else { + if (term.length > 1) { asyncSearch.search(prefix ? term.slice(1) : term); + return; } + + const { spaces, rooms, directs } = initMatrix.roomList; + let ids = null; + + if (prefix) { + if (prefix === '#') ids = [...rooms]; + else if (prefix === '@') ids = [...directs]; + else ids = [...spaces]; + } else { + ids = [...rooms].concat([...directs], [...spaces]); + } + + ids.sort(roomIdByActivity); + const mappedIds = mapRoomIds(ids); + asyncSearch.setup(mappedIds, { keys: 'name', isContain: true, limit: 20 }); + if (prefix) handleSearchResults(mappedIds, prefix); + else asyncSearch.search(term); }; const loadRecentRooms = () => { const { recentRooms } = navigation; - handleSearchResults(mapRoomIds(recentRooms).reverse(), ''); + handleSearchResults(mapRoomIds(recentRooms).reverse()); }; const handleAfterOpen = () => { @@ -154,6 +150,7 @@ function Search() { else { searchRef.current.value = ''; searchRef.current.focus(); + loadRecentRooms(); } }; From 36da3d3cba5109f6962de065a0201ff534940a6d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:55:57 +0530 Subject: [PATCH 011/824] Add sound on incoming invites (#400) * Add invite sound Signed-off-by: Ajay Bura * Add credits Signed-off-by: Ajay Bura * Change invite sound to google material --- public/sound/invite.ogg | Bin 0 -> 32667 bytes src/client/state/Notifications.js | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100755 public/sound/invite.ogg diff --git a/public/sound/invite.ogg b/public/sound/invite.ogg new file mode 100755 index 0000000000000000000000000000000000000000..4a00af61094abcc5b4d2f0a652fa202ec014791a GIT binary patch literal 32667 zcmb@tbzD@>_dh{A=2Ffiim_D zA|ScnyZCy&Kk<7!zTba-^SIo-bMMTVIcLuEoHK#Cot-v-gMU)O>ybz(eBtrOpkInji(d#0o`-2>;1f+&|5ZeHy!1Rn-3wyH)V+x^z zZlMfrJxs+JZbY0VIZuiBdXPaXd}{^qYNBf;`B9?l?5~Gqh`C>nDyi^J=vh~^;G6on z4~nd2{Bt8b=K~4#MFyYV1|dU$B_GC7l;Q@F`pXs)pdmKF-B@bHYU;jfhJg_l^gQEpy~uyOj4uBo8Mzauc@Y4E zieOWYLt4@Q=elQ@Wc&ZVQ1(5X00qhN!$XD-4_V~2SU$LMT{xF;4}iuLrN!0dCUDnX z;Dft3blrU<`!PXf;I|6-zk`4sb^uVk3|$WyK0?ya;vRDo)OVMda#x*#M1hsa|2;i9 z*B6Kprp$Xuj%Wh@7|V09pdqq!xdeAe{6f9g_Z8_Rz~PCGBd z9SBV|T&lZ&d6XD|1o}vh_P-AR0PQg(%I9`OQ;T~-OK?JqTUSTo|Be{w>x6*nm;fZ$ zL;&akxKsX(A(%H#i%f|`-l2#60>||gj$rEi*`S^jD-|oXBI^ha{JJ-kd_^R2Cf2

    rRry$lt8?-z?NOg{Y-f=eU*)=e$iaI-ZG+5E3;oT*{R4IBW5RmPIS^EN2urfkzHh^Ho0wClt3 zZczP`rO};8DlOX7(lz|nR6}BTQCGJ-ss0|~aM ztceFpaaSCw4hcEV#xU!8M4o+G*+x?pm-;#Gpw|%L@H~gIvW;FIfq`=h6CS4YY2SRX zCD$Q7#nq`*wRKJPldy5b|45KsX1ER6JUZ#?^tu-<^9gCMqW@JWG;bJhSBj>J5(le* zk|GCdf`XDlc|nq*VtL&pA4e%yq+|2OidU!aw-R)3g-g!N1S`k*Hr+X z#%M)~tTG77b983}#azm#wjPwWr_hSvC183z$=O8*8BZm8>wXaej>1S@2nPvT-5Ks= zGLRXBY%>xvh>(Aef~=zTpvZLqO4?xn*)AVDKq&u|h}4h}6u zCbD`S!a+_Dn}wu}%|g<~R)c~PI99Am z67~c33Cgn5|JR3L4W+gJd?3h87!|qjw+2*>qwwDvP&F;3e@J2Ju_kK$Ly9Q@p~P8= zeV3a+2^A@bQzC>2C=sv*Q_3h77Eoe8Xee>yLjGNmBN0pV+|wr{KvKazu|n09SQB+* z&Wk|r60|ru5}^;d!CEqeg$X)ZiltCF=m{e5PhG4;6SU4h$go2VK~xH{?;vI%@oPaH z`nLv0AvB&4F42IQle<%mzd{^-mzqxn^(^ESF3^IsUxxjhrl6AMIZa2pe5fjx`v2cI zSojc;3te-$4fCDQiRK7zZqwtsGbNKwP8w{W!y8vK% zRX1v1JLWf(#y5WtYQO%d^PWvlp-%r-*&1^45^@iZ(TGem}ATc1GJAGPCY?9MFb-+UeG|n$p_VCctfsN2pwjB@7rxraY>Ynth|DfikgO&4&)=CgaDEN#L*zHrKO5QkwufoAYv)v zDC4OTsG%qZ1x;qKWl#VP|2yTy=Hc+aGg%ZX_9Fn;nJo4zs~#a>iFC$re!);EC@QO~ zYAZ$g8DSVPk~#+3YPwpXf%hEEFsv9dalK?#i}k(3n<4Mp?ylG1+O$Yv1~k0WBhu2+ zW*yTtH776kmUKcHnL0`Bh!|U44c`_sZtd4Db8*SGEk>N2(uG>G_lkrjMJR#v{Ov!N z=^{jNsPSIj>MbdV$xWMBh$mnOLa(gUG{@xe^S|~*z~FwAeSMaAa+)#8lw^0=b#wEi zsRTnQbaY`S{&xpiP2RNeCcHfLFHTavy?xdl{H81iK|`;}J#LdI9+NoRAvhibt06(+ z+t~2tcgBI>a_6WZ6>+U{wu#Z87#X53c9ZETXhM>5?Ywn83L;7_9b-R}5IAB&iBm^6 z0j2+p!>OpoAQPnB{b6$e8>LuJ4&|OB+_de_kCNSm%_7$ILyT&urj>WD<-gKlRu>zu zh+KOlnn^}}8=z{RsIj3^5y8cB@)y_T3=?2AS5wps>s@tYV`E{sBo-(FnHcOKAg7ZX zIBCgJ!jh9ivqO{F1wOCx%`gO)SphWj2MvT0J2Hk%!15P?7Fq)jAflhrM=P>iqXURw z%B0WVzJ9!d`{+}>q%oVItl+IwHqmFIYWz3HL`c(AC;GRV64m1H@+regyflb}*h)3@ z<16ygIMd2d^2Tr#uoT&e=)Q)oDuw*`_ZJ|?gLf&DZNB`9zbP}+tp`?CsAWtYq@e*wDu95YD#@wpwd67tD5)TK+%A@>`RLJG3LuHU_lt)e9bt!_ z8Vb9j+0re%`c>^6{g(kg#l8FLzt4%0V@uhk4#}1}tof)7g(W&$#*se3k2XGwx zoHDikvvaXV@{7IyEhfYCdN_xtU;5mY>%_FlP32A0P`Tlmm@{NY=no@|fKua0Sp!X( zZmvd2*+NuBb-SUOi(y#buS-LgW`bm)bDuqb?|6N7+32LZB8Gorz*SJvq)wdEvY+>}B#Xgs80 zzb*>i-p7?8y~|45DH#B7Ob9%(D&nUd7wQlmmNnK28xDYt7|CS85d?T>_7|30+P~+= zxY@x^buoT&;GL9Y6v9rVWb=*|u3~+gh$2$rllEDTN8tW_>Bho}!pDPx)w2wn#-s4% z!kEMw9*W1DF_=dvP0)b*QiCBd6An%~{{Ryos@&K9m#dT_)uydg*EQ0Yc|oMahGd}Z z(2(ReYKBJ~6YdpmvkZQ%tk0MhXHqAAkvtj3>0T8)S~uad1)9MFSEkqwE!N1w76 zNI6W8WV-z;!WSw;T%}){EatO6cNC=J;E6jqoWvuDfN`1#ojHS&+`!N==Szs&kBHvz z*~JelE8|&==6xFD;1sw>?<_K)UGZ`D+mgR~L{whPQWEh_9lz%D#h^)I=rX3tEa{!M6C zgpJ8pEvD7?CdQe#v2N}67Yyq-Q?yoS`Q={e9@8eNNGVeFgSr+4Ta#2%gyw)v= z-%2f8bc%tTN|Sx;Fz^rV_^LeWdeqJowQWlo`zF-|^b22_KaP2=(U}?cy!p91!xMiD zT2yDlsiv=2~4TKYRG!uUsJ1WDS1p=gy0fVPjZE)DgT?&RtQM{4V&h z(E|+@QtFh{r@YtVVvzUKI>dUJma3aRD@0tuTvZ~`I zib%q}Yr&^D@E{vaF|-Z4qY_A?QRg_kP5Cy{Zh4&Nv8oY4d-x3!7O)}(VI3aZ?wff5 zXIQqj212S@+QqK3c+7juk$r^P$*F=#6W+ldcepZ z`=P8?)(t+OJ0;TccnO%C3V6A6k>SxTtGb-3s^ zxol+I1TSE#Avl$64$fYiC@3M<5nA=wC2@ojOUS?jpFckIt!^=HKHeEMgscewG*N`< zy2RSc=i}=N+NNk(zN)^zQ6WOq_1-*}#lu0eD0`2d-+>|1kBbk$6*VhIE3ojqO6RXC_WEw2h1C}*Hj=NL3MKWNwAoWep^&F5dmMXrP9#cRex#-P?YgzG z+qJFK*0q@2l-jI7U)bLm^gH2U|LU@Dn|j&t$ir=OJ}>{{>D$+U%JaLZ;N+2B8!gcP zdJC+>QRC|IbdYRN*&s5&=%x+~4ht?hkFrW8tBQ+r`Y11Qtk{Xt7G4c~xXZfl@MB!w zzuvsb`J29I+rrB`S#EJGzHyefGcHK`U@Gae$U-|P)~7{rSnoycyDVC(AX*sLRI3YI zJn`;m69y_%L53N$KTWAyG^|ny6-4LIp1g$|twwCz$C`4Vi-i{`^1p&LgH-?FZny3_8hl2pCZe}W6hH-}J?V=slTL3E!kWXD+M z!Zj*-E;1OBLNCz2j>r5;oQ6++h4GF8U?NR?=CE`laHmH^wwfX+W9p>s$8v9k>BY)M z#@}a-Cv9J0@5pcuP0=Jvg=_7|{Yx1qRb`pvc;K{WxftYpYH}(Q)8pNF_ioK+2ZDqJ8ORB;_8+vAIugofQ?iymqG5#s zs#aSkn7X0LNbg6T+H?dw@wY#Dqo`y*c@>|p+FcFIl|(`Xjx)IoBc8&;su z9~#XX)6bO-q_(`RS0U}GxDRY3o?|d+w-rP^AIdyT>*T@&{-}NMT~eF9VZiw+XR%U- z1UXWCDULhms{)v|QzSKAo&+<;EHJ<_ahJEPQYvWJLKP>xhzinDie!8p5#=+?tet+G zBWa|8V;lpo7Y54G7BjRwu~P0(VybPFM>hRb*Ko4|Mq8)lWW3EW6zDED-Fp-X*M9pA zFo2dOroi@xQS+}~f1Ns!f+EW$PMD6M1V$+DMqq27i2Rs?z2UFG7fb8Wl5Oq`R@Aa5 zv0ZBp7gEHJFQVfx7YN%A8XJ1tOGYdzTw4IJdST-YvlYw6<>50f{{wA2sffxj=5B!k zL5b+lYp!h%kC!reC8Cw9z08K68P6C^Wf7CvKWD$@&Q@DnwpU{>per=U{#1N}rAW7C zfv_g*mEOd-Y+aV7Y{9D}PQkK0F3wmE_|HkD)rcmC;@^c4CR{TKU*1z~%*RoyEr;g9 zxX14J7zFTy;z<+gk3K?E2@72O@;rshm*_TybIByYeOfwpwl?AP%^CaRGh@E&m}e$iXXIO#XH?QOGV|TJL{^K#B_3aH(jc0ekjP?dZu7n# zU6^IKUUtP7<*;V+O|DC0*!q~M1DQ1f<6OXw|bfku|Ey?It8lg9mPaX^0eLS2+gVckC`iMS(_c#Jn zOj#wzBZSX@NQ{Gw>?hHVdB8~c6IJkV(zoUy%m1Tw7BI-sitks}Jw0!Bi3 zR~d~}k~LFVtT>wlAF$&Qu;Dk*Pt5)~p4+_s-cZHTBm4R~`?b3jkYNf{ zhGuxry6T>E@XQB|JeT5Dajhf2?xlKd{Os{1n{LekCVl#+O1g1&xM51D!cg+CTF}mI zd{Dv_&uEfiXc8HJSWbfDO8HZ!HOwkM>#J6zpARC{SOfxnq97gui z?6Pfark82TrtN^+AN-N(_fASTeKC`AABi;wuN3HLe7mog?k_mmd8182H^HebHnwh& z3T0!1?&(SERWcY27D)MlM*?63;bA>JJtbLb<3lN;HUxA?pd~+Jw~-hbNqq}y7)lC} z{S^TbTj4pf7w=aKPrKQjZj=|MguKhoI4qxS{xX(G3L~J^BH}1u8J_TQYoMoRrus(J z{Ft=9!?S;&bS#+Ft=Uc6wsZ8&VhqdDH(3rNm1mAHaT*LC;T92gJa7^fW_ha6!qm(*@?n z=Ki%3m6cNV81(+I$5gYD&g(iV5D;3}_uO-4VO{7R(pqAU*7C|l_3Zw>$I7+VG1X18 z$sN~iUX~1?ZMqLuL*?BahqA8#Flwu!4}NQleY?b3K!A%zhr@Ax`5i7$!SM-5evfT4 z<3fH2O6?!JNVSN=s44VK#o8`gZfQ1sep@rU_?7Xe>BL!frSdMAb2#z-&?}f%!S-;q z!PE1yrQ!Ih%a_F))%|GUlXxCMu}Hy_CXXin=59y2XEXBKU&W?ZqpC&-u?6C2gs)Z;@X$KG#J>~j~}x= zG|r20Ch+UzbaIbtRj3)^F8sbX6GheA7`6eW>Sms5*C4y4RKT)yj(TeTR+g zY>bb|z(Yf~A0rsc!EFX%h@@@T8fE(qRhXg-9N^;Wu-r=Z4m1<(WO?5H&A;O4!8Fq1 zya#Chy1w*qGvy^y`Jcn-Cqi{=g3o?>OlX*Lzco3?l5*Nhm#40?iJn6i^+KEKv7{HT zIkq@mP{arKMI{#=sE3Ikq|S>=Eq@Fm{wx=o!_CQb=)aJUSCndE=Wo3qN?F1pXLKnn zM$e`a@+)YqHtUNh{B$|#F9d8ZLu`Y~s-7W_^OOBvsW0~p)E%`&NXl3B3pa!h>Y8r2Zf4jtRP5XS(d*g}-Z1hlTbyp}88-iMVdvJv_nyrZ%KQ5C z%WR%UwXUbn<>L~-LBchndaj1ddRyVWiOouTyJs$J=kGYlxr~FBKs-`g-EL{UDauFZmIgbM zFZ|%T@A6~9e8yB$Y-(lsa$;7S50CZs_cu}3lH*0i@89eAEH zq2g5plt`q-liZQ2d)E;-@RXpwubwWk=kr@ou<`X^&X-l#@RdN)9H@4jP|WG}41wR_8R2R2bPMt!m<+7Y6Q z9-p18mthLskeZx*zvjNSbSbRP`)M6534IV^+KV`FzmyrAl#T*UG%=$ZlhcA$sy$g3 zkNuf)p!?&d7Yg}T)qiGXi%i6>4~Z@8B%fBBuS(6ldcjsn@qmY*bbS1AgRNX|m4O9Y zBV`AX3>D6m+wCxqz62FrR_;?f`E^%sGEvEJE+0g?dI1IF2 zv^_8v*RP&(vvqQ#FU{|G&EA6f)_T#`gVs2%FVY`DE*oumce8_gyJepFB&QlPN)Dkq zeAPHx}O;?qhSs;dEd3#cpH94HHv*f$H2~ zUXdv``pMtNck){m)f2cyY(`1oW;Kulyg&6D2CW5OXWFV)RXyB^MIuvKpyesmE>j3u z0r<9W+UBPoxwcj~%lWVW+1XSak`m9)ZZcy~CPfreurzjyB=9nUDu^$w87Zj8mKjQr4GUM}E3A zb9;;p^aouK((2zWpg5Dj@yoKtS!zqvfb7#^P=xQNJ42WsD>y%Of!Q~kRo8`q`Il{U zQqm@tiK3DW?xTIKTTTx}D@KHD{%C)QPJhue@~r%M1Y?hSbHZNSlx`88>Hus{H0mavH~)kGnlWAxJ~&&M6nz*myy9f?2QkUbs{8Y8-m zxs@g4{=Ve5?r%=ZnyVb_7C?Y1e3$$x4j5(ogY^`^A~1~bYhL0ny&o+q>=xXH6@>Yr zur$r_VavOySL4!e#*s*nk$YfFoE;c|t$>mWRK;n>qXF#2Bk;4Xg5s>1Sy3}JotN-|kZ`~bkVo4$YJ${N)ud)9Wt$b__Nk-%TZGZR@J-ecU z1`ag|T*mTc3}7N9#P$b(=D}SZGFqPt8~-@&X@7G#A}veM$GusaQ4Nnacii znK&HU!vt>OA!%AzcME{551u;;e~B2_aFz&uqyYgUm7%CcF#G#x-al1jtzr zQyh?$SO96)^G1CyUa0Swtj*=mNpYq^t1b4$N3_e8y(_=%&H1jXFiLk`-3_;DzDuxi zp}W=*qQjIm&$;SMNZn0eE)}E zXtc!72o}JP@yDNwlRvMI1T?>Uf@A%C*`uK^axkUl%7)hNnsUh1ei#^gs7eeLS2Yln zEyKOpG zHXqEh`b2eao^bQ&NX)8VSEHZV30=+0OgegReluwMW2^WMDzk@)xerI!>NvJxTv7~L zfFjSDRY5n~Ss=7Dw2_ePsX;Il*kF_N*9A6l1^)o4Em@QDp^+mUJ`x$%W9sYQ&1RHW z_%zAK^@{{Qlp_pT6MHFgZ8o}&Dsjs+<|?)gv$>v}cv>=qGU@>A`Vf@Rg&{H@dgRa1 zg(fyQtV6Uz8iaZ^;oS8AfCe|{Q09Vc=dSs}&Sqle=C;dvw=q@b6Qx@; zQkf*WVmXRyw8i!~*{t#1S*I2jhy&HaVV}f#4r~RODQ_ewRMib&pnj zLrC4)YTJa`OHf-yb6T-d8$ZIeeY)MYm>`Y@i= zxN|0sWcFSPZrFTmEzdm`^Ozl28Bn{3do29s^0-Y<^>*>ndF@-_ngM$9=N*QePMkA@ zSZyhwDIb3jfsS!{axsRV_8IIX6Go7+v(F8kp2dO^l>y;MV0`uF)^m^9qw>=&n+Bs| z|IR-G3DJwqbqUz;T^S@> zWSSD?|A4ecv>#4igw)K+Nw2M7i#bQaWA4Ro0`HMlp2*SnVt?xfwP(mt!&V96o30#8mV)w>>y9))KAy)fgthZ+1~N@ue4o!)eYW@N0b@!7 zoXfrCu{`C9+!<9Vt{m1L*(7YDi&55X(q4&92j?j@|&mS%+gj57{ zg#QI@^wG_NqwVKwfz$$Vm|el11=mWi%g3Htg>=#|T|6>a(xq%Y)ax6^wLY#lx5G+s z0b>2^^jB7O_-=690Mluju3QmkNZ$vo2%7T_4%8GRWbibxus3tui?u z4`V+Gh}R@@X?N&8vE<+cpyhgN}{5oE0WgdE&{a6eD-a(a1KKW2C^bWOnzwM zabI*Kv7qenBDzEb%?=>DP0EQgpA5~_!5?ha12R9L3yS#81Twa6ZmD|qUOiFf(|eKS z%=lcrBOuV-+_rd9>`!HhD6K^pRKtz699cFekC#Azv6f=n>w!ap8{{ zno_vq%C0J#@i4|9XmFK87sK`BU99oB>>h}(7h>tR7h*YtL)t%IDZKA1UKf?y7Npt8 z6QSO*=lQvH_wD*`4957q{IXHC45^d_;{sGC-&YMqAgh3aV>Mmoyq91_!gAm9(=`7= zQtqqwws>3?}3WXhTKu#e+r2jh&-dl@#>kTt(E|4^q9*Ctvebdl~42~r?q%QMjmGj3Fr2#4#cl(?ZTs<_M zFKtb6AA2`W)leS1dG$&&poHcbCnqGF$Bk4An)sMT6O(ChEV=RWO_b-gF-yyG1<*U2u1R2^Jg<+26eKUod((y z_})I`p{&M;s{m(dq`?0Sl#<<8VJqQHRnH?O9&RMM~7l8CWrHlde>}1w*UFljiJsxkNQh1p=nm*KLcjm?55NTvlLv5r@kL*XtQLkEq~u- zO(h2CnF-$*Y}ki@OxJn04ALtx*5f6aqe@+H8XXOqdbs5hS!$WCSmDMZyUmBc6>-10MzCm))!L~cSie21^wda)~r`RA5A_>j}PHxlQf19n<8t6JO zUGkDco>Xe++4Z-#CknS0eOpUr?M<``>|SjgLN+sJ)|nma{*VB5PNUtO>#BjTt!S}W zSp@YnZ3M{s?1ZCWfs6~Pe=z|8!J;?o6T|Np04c!!FzW5ES5iC;m)}3esxOcD^;>W{ zASrkyBz{*5}g}B-DIHI;;~} z09A(;Ue7x)J?a{EXIA>6n1Tia2?P2)2j$mTBFJr`_U@KldjKnuR3%%$MaGQs$~GO~ zyn7iu&m2pLwQ&G!q0kg)NF7cj?Xn(aulFA;`YPE#IFTm}91J&>EKb?RyeY#%iBQsh z3tBZFu6&4(2*P6e-?qVpll$>z)KAwfvW9|8KEKoS#sjr@G``;<{!ncN)jzk|Bvp=a zpFL^sRAks`xsG27*TBb4yGt4c+6hot-aXWsAA4{TFG7m7*W@9#woY>~T*2q$3`~!p9oEh{B@Zda@^6Qh%_j}2qMk*{N>bjq$bQbTL zI>|0IPEB|}@?%RnP7LtdeQh8OMNyJSNM0LjqPj7lcS06uWYuYmv2A2ka!nO6LC#2@9{5BKM2i3rc%do zvp4hK#y((sffeUq9?svU&a#L;3op7okw47+r>&!`h@+2hZmTVx^F=o31nrK^<}*nv z{KXHpDQeA?%AJ-{^l0}^HCw+Q9KnJsgo%XO0s9!EXNUVHd~NNy`dbB$lVkM{gmB{8@i==P6cQ{z(cA+HW4Gm;TW# zCrr4RgR4$T6bE%;xkZDd+4{P#^fluh+gt?$%c0yBt7pac}brh#&~!2{@mrZxgq1I`=)g=#1E{! zo2F+is$doqJO-c;kM1eB%md_;5*+HvRrnxoQCD&X*xm_!v0siat~!|YmOX8KKW3*r z`t&V~aGi04-Efl{5wB{0Z;dXyPGN42zk#OPL^>mH-RF&hx_MVmr}xWZOf}AI%$|JP zTshgKl5lM0CxE6O_+7ckuzZCTc&BZP1WecTw;Y;3zQ4wF8#mt`P(W;Ad z8-{x>;OFA2wD7LjcC5UJ%3kWw0UJljbi)Bz`p6H*(Oxf)Y`&fR`cNJ%^ZQ^eLw|cU z+?=XXNl#qTm)hzV6D}j4%|xH`*@x#;@Ax-jt#iWvlp79v;XZ7m+A}6ldu^;gRC(6y zA{HQKcW0{7f+d&G!0U)F`Aw|A^V#0zV0G6?4XSo=Zz_Fm`A)84Y^-O0e5 zfpV>i0c~af+x%GuF%$zxJJ>+ zaopuq*IzxJ+(08I0N^dip3D$?na<;FZpU^^Ht5-33fOuf#*-Cc5fE*XBJWcd_l#J0 z(^u@eWfe>#gNdMOse?TjzK(Ybr{}6?iGVKuN30qkj9LW``AjaC_$wFAo_RmWKXKJR zu)(3cot$mdcr*J`~>BF79m%Baf+es+QWsH+o*Jes|{%=tcuPwN+ zY9+?NP?XL5=(mkqHeU^I%HF*Yqt>l9*i3cSX4m?O#HGMWl}w~H_x`J#$vc%PHGwVZ zFK~)Q0?W2n_zvJTYdW)L$}M8YrqL3*dt#ANoPHybd<9Nk7xNmojfS%8of_A^54o61 z++RtHHEjND^VIVD)ZlXZ$5B4!5BN{khaManNr?v>x-)H+$~Mf@ejFC3XRW&VBw6h` z>tgXH;WBT|NDs6^*$yqFp^1^DSZ^aDrv7&NMz5qX&m4WCQ^)l$QzH$>{`v*G?tNWi z`47vhfDl+h;C{ah#;L#HYv8mL6kZN>>4mmDpjhov?jx=4C6;WKv{eRmC;ueAtZ8GO zYAt|+pw_0)=xCUCy_jz7mvzsBS-x1i;~S#^z3^JzHGj#$HzlRNd;OlXs|G*kp0V6- z>Z~U_x~6#39nn8$#iz|I;o?y&p%JJFKyW)mFkv#t%6Bhw|H>VP3U3Vh*ym)&HFA zzSGjBouc4U)k|y(|8=WcxUB6s>BWV;z3Ndni_o_NpB6i4$IhyfE=c^e;`jI0pq1X$ z3ozGUT-+asLN>h(J&5KS3OlA_?2y z0-vV+2^_Q^3iiSglvyx&6~G2w^jGO7zJr8v?}g2c%(ibS6nVbY($*`l{6-HOkF3l- z9LB|yf}Fz|QWjlt#<52Yta06X;+~qLhk2M9iMYZ0IKKEwC9bz9%eRR2qX|Ax&2xg) zjXYf+(kqZY4O~-pC(Mn-sdYgH=msSO=^44zq#$(;ZVfPOhn+D*%0ZA z%>hg?139~i9*n(|76Z|(E7Q1Hqbgg2Qzoq+t<3|S#?{SJzGfFs?r^;P=pEGWBP6(5 zw*D*eA^8)xK&^R~zJPi$@>pbR?a_q3h|>k>4~bQU=}eF1GR7(aS`L?E@rA`()1wa= z7d|#=-TKMSEhYYzIHT_s=B?Dbz385c(U?kuC6r5=TS9_VinG~n^_bdq&dXvSnMl;cx^EtPrBFUAmw`GNsoT+1DsUbr$ zj@d%O>E>(S_V^vrXzPOBrI134s0vxDR(BB-t&&O!x$PQj2LfA)pY?NsrTyObf&+wwrxP!6 z(}A2-;@1;N)H2!6=0BJx_nn1*Fl60LEuQu5yMEe)%ucSKO6{Y4xvj6W+V<^pn|Gkg zW^z___wwFK%64xc^N99-amPXU)%^q=_raZ}6pK42((g6&(;gm%Qc{XhvG!m`oeGmVb5l{go+sAwcbng8i<6mw@2+ zc(>#W5-g1eRGwnVqetSE62%2)!`i;-I2V3f^yu2Cr!N<2dwKJ*JHv@LhTk!bXPklz zjcPAGIQnsYl+;6$Wb_J22jzIWdWj>S`uFBTHrX`cftekVRF6bB`cTKsj7@9dp>Du- zbh>W9oLkA8sc3UM+ME{$pSJs#jvULsl#6dYpe3gPIne*N50}7!#-fUjvk2)4^{SKm zY@#^6>!GgK{gljuMLzG7@5fiiTH(xt^TY0$`_pG>Oa3eEx)NuHSAHkf!v8croC*vl zVI#Xo8DGg0C?h`I{XA4kQ=EN~YWQGF;=<7J)k4F|(}yp$7NjIkmMo1wtXsDbge@m= zU}@YsdTseL6A7B(i|u zh9-i7KH?lN%h=KSGQM_bln%IxGy?zcA>5d}21taeCVf&M>c@Q?X(v3>Pcz0Hi{t%cZ(HbYf> z7Jxpo$k?q_Xkm1Z$$GRe*6RJ%_e->df9+|AW!~bhxp^1nXLQ@+wug<4`2li?%cYCQ z2f3-yL#}vaeHdoHOo7~oGM@s=OJn1DP_>I+)T1opNLz-YqfPkAh0;Gn`}AkiEq?Qg zZx?B!UH$oG_sX#x&sO}7YT$}^(NLCWc>h;&FHF!=?NZjyCH~!QRRIks3@$30>I+4B z=w}OBtAMTjPkN;VvKqr{TT}Y(;vS-YS4TCEdY>urdz7uJ?E5JpL*KLCayQIW@x3+Y zv;2eO=G(HRYs%oN+==-0top{C#l~op>8@5iziR=EiEjs=OZ`~wp_nx0cg_LR0MGlQ zrZj2pJOJFNZ3l-rp&)>rtAQB*$+`r_?-lpn-nsFmcA~-F&OF1JU!d}0oA65iR_CE` z`8QlNPSoC_^|wsNqYR(YI&XDH<5D(tt3MB(%MH^smDo}+=icW&o<+F5u8cPxeJ^Y- zj38&RIa#5l4b1kM=he;bgqb->FfK%!@wt_z?7i%JImq-@>bZlO`pYw)a`B^t+UfSeOzU7{ zJox}cswd;*%{L8pX6xH8_isEN%fH(AZAx5o|E85ujPc5|PFd$m{r+AJ>vLy|_oA-c z(oS9_usfi6t<_{ayGs{vYdGJPNxeg;&fX$*>sbF~prmta0J9r^^OVq^c+%FoPhtu8 zvN7L+S-p2fD<{wDW17pI-RU0Ib74$%eRrSozvD0OvPQKK@F@jkk%E}*Z_{B5mDeyj zuZb#1X`uzMliAB&b6cH@{Rc^Xz2g%h>K)tpZc|-Bi~ZTgQ3EBDDne+ua}IvWU;JD& zplOHO!+PmT?>ie4TAXh_ho?vcvCN6abF}6iZW`KYt~%UPaS<~ypDhQy( zSDP672I*CT$|51Z7e%CkwW9W{H&z$vnQWfVSV;O+i|F#=0sG0P`pzaQ#{!P+XLp6# zisl~VkURh}>^N=sVtZ4ecyd22ZqNr^{AF-+-0jWEu1^@A-LbyYNL>!6B!Ur2LX5-k=)ilUjEfBBrbC3tWgLxa*jG0o-o2 zBml+;(6msNj!G?UedQ@o2IVkIF=n-c64rQ>M1FX@$~X^ z>-Xn>B6u10dL~cd?22;r%w_Z>m&PUR%LRY*VMZR8Qw2I z@eaL)J=T_ln_;YSnWg3(&NQ8X-R5d2#OT7KD8WiEnte&-=r9_E1uU?~_4^mLcUHa+ z+zJ`+j!TZ8Ef0IVQM~V$fklcoBr||lE5w8?NcNduV;yoeblKCx$g*_g#pRqTqM;61 zO<1d4!qWVG7p^r#HgcP|3IGHs@-RuOpM5DS9b{u8Y#t(0X6DFM&|j6>K#X!%_d6M)b|J`NT2C#o+c;cT>@ zbyVY3){Uj8=e+$Uj$NuB7i;e-b8-1}og0hY=-(56Z6sMtemuaG+~YAuZ?4sI#8iH3 z({-UIg%!P)5e4d$)+z>Qa8$yyE)j{tQK00*fs^G$_|V2hGkHslF;qyNR%66j`RzM{ z$Fuw3{hH$+OU(@MWiVguiRek=P`yF$;Zx?aotGi!mD0nT-SeK`1C%|wu!j7ZtC88% z-|jr*)*I|`+^rgNb;&e5zEM{MpruIoPe^Z)*|4Mo|O5A+6sN={O`Qapj8wdz0by^sAk z;&?+(s{95?RE5_QFzs!{fyX|w0Rp_k#xVb$ESwoj)+WA&zd`CC{9>o>SkCQ}Pd}%< zRqgFLxv4hz#oc{dscd#`R`cx;yGqdB!1Ob@u@+WdD!)vEv$RXYhb>4BFR}h54vbn?pKF%$4uy>}k8BIxKAZv; z4gJklO<4~pP?}qGr1shwx*yaBISQwuYrA~eTBhS#yuS=+;OQHPs4Pj*Fj6+a*mEoT zMRQ@l^^l)#kjZz9@0`G~tg`Q3r>y;!Rej0#f*r5)_L1O~<>>(kgmKy9KJZc>S6kJs zuq6Xre!Zr$&lrP{EA5H=y8HnIy!NB9uG~W}Ut(c}B$uozf@g&IWR&>ic5d>Q_cIbn zoN5HF+4?;9IVD7>Yha3)lNn6E>i41XjhLwKLZ;;F4CE#F7xx#CzYf1oUA9};0%ar@ zUw1Io$CJMjz7+YlZw-IlDNu5$dOrbK1j&sk;00y!q7Lk1Ow%2Vt6BRi_Y&k@vxa?8 z_B^W5z_=xEe=kZMhorLT?~CW76a0csEE9|=rq_8T{}I#nqrZo>`C9UKN5FCHe$c6=_~FR_;f*bstTN5IxIs%P1Uk{~ zNg~TpxW0w6fBJegv3XMjv)KCw$8-He5KPcimdxQs|J@|qy+2E(A zW{7)w?{WRy=hIc4TeSd~ourXje?sUfAjCRez ze@~ek<*hQiJfdof(Sq9-oj=c1o;^NSq&jXZckm=$|NV5B`(ft2QmjW(;bQ<_YXmg` zsrl&TtaX3QOEFoEJ`d2`*IJmF5t*2{{e$rx5p0V`x|o`6F!sx3wSLZkFd% zZGV@))`#LRLoAQcAqOD`ax5`>lb2@hCaXK3?s`eX=%MVkbFP5^=c{=Q88CX>OXIjc zJ+fk2j^%ZjG(1ncZN25;V3NEH*IZu5EMBB`o|n#o*ev8uh%0sIqNK8jt3Q$q%aZ&J97bhwH=1Q_Z{QE={+}GpOy@zLvdt}j@{=_ z5B=;D+{MaWmB2)7N^o;El^$6&xJKB?@FPoh=3By`Wp&w4m`6MQ zk{#Su{-Qr*2*eVK|I00=6f>u>(b6mKBi|hgwQyz$07KJdR}KK4fS53Ak_5Y3xz{_* zvuA$m-4PthV3VKG=hc#k?zp)1n?~|QAbrrSPHgLV+~WQ6HQZ6xJEo+htoazIP0-NsT6Wp=NuK?K0Q8$K zzt;>AJKAsg<53Bh%nq)I;G$W@oPPY11ClGoy4r{*Mftc#V+xnz-gd@2FWoIG(N`C@ zf(qYxA;f81rl|RZMDaMP!<@+MN6;_T);KLnSSFGuW^gL0LRslo2C$GwQGc

    aqRF&K7doFdQ-1iiDyC-u`QzYMY}FDa$4PKiUHGH5>e& zwr~x5O-`%cKEM|f^n_pd6g&i?}evc zm6K@ak-VmNCzuDhWJUx!^eq;VpsW9b^BQpLDP=??mm%N&UScrUL1w@y(HExTYO}Av zVmBtzs~fJ!(U?{y0e2b`%dux9QOmQlyrUh6`Qv%W%n42f4JL(xCp5NP3 zymwQhzi>Fi!_GbCO|5R1caBO721?q>jNi&`o(|Nfe<#@Gvl}PEh66Fw%MC%8iq?B7 zkqZ?CYfN7g3J>L~CO%Pg2nI5M8&0*amU>izcOtXKFscuNs3Q#lWmGy2TnC^JPL=${og zi(h}rjk6kKuG*tye}2v}FT0wUAaYRVWPs3)v+o4eN6vtz7v*f{RDajZLfhm@Q?ujM z<#-LHrOEUAuWa2Be`JliS|`kjXph>+i-1qcXs)@dyo|PoZQI*V8H9qXmqZN5#TA-3 zN8JghpvWbAm}i%wnJ!mK)z7JTZB;#(>;d^VKXZi(OY*v$Std0eys9i8lh1x}*Tgq( zY-XPP*T*FOvd90J!p_ng;xMmtUWYB6E`I3W5w^#tbG7W3eQ=o>7i(>>8PJK73d?5U zV(}a(n7wF#8{&re!Ji<}a$6e5Pq!|-y(5-Q0{Sx+;R`t_bL({@UkYJoG5R~{ru3VG z^y3S!-ToC+lqIM2D#JxhBsQPNlo)e zqPF;XBhBuTt~%(mYHN7SoWPrFJZYYA7r+oVwZAWa+~}+{ErERY^+t!3fQ^LGe|+ns zvI^8BPKvAzFx5#JbvQN+2~m@S!?rR&6Ig1WpvA#CDh@wq@0QG46-idZ|4Qq*gTUH9 z2cL`2^e*tL53%sT2kT$$KWXD9q!X@Np>0p+o1X@;k3zF)w8xn#3QU|o(OD5C=j@RT z0z_LWpAz-*_`aHVxIr)|DAx-n&%BoU9wO zut%ECG5nkicGq{*GkZ9j=Z5Sm)B8lFJW6-fWT)wjw0W@lJ&sK5FFTbSf&}pYGLz}oKTiOPBOk-kv{7aOVa?iBDVQ^tkcn=bCJbf0Ile4$fyM{1 zXrG3@z#fKP5y?G9u}u?FqVRd7h?b0pd)bCvN><2mcC4&r=Y?<5H=r2k95q_lh2zOf{pEv9G!KRQXzW9iP*tSI zLcs%ZL$dKkC!Qy44#CI{bRcPbutUVBF$^LK)IuWktoH_t~5+djDU<6H5au}tw)dYv9#m4l|gsvZR8qGcK><=w@w zS2Lr;_A(UHjBcFO6oBhL?Kv07=gkWg;g@d7yhk~50iRwy#e~e9c{b)@W;7g4jw?+A z@J&Z0)C~~`~lMJ>I8GK;RT*|*%+Gd%lMwC-Ip?A z?F(8{H4ve>5AwjZqvLM}JF66aRcyT^4t_SXxSUkYy`JrTh!7$FVOL%_ z8)Q*SpH50^ns$z)hVzLpT@HyU2%NcX$)etJ)<*9T8!Pv9|fko@?iwf~)RI43AVWXwhRhKn=bx)=|@-x?i#qx8DmmQvH+*SL2BFikH z+826nkj;9Gc^6hW`oiPwSut#8ckCDRb=j!LKNx(s)H)%I&!Nhg!B^zadV<-yVoEGulzqr7${2pBEgeI94M zaxv5;_wA6b@I^-Y`W>|A{KfLD0UK^7AoV@#Psq3FbcW{V82esH!@bH^#{21rgX$)l z-ppHKx&a>B3Ifh&J9eKoEGL%X)H>}seQlX5M$4WVv{IjK`|TtUsR+K=M2u~Ka|4Zu znyjF`9G`fIw(LbX837*5`dat{fX<%?W_gWQ#~pvA(i!?z9v~oiV@ntCN;>0-obp^T zClMja``G+YzjGW%fEufA?(?2yBvkevaMpD=?FW6*nzuL)ey} zx?wI_eGs2qWT*^l{Io6fs~K{r_Fzoi_g$F%qu=q_4{v@iIiC;s#pG1gC|40nQ+=6l z9rTG-&i69i;}&Y)tTO3Nqi78`7ZapICTizaXk(M49JN}Lr?#oWymB#PC~W+Dz4 zlfq^(ene=&T>RS#3MxwQeSvd)^nBy4#VdO_?VkHrg6w++Wr9yoJHtfPDuIbCowlU+ z%JP30eRVk?0|*AU23@aEhyhC-5sh;s&l)Tr)k-o$sG)K|H=%TlJ#X~7J7s44ASEaa z;WZL{DWWMR0*MxiBirP!#N0BTI_bW8mYL6KuiFzcb2(njVc|?n)>%^n7~NY(ew{#B zfFb!RAb93U#fxYSn8&NZV7uT@J6lWrZrj72BR@@!6a42xblm{!t+i>&V`Ko^lIMat z7u`iN`?%axH8ScGt3rK*RZII>2plKOO1nM79DLx3RWp<8JyxA)32)kr@E8Br1n3y7}|M;ejpXS#Fh-LC~vosBKNy}pUO5IN5L4cTq zIH<<6dr2rMpYHmTp#pw(HK&VD)^#6iB(KczM5u)s^C9@ zhiY->#)`bYn+9%f*`T?#&iUzsJM>x=IZH$}3=%@mdZfheNNyO~tD)VtrUy*5A@KnM z+IEFsY|$6Qa!mu%hZ|Wp7)`yxf?nU1J_XSEQaHp-Qc#OfLje%(idj& z&X<0B=aHDtn5_?~^RiaB(wIug{VQq$ow3eBxPP9BIn zw=egm{xsjZIn!h$r}gTe6)v0#%-q`uQDyb4l z(j=79T1z5y_RHa{7hh&pDd(79ezahQ)NGuakPy$ut9d!rC(L5|^0fDNjQZ9zMoZJW zp8frOFx|v+#wD=i(sEi1ZfL711));R7aS>O#I*NLJ2mXUs*H)>gJCI$j;u;0 z$e>SVtmp6m=q}m$lIaE)Tn2WY(?@=XS0lZ&HXya}sYNP<>-JjT<6ko;9#l2dS?enu zsw&6KX<;e8fymEhP)*G}MCzrfJN;mY%6U(TEQXqP%H}k6P!GQ^jXNWK7G~jh#`G-o zv%=HoQ#wLEn!$$}(d7c{?Qfye{oC!?SL~XeC-0dN+?kdwkE5WmLpN~8F8T9BCbzS^ zn@5EL9+U*4vS(?imw#yDkj9me8-nj>&#lE;viac_x%?+vAvc?cLZ$XTDQJw(*YSQ6 zh414`tkUI9&yFgUKdZh$HTj*UpXH8%o@g=p4oB&nbe!CXn?89W{fIr)lH$&oTA{{-7_a8bJS7c4Ul-mT>5~ZLHs7<8cGPS)dU?P1D}o0 zBH+QLZwv29xF>EC;zSzo55V`i286{FZM~uRVTt&JU>T;%1r>BT+h0>C02=_5_K-mZ zyq`6*GfNrH%h0sHC#t1;xBnaE_5#0@TwaD5l<85`|`}=C?bLK4WPtW8( zurzufYnptVG+kmIe9{5uz{)nAJuJFa{@XAIViAMZu-L0P=C}Rc146FVaX$m2%$TNy{8cmWs0^KHg=#SF4;>8y$#w@~ez1-)gA5Fjjas$xU1>&|{QGMTEniN;%+p zgO*KX#+S;Q958s%2al}8FY3*)$QMVWIyMg<0A8}Q{lW&Fh8;9dTc4ZB&wL-W34Jsm zGO&z=Wjb#5{!ml-8-|?(vR-(uGUF5;G{Z4|3=LOheuCcO3KZ-gJab%AgZ$jZQvJN3 zCMtqA^R>og{Cv(7G8MFuX*nr@2=^ThhV)ALXl-c=ywze*-8i2& z7>tqQf8LPsdxL}f@a0h)LtO8AD0z99i!k977IWSOV!`F3eA?n;{!IFBtY6x8CHmto z=QB(YnyGoG?dy|SSv7Fhg%`KOQcxioutWa552Zw}D}KLytf41Dk zM1siTdfpFZz`Dd zVe8G4e}$Wt3c)t`Xg|vPScR>%v|F zx_tdGv`XohyppZ`I=bY0a8SM8v__EmOBxS}kfz@Ndsb6RJM+o}jJMjHMq%xNCl?0c zf2u?SlYBZn{_xTf@g)@50|{(L3UW19Q~)t}gNuoC5Es;TWZ6I!abxr)T6@{p()v_HO>X9eosw8{l_k61>w*176L7R! zuasS6h-|I+oZ)i=dWF}{?}=ww+@A7f@>%)Cd`M`w$t4$B*C37wt#PTG!`$pfS?`CpUYp*U-U?~ zZ2Oq(Fg#B+D>no`N2x^qsO?G_fIAEoE+uOg<>Elpp#6Tk<2hdG>3$ zjx5_pxhqxGmFTfuy3*b%nx7@-#nxe#49U0hL~U%$DY6bMRF5x#3~Ja^fCU&myhcmX z8}&CNR$9pNgy&EL6+$n)ZN{MZJnG*`a1sw+Gko7+TBMXXeWTvmfJ;^5vLh^bLrXzH zMC3T^V2IQYeVEyk(I=_zDDNo1>=>q3)Rz+PY7;?gky^})G!NQhXws@bzIEfvFsvp^+<*-+6Yr80uZ~%9l@)QgbP$cey_ncSg*8Y@pMS{QW%j zLG#GxO7Z@6BU&#Q=GWsR7w_u8lRkznbh zs{3gW%y^X*2lQ?IU{c;iVG{28-1_-*G998pMK_`s+6?!^CmkFJE7dBQ2D?X%%7k}y zJMn*OO=pF!zfu#mmT=Qtucnj4x<=iAPHUWI{|xRPuH_qN)!}_JQqe|}@5R+Zs|smf z{S#}OzZLkACiA6hpFIOkY&#TDiyB85g&zn3HaZJ^f=W=YzpX`WD$Fc2U`~_c6#@>{ z5SA_eLOqG}<5**k?~uZfQ|I&ian^z^lKNak+rip;2xK`FKgYE$P`^Kip`;{1VO#mI zTP^WIJBE*_mmBwG(vKri{6>XON(d6I%<%m~%&t$xyC1P$OUKRQ424&%pbxS!%B(mp zyKntp&$|k~^Q|wH$7^W|(=j}U?4(dEoqkZv-vPfs1sa8jYyc`Bh2?26sXEtB&yw|Y zS^rAZ;RdcsHlP|%gut}4bKGoP6I6Lz_?fX2KhLPyg9y^#rVpIN&DvD)@bVn(*U*|8 zy%n2KGwg8RXP1guQr;1%33_d=bYuGx;hC9M7lE_ZBOOO``rEW3015z*?my5D{2yp9 zT7^_1TklBeh#C{ndTzU6-v40x2_2iN*gaic)AVq=>xTC!+1s}RK&Bh2C9N%03ukI#I)y1smNi{yaqd}5raumhf6HFh4sNa6TJNn?=N|=f*RW_O z&pIpPR1YXUA{p{czE4RQY?nw1EdozH9xUF{yPXW>I4v0g@u8NEuu1EJh2Q|_nYmW5 z&=&M2MWLPG89t2gJlK$+qLWnSrxTp?rD43k?Q&l+q@VZ!arZ1}*(A)4=w zwi>0$zq2;dfGU#CmB4OR^8{PVJohR|;rOt&Yd~D{(Os=h^vy<-W6)p=2b_7##eP`E zP&_Oco`bG$!)RCqqFujz)lG_E+dBUgVVc|L#Rl<7>Wjaj7wbxr>*}L%-|_}Ri75Qo ziV#t`#t=Y)68j&~g4KB0y0?DF=!+sY;}K{jekdwP2u8B+r^_*0n=)JnQgU^c#~?pY z{^>%cVv#{DGM+V*?RE<$e~K^`fuVFcmfKF6yEeZ6zCdT(UCMOQe#(n&iO!!hMQW)q z0y7fmy+%A`#_==HRcme#J8rZ?@Pa4IZRdND^hB%QhzUFvw~bz**eh^IzM!OI=62$B-eG(L1DMY$I0ScpN zV?DZ6dy%wZsrzF6kr~g%CgSJ-b|=@L5?URj9nW1M!hFH*K-*Z$j zKgy}*IQwgm{tm}X-f5`J6{I~N+eA;Zh(b(ZavJdyYzCcR%4F1Sqk(2x_- zkp5|P)qUa@&%e@BR&G&G0l z-p~NbCor=Gs+nvhGoL*@JyO&Od4$uzbn9X+ABWcF_S%I-`-6;d~s1{CV!&BD2K`(k&9&!v`Gr?Y%^uNh_Ep zlMO@Q!6#A|Ur>^Xj=3++^zC}q^2&xR`Z`VOZ7p0X zKMe=LzSB2WFTW{=Z26yr=!Z@8SsJ4E0@}tI%jiI3dz|TpZMAY?u^}63nK4Zat7+S8 z3cNz*@8n+|{ZfAPkonop0BnkSSJibzHd1VMMD$~H-?V^t?h8zF>Zwq-WeKu9ls8Di zd9TEApz6Y!E z?6^bNo20@SOMc{7%RdCJkmv!7O~RSDeruX?C5l{ABtUqZV!Tuk@Luo8PWrrBGZ^Wq zqBUTA?8@4zQ9WJ%NYDJfZe`wh1IDf7qRchecOcl|lmDLkO9leLhR^40?bvt-O)s}f zz<-;b)QVHCL!P#yw$8WDiusgEyzu&69M{!rI!qt%;ilyLPVQT9B-ID9;Fel*2_m+ZsE%b(Myj@vY=1l$2x~r2#&K)2ijc(-w7#XCv55-c2z>d%4 zSaTwsWaYL>%ugCPJsBp$Bb4kfAU*;zLw6gx{6-;MNcRHtfZ3=I1oqFL2QHf>HC}S@ zS#GC0rRcKVAWmWP$gig+5?TOWZrT!@PCxD^jP-|~tPPDXSSvuAxXKHi7S9)CMW%^-+7mb^WM~>(LfV&20DX;=zOg6_xk`!ktIZ zBK!%hPoAI9`uw|M;p}Mzk3g1t$;JSRrodZJ+pq0WzjZeyO zv0K+g{hPUDDlZFL3GL6g=@T2e?8>2nsGjaFoDR(759zFX*uV|t!H9H8b^ex{)xhWYV2n*%UQEr4Uz0YuOd$~e!NEtq-`JUY790qrI2 z_0m1gWS}qHLYt#z87t#H5gt61eIEoP_tXVHyGtzt73xKus)xd|aLAwQcv~}P&^*;v zcVR|f^?EM?)Cb4ej{zB3S0S>EmPx9wE{Q{i+2M8W4scFs5%{|SNe%?4xuY?sF3Q9}nr(7alH@^+CLk`brOd6wvT&23^UrO# zDb{a^JMjk^I?u<7!(f`2myb?B*3r96p#neg}8_^+L9JZW3Zqe_;E0XgZ*0 zI8F$;Ir$z6C8wAkSFH7;V^@rU7Je~3rDX#w?E`GKNE!t8_WjL4GnU}M_wpI zE6-PVFW1~R+qI0I#fC5HT^4N2P;8wdbc{Y^d5%EkPS~mtOf5rq_Xo`a%78&HA4yjS z`|Xp21Ylwu3$Z@1zf03z8va9v0s{gMxWIJDtjy(K4=s#}ABR(mTzk6zX?PL@4XpQ6+2*(gzq9P1xr0H;qHeL7Rf6v>v$>sex0gRB zd1dgav;vlCmlo-Jnp)!>Q|`U}WD6i)X;PG#dcf9QIlg@RzQuq90=K;B?AsW}e=DXo z-voEu_SoUD5^^9UU^JGxJUd_acz84*NVp;jW;sv*Jcbkog!M1W7n3KM=-W*$9d@WZ zrFV}*I$7l+0z0-((ITFK^rpkRba!+FZcP{5DTJ1SLPeQV-;f}BNv$D|i{-kM?ZRn$L^t z>@dgmPxOsE0m`)yU0oD^eZuf$hv^Nhq6g>J;&W2+77OVl8@yXDBa)ZO?Q$X~*SH+8 zKj{(?00)zWAsZ)~9DRwfk#xXcSpz2Wud;@Vqck|h?k&g_>ikU1RDby3qnXQl+8H|e zOyX;}r{a6Vp+FED}eY9bDVgB;%clRbB?d@&y$o^0*N6zjslMi@0kM4b+ z`o)5m{RIlAGKg=Y;!@vtv7|6K_i5O!!4P=uM8hZ2;CCmRz%8E1U$OC78($q*ZrQw+ z!fW6=FnC$kK-m*C7!5PEUJ8Ea3wkaPlGB)?30uI?0x#rX^UvH5r1_qSh%dDnyoU55 z@9u1w*1IENkf0N02*%;9nlFqq8=K!JleFZxRdfb9t2Ndy-0yV%I#cWR z_ywx%n{m6UDUu2vP=`eq`A2$$>jWX+U;R^Re$BGy-4;?z>2sT^$ZJo)`2Ga?kmNkP zx{pv+K6LII1b)l^;$9dynw+KePPGzQ+2n0Ag8N={PI%!V$mD?S{1@d~T-L>;qy&$u zb*gD54KY3=3xf^`3qa^R;8GfKS(t;XN;a}*Rln~ZRGvK&=X04fF&T8)jhxq**zBscBP14ZuRH;j>^sFPui3- zF;e3jg&LEK^noEuhdju_AtMQRRZl7XIe*ZeY5wh-a^QWxU1x`7ovrF7F5=hwJ}sM@ zqj1)!e>ry3P%xE9_aMX7(I$m`_&{l67Inf{$@iaN98WZtYSPc|*=Wgzp!3a-)*ZM5 zo{cO#j=OBK`YyCKTXzvF($e?Y9=-UDl94g)jM8*ai0zZ&1 z9l~SH2-J2~!gq#%&%26NVKoFfB29cx(!O1-rOdsOlZ)9atF%77DB9n!g$y@Vv3adQsb* z^$gt-#N0Y<3!C`^wF^5uH2TND6E-IQ$2Tnm!;CB6;KA!%f&EX9WLZrN=S|TFb9kM{ zQdcF^Z&wD+C%>b*RE?4E(KOSNM>VWm-s`-|Sq>G#NBXtll5JO-m%Xq8FlIuwIdkV+ zi+QT)FSCSKEQ{33wj+7VGEj%Sm=uFI;rn@dGDe%KeD~wfORp{UYqJ;&EBz+9WRZTn z_q#Et3co(Ir?V6xuxE>Uj#<~PEI(&xXBx0Ft!9@SNHL_*R4ysNzIcfO^Xn%U_B+=v zNc@0%;y~{3_Xf{pUzOHJxgkykc0@Pi9{0J1`_qh&q__DeMTnriQ!zCFQzB(+!|*%* zugmN4Uxvj!7r@g@_KxU+aB$WkJeECQ)hHvKlk|FPdU0wT7~04+E%PXw-c+6WY?lJn zT(9G$6c$S^dFrQoVjv;$ftuJMIjYY%$yJ%68)JYKikub`xN|X;@y3Yq>TI*)hcDW~stDZ&qbgt5n&V?m{Y#p(I@i!hg>RkCNgw{hp zj0`OuR{WBVL&U?gmiR4GgkrCg&NvFlG5>nGT|gisjSN?FBh(l`j(+*ob*m(j=f z>SQ(vRfzib`v{PjJQxFN0pHIg9@q6@YF8)%6$rx5Pl8#G{vqTkL=J5sGAE$`sjX*= zSIO1W*~q1o#G_F5sFt;pP-efE0U?n6E_AAK*=Dt=tTi@s1AFB|I5W_9Pi*VxT+u6j z))KPqQJx&}1{wx*-C-s{g_ILM(YKt{zP`7TB5SPhJ)HU@``+z-8Nq$_6HMuH<~iA+^DMmvhrWD zCj8=Gc2AELEVD0R_AkK1T`M#=B!Lfn&KA91IwRL{Dp5iW33iuT+um-vQd)8 this._playNotiSounds(); + noti.onshow = () => this._playNotiSound(); } noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); } else { - this._playNotiSounds(); + this._playNotiSound(); } } - _playNotiSounds() { + _playNotiSound() { if (!this._notiAudio) { this._notiAudio = new Audio(NotificationSound); } this._notiAudio.play(); } + _playInviteSound() { + if (!this._inviteAudio) { + this._inviteAudio = new Audio(InviteSound); + } + this._inviteAudio.play(); + } + _listenEvents() { this.matrixClient.on('Room.timeline', (mEvent, room) => { if (room.isSpaceRoom()) return; @@ -316,6 +324,9 @@ class Notifications extends EventEmitter { if (membership === 'leave' && this.hasNoti(room.roomId)) { this.deleteNoti(room.roomId); } + if (membership === 'invite') { + this._playInviteSound(); + } }); } } From abb81b639044b0b72f6746d665e517907591b389 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 20 Mar 2022 09:19:20 +0530 Subject: [PATCH 012/824] Remove opacity from jump to unread and latest btn (#402) Signed-off-by: Ajay Bura --- src/app/organisms/room/RoomViewFloating.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/organisms/room/RoomViewFloating.scss b/src/app/organisms/room/RoomViewFloating.scss index 2acf6740..75802175 100644 --- a/src/app/organisms/room/RoomViewFloating.scss +++ b/src/app/organisms/room/RoomViewFloating.scss @@ -74,7 +74,6 @@ &__STB, &__unread { - opacity: 0.9; overflow: hidden; background-color: var(--bg-surface-low); border-radius: var(--bo-radius); From 50bf90fada097f5857d024214b8674f17b3338a1 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 21 Mar 2022 09:46:11 +0530 Subject: [PATCH 013/824] Redesign app/user settings (#404) * Redesign app settings Signed-off-by: Ajay Bura * Redesign user profile in settings Signed-off-by: Ajay Bura * Update string Signed-off-by: Ajay Bura * Fix bug Signed-off-by: Ajay Bura --- src/app/atoms/tabs/Tabs.jsx | 4 +- src/app/organisms/navigation/SideBar.jsx | 2 +- .../profile-editor/ProfileEditor.jsx | 95 ++-- .../profile-editor/ProfileEditor.scss | 35 +- src/app/organisms/pw/Windows.jsx | 11 +- src/app/organisms/settings/Settings.jsx | 409 +++++++++--------- src/app/organisms/settings/Settings.scss | 90 ++-- .../space-settings/SpaceSettings.scss | 10 +- src/client/action/navigation.js | 3 +- src/client/state/navigation.js | 5 +- 10 files changed, 369 insertions(+), 295 deletions(-) diff --git a/src/app/atoms/tabs/Tabs.jsx b/src/app/atoms/tabs/Tabs.jsx index 5426cf31..39800ce3 100644 --- a/src/app/atoms/tabs/Tabs.jsx +++ b/src/app/atoms/tabs/Tabs.jsx @@ -74,7 +74,7 @@ Tabs.defaultProps = { Tabs.propTypes = { items: PropTypes.arrayOf( - PropTypes.exact({ + PropTypes.shape({ iconSrc: PropTypes.string, text: PropTypes.string, disabled: PropTypes.bool, @@ -84,4 +84,4 @@ Tabs.propTypes = { onSelect: PropTypes.func.isRequired, }; -export { Tabs as default }; +export default Tabs; diff --git a/src/app/organisms/navigation/SideBar.jsx b/src/app/organisms/navigation/SideBar.jsx index 4a305227..54723bdd 100644 --- a/src/app/organisms/navigation/SideBar.jsx +++ b/src/app/organisms/navigation/SideBar.jsx @@ -72,7 +72,7 @@ function ProfileAvatarMenu() { return ( { + let isMounted = true; mx.getProfileInfo(mx.getUserId()).then((info) => { + if (!isMounted) return; setAvatarSrc(info.avatar_url ? mx.mxcUrlToHttp(info.avatar_url, 80, 80, 'crop') : null); + setUsername(info.displayname); }); + return () => { + isMounted = false; + }; }, [userId]); - // Sets avatar URL and updates the avatar component in profile editor to reflect new upload - function handleAvatarUpload(url) { + const handleAvatarUpload = (url) => { if (url === null) { if (confirm('Are you sure you want to remove avatar?')) { mx.setAvatarUrl(''); @@ -39,48 +48,72 @@ function ProfileEditor({ } mx.setAvatarUrl(url); setAvatarSrc(mx.mxcUrlToHttp(url, 80, 80, 'crop')); - } + }; - function saveDisplayName() { + const saveDisplayName = () => { const newDisplayName = displayNameRef.current.value; if (newDisplayName !== null && newDisplayName !== username) { mx.setDisplayName(newDisplayName); - username = newDisplayName; + setUsername(newDisplayName); setDisabled(true); + setIsEditing(false); } - } + }; - function onDisplayNameInputChange() { + const onDisplayNameInputChange = () => { setDisabled(username === displayNameRef.current.value || displayNameRef.current.value == null); - } - function cancelDisplayNameChanges() { + }; + const cancelDisplayNameChanges = () => { displayNameRef.current.value = username; onDisplayNameInputChange(); - } + setIsEditing(false); + }; - return ( + const renderForm = () => (

    { e.preventDefault(); saveDisplayName(); }} > + + + + + ); + + const renderInfo = () => ( +
    +
    + {twemojify(username)} + setIsEditing(true)} + /> +
    + {mx.getUserId()} +
    + ); + + return ( +
    handleAvatarUpload(null)} /> -
    - - - -
    - + { + isEditing ? renderForm() : renderInfo() + } +
    ); } diff --git a/src/app/organisms/profile-editor/ProfileEditor.scss b/src/app/organisms/profile-editor/ProfileEditor.scss index 9f95e5b3..2e2ef917 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.scss +++ b/src/app/organisms/profile-editor/ProfileEditor.scss @@ -1,28 +1,41 @@ @use '../../partials/dir'; +@use '../../partials/flex'; .profile-editor { display: flex; - align-items: flex-start; + align-items: flex-end; } -.profile-editor__input-wrapper { - flex: 1; - min-width: 0; - margin-top: 10px; - +.profile-editor__info, +.profile-editor__form { + @extend .cp-fx__item-one; + @include dir.side(margin, var(--sp-loose), 0); display: flex; - align-items: flex-end; +} + +.profile-editor__info { + flex-direction: column; + & > div:first-child { + display: flex; + align-items: center; + } + .ic-btn { + margin: 0 var(--sp-extra-tight); + } +} + +.profile-editor__form { + margin-top: 10px; flex-wrap: wrap; + align-items: flex-end; & > .input-container { - flex: 1; + @extend .cp-fx__item-one; } & > button { height: 46px; margin-top: var(--sp-normal); - } - - & > * { @include dir.side(margin, var(--sp-normal), 0); } + } \ No newline at end of file diff --git a/src/app/organisms/pw/Windows.jsx b/src/app/organisms/pw/Windows.jsx index ae2bc1a6..ba80f132 100644 --- a/src/app/organisms/pw/Windows.jsx +++ b/src/app/organisms/pw/Windows.jsx @@ -18,7 +18,6 @@ function Windows() { const [inviteUser, changeInviteUser] = useState({ isOpen: false, roomId: undefined, term: undefined, }); - const [settings, changeSettings] = useState(false); function openInviteList() { changeInviteList(true); @@ -36,20 +35,15 @@ function Windows() { searchTerm, }); } - function openSettings() { - changeSettings(true); - } useEffect(() => { navigation.on(cons.events.navigation.INVITE_LIST_OPENED, openInviteList); navigation.on(cons.events.navigation.PUBLIC_ROOMS_OPENED, openPublicRooms); navigation.on(cons.events.navigation.INVITE_USER_OPENED, openInviteUser); - navigation.on(cons.events.navigation.SETTINGS_OPENED, openSettings); return () => { navigation.removeListener(cons.events.navigation.INVITE_LIST_OPENED, openInviteList); navigation.removeListener(cons.events.navigation.PUBLIC_ROOMS_OPENED, openPublicRooms); navigation.removeListener(cons.events.navigation.INVITE_USER_OPENED, openInviteUser); - navigation.removeListener(cons.events.navigation.SETTINGS_OPENED, openSettings); }; }, []); @@ -70,10 +64,7 @@ function Windows() { searchTerm={inviteUser.searchTerm} onRequestClose={() => changeInviteUser({ isOpen: false, roomId: undefined })} /> - changeSettings(false)} - /> + diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 87f27660..84013cc9 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -1,10 +1,10 @@ -import React, { useState } from 'react'; -import PropTypes from 'prop-types'; +import React, { useState, useEffect } from 'react'; import './Settings.scss'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; +import navigation from '../../../client/state/navigation'; import { toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents, toggleNotifications, toggleNotificationSounds, @@ -16,16 +16,17 @@ import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; import Button from '../../atoms/button/Button'; import Toggle from '../../atoms/button/Toggle'; +import Tabs from '../../atoms/tabs/Tabs'; +import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; import SegmentedControls from '../../atoms/segmented-controls/SegmentedControls'; -import PopupWindow, { PWContentSelector } from '../../molecules/popup-window/PopupWindow'; +import PopupWindow from '../../molecules/popup-window/PopupWindow'; import SettingTile from '../../molecules/setting-tile/SettingTile'; import ImportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ImportE2ERoomKeys'; import ExportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys'; import ProfileEditor from '../profile-editor/ProfileEditor'; -import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; import SunIC from '../../../../public/res/ic/outlined/sun.svg'; import LockIC from '../../../../public/res/ic/outlined/lock.svg'; import BellIC from '../../../../public/res/ic/outlined/bell.svg'; @@ -35,85 +36,74 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import CinnySVG from '../../../../public/res/svg/cinny.svg'; -function GeneralSection() { - return ( -
    - - )} - /> -
    - ); -} - function AppearanceSection() { const [, updateState] = useState({}); return ( -
    - { toggleSystemTheme(); updateState({}); }} - /> - )} - content={Use light or dark mode based on the system's settings.} - /> - {(() => { - if (!settings.useSystemTheme) { - return ( - settings.setTheme(index)} - /> - )} +
    +
    + Theme + { toggleSystemTheme(); updateState({}); }} /> - ); - } - })()} - { toggleMarkdown(); updateState({}); }} + )} + content={Use light or dark mode based on the system settings.} + /> + {!settings.useSystemTheme && ( + settings.setTheme(index)} + /> + )} /> )} - content={Format messages with markdown syntax before sending.} - /> - { toggleMembershipEvents(); updateState({}); }} - /> - )} - content={Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and Ban)} - /> - { toggleNickAvatarEvents(); updateState({}); }} - /> - )} - content={Hide nick and avatar change messages from room timeline.} - /> +
    +
    + Room messages + { toggleMarkdown(); updateState({}); }} + /> + )} + content={Format messages with markdown syntax before sending.} + /> + { toggleMembershipEvents(); updateState({}); }} + /> + )} + content={Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and Ban)} + /> + { toggleNickAvatarEvents(); updateState({}); }} + /> + )} + content={Hide nick and avatar change messages from room timeline.} + /> +
    ); } @@ -125,7 +115,7 @@ function NotificationsSection() { const renderOptions = () => { if (window.Notification === undefined) { - return Not supported in this browser.; + return Not supported in this browser.; } if (permission === 'granted') { @@ -152,21 +142,22 @@ function NotificationsSection() { }; return ( -
    +
    + Notification & Sound Show notifications when new messages arrive.} + content={Show desktop notification when new messages arrive.} /> { toggleNotificationSounds(); updateState({}); }} /> )} - content={Play a sound when new messages arrive.} + content={Play sound when new messages arrive.} />
    ); @@ -174,153 +165,173 @@ function NotificationsSection() { function SecuritySection() { return ( -
    - - Use this device ID-key combo to verify or manage this session from Element client.} - /> - - Export end-to-end encryption room keys to decrypt old messages in other session. In order to encrypt keys you need to set a password, which will be used while importing. - - - )} - /> - - {'To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you\'ll have to enter the password you set in order to decrypt it.'} - - - )} - /> +
    +
    + Device Info + + Use this device ID-key combo to verify or manage this session from Element client.} + /> +
    +
    + Encryption + + Export end-to-end encryption room keys to decrypt old messages in other session. In order to encrypt keys you need to set a password, which will be used while importing. + + + )} + /> + + {'To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you\'ll have to enter the password you set in order to decrypt it.'} + + + )} + /> +
    ); } function AboutSection() { return ( -
    -
    - Cinny logo -
    - - Cinny - {`v${cons.version}`} - - Yet another matrix client +
    +
    + Application +
    + Cinny logo +
    + + Cinny + {`v${cons.version}`} + + Yet another matrix client -
    - - +
    + + +
    -
    - Credits - +
    + Credits +
    + +
    ); } -function Settings({ isOpen, onRequestClose }) { - const settingSections = [{ - name: 'General', - iconSrc: SettingsIC, - render() { - return ; - }, - }, { - name: 'Appearance', - iconSrc: SunIC, - render() { - return ; - }, - }, { - name: 'Notifications', - iconSrc: BellIC, - render() { - return ; - }, - }, { - name: 'Security & Privacy', - iconSrc: LockIC, - render() { - return ; - }, - }, { - name: 'Help & About', - iconSrc: InfoIC, - render() { - return ; - }, - }]; - const [selectedSection, setSelectedSection] = useState(settingSections[0]); +const tabText = { + APPEARANCE: 'Appearance', + NOTIFICATIONS: 'Notifications', + SECURITY: 'Security', + ABOUT: 'About', +}; +const tabItems = [{ + text: tabText.APPEARANCE, + iconSrc: SunIC, + disabled: false, + render: () => , +}, { + text: tabText.NOTIFICATIONS, + iconSrc: BellIC, + disabled: false, + render: () => , +}, { + text: tabText.SECURITY, + iconSrc: LockIC, + disabled: false, + render: () => , +}, { + text: tabText.ABOUT, + iconSrc: InfoIC, + disabled: false, + render: () => , +}]; +function useWindowToggle(setSelectedTab) { + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + const openSettings = (tab) => { + const tabItem = tabItems.find((item) => item.text === tab); + if (tabItem) setSelectedTab(tabItem); + setIsOpen(true); + }; + navigation.on(cons.events.navigation.SETTINGS_OPENED, openSettings); + return () => { + navigation.removeListener(cons.events.navigation.SETTINGS_OPENED, openSettings); + }; + }, []); + + const requestClose = () => setIsOpen(false); + + return [isOpen, requestClose]; +} + +function Settings() { + const [selectedTab, setSelectedTab] = useState(tabItems[0]); + const [isOpen, requestClose] = useWindowToggle(setSelectedTab); + + const handleTabChange = (tabItem) => setSelectedTab(tabItem); const handleLogout = () => { if (confirm('Confirm logout')) logout(); }; return ( Settings} + contentOptions={( <> - { - settingSections.map((section) => ( - setSelectedSection(section)} - iconSrc={section.iconSrc} - > - {section.name} - - )) - } - + + )} - contentOptions={} + onRequestClose={requestClose} > - {selectedSection.render()} + {isOpen && ( +
    + + tab.text === selectedTab.text)} + onSelect={handleTabChange} + /> +
    + { selectedTab.render() } +
    +
    + )}
    ); } -Settings.propTypes = { - isOpen: PropTypes.bool.isRequired, - onRequestClose: PropTypes.func.isRequired, -}; - export default Settings; diff --git a/src/app/organisms/settings/Settings.scss b/src/app/organisms/settings/Settings.scss index 54451222..2d086c6d 100644 --- a/src/app/organisms/settings/Settings.scss +++ b/src/app/organisms/settings/Settings.scss @@ -2,58 +2,86 @@ @use '../../partials/dir'; .settings-window { - & .pw__drawer__content { - @extend .cp-fx__column; - min-height: 100%; - padding-bottom: var(--sp-extra-tight); + & .pw { + background-color: var(--bg-surface-low); + } + + .header .btn-danger { + margin: 0 var(--sp-tight); + box-shadow: none; + } - & > .pw-content-selector:last-child { - margin-top: auto; + & .profile-editor { + padding: var(--sp-loose) var(--sp-extra-loose); + } + + & .tabs__content { + padding: 0 var(--sp-normal); + } + + &__cards-wrapper { + padding: 0 var(--sp-normal); + @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); + } +} +.settings-window__card { + margin: var(--sp-normal) 0; + background-color: var(--bg-surface); + border-radius: var(--bo-radius); + box-shadow: var(--bs-surface-border); + overflow: hidden; + + & > .context-menu__header:first-child { + margin-top: 2px; + } +} +.settings-appearance__card, +.settings-notifications, +.settings-security__card, +.settings-about__card { + @extend .settings-window__card; +} + +.settings-window__cards-wrapper{ + & .setting-tile { + margin: 0 var(--sp-normal); + margin-top: var(--sp-normal); + padding-bottom: 16px; + border-bottom: 1px solid var(--bg-surface-border); + &:last-child { + border-bottom: none; } } - & .pw__content-container { - min-height: 100%; - } } -.settings-content { - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - - & .setting-tile { - margin-top: var(--sp-normal); - border-bottom: 1px solid var(--bg-surface-border); - padding-bottom: 16px; - } -} - -.set-notifications { +.settings-notifications { &__not-supported { padding: 0 var(--sp-ultra-tight); } } -.set-about { +.settings-about { &__branding { - margin-top: var(--sp-extra-tight); - margin-bottom: var(--sp-normal); + padding: var(--sp-normal); display: flex; - + & > div { margin: 0 var(--sp-loose); } - + } &__btns { - margin: 0; - margin-top: var(--sp-normal); - & button:last-child { - margin: 0 var(--sp-tight) + & button { + margin-top: var(--sp-tight); + @include dir.side(margin, 0, var(--sp-tight)); } } - + &__credits { - margin-top: var(--sp-loose); + padding: 0 var(--sp-normal); & ul { + color: var(--tc-surface-low); + padding: var(--sp-normal); margin: var(--sp-extra-tight) 0; } } diff --git a/src/app/organisms/space-settings/SpaceSettings.scss b/src/app/organisms/space-settings/SpaceSettings.scss index 501deedb..987f23b8 100644 --- a/src/app/organisms/space-settings/SpaceSettings.scss +++ b/src/app/organisms/space-settings/SpaceSettings.scss @@ -7,14 +7,10 @@ & .room-profile { padding: var(--sp-loose) var(--sp-extra-loose); - } + } - & .tabs { - box-shadow: inset 0 -1px 0 var(--bg-surface-border); - - &__content { - padding: 0 var(--sp-normal); - } + & .tabs__content { + padding: 0 var(--sp-normal); } &__cards-wrapper { diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index c145502a..d94044d1 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -95,9 +95,10 @@ export function openProfileViewer(userId, roomId) { }); } -export function openSettings() { +export function openSettings(tabText) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SETTINGS, + tabText, }); } diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 88de35fb..06871e92 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -129,12 +129,13 @@ class Navigation extends EventEmitter { this.emit(cons.events.navigation.PROFILE_VIEWER_OPENED, action.userId, action.roomId); }, [cons.actions.navigation.OPEN_SETTINGS]: () => { - this.emit(cons.events.navigation.SETTINGS_OPENED); + this.emit(cons.events.navigation.SETTINGS_OPENED, action.tabText); }, [cons.actions.navigation.OPEN_EMOJIBOARD]: () => { this.emit( cons.events.navigation.EMOJIBOARD_OPENED, - action.cords, action.requestEmojiCallback, + action.cords, + action.requestEmojiCallback, ); }, [cons.actions.navigation.OPEN_READRECEIPTS]: () => { From dd6dbd25dac732f49476efc4a0fcc68369ee91c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 19:02:26 +0530 Subject: [PATCH 014/824] Bump node from 17.7.1-alpine3.15 to 17.7.2-alpine3.15 (#410) Bumps node from 17.7.1-alpine3.15 to 17.7.2-alpine3.15. --- updated-dependencies: - dependency-name: node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9b0e06f5..ce60c778 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:17.7.1-alpine3.15 as builder +FROM node:17.7.2-alpine3.15 as builder WORKDIR /src From 49ade03a9ac1744ec34c983a14a74f5c080e3266 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 19:03:15 +0530 Subject: [PATCH 015/824] Bump html-react-parser from 1.4.8 to 1.4.9 (#408) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 1.4.8 to 1.4.9. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v1.4.8...v1.4.9) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5ed0cbc..3c7df279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.8", + "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^15.6.0", "micromark": "^3.0.10", @@ -5362,9 +5362,9 @@ ] }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, @@ -7249,11 +7249,11 @@ } }, "node_modules/html-dom-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.0.tgz", - "integrity": "sha512-x3MOz8S8BkihGgggtp2N0U+JAWlD9iGERbjuBJH+gIGF9B1kGQh5x489IQ0YPqi8HyMIWCRLdJY1q3IaQlqG/Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.1.tgz", + "integrity": "sha512-ddijSO0GluZEdlLNmiAjFI+CkAgzUgf8n3vpitQhvlsniPMbCSWtu+QYmioaVmEN0stytm9C38p6SsTDthv0cA==", "dependencies": { - "domhandler": "4.3.0", + "domhandler": "4.3.1", "htmlparser2": "7.2.0" } }, @@ -7334,12 +7334,12 @@ } }, "node_modules/html-react-parser": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.8.tgz", - "integrity": "sha512-5XsBdFVhJLxdtRp7tWwZ6DwqOt6fJ+2lJc0lctwjX1yaxWNB41S5uzqii7vJcSCaabM+CK28U75e5f4wIMqdSg==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.9.tgz", + "integrity": "sha512-V45RVd7GEGtk5bmL9iBV/AkaTE6jj9uhvUrJ/cWlq06DrcMzvz2kqMeZfWEV2pIWkRDzLAqrotCfmFSvdTjpHA==", "dependencies": { - "domhandler": "4.3.0", - "html-dom-parser": "1.1.0", + "domhandler": "4.3.1", + "html-dom-parser": "1.1.1", "react-property": "2.0.0", "style-to-js": "1.1.0" }, @@ -18188,9 +18188,9 @@ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } @@ -19693,11 +19693,11 @@ } }, "html-dom-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.0.tgz", - "integrity": "sha512-x3MOz8S8BkihGgggtp2N0U+JAWlD9iGERbjuBJH+gIGF9B1kGQh5x489IQ0YPqi8HyMIWCRLdJY1q3IaQlqG/Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.1.tgz", + "integrity": "sha512-ddijSO0GluZEdlLNmiAjFI+CkAgzUgf8n3vpitQhvlsniPMbCSWtu+QYmioaVmEN0stytm9C38p6SsTDthv0cA==", "requires": { - "domhandler": "4.3.0", + "domhandler": "4.3.1", "htmlparser2": "7.2.0" }, "dependencies": { @@ -19751,12 +19751,12 @@ } }, "html-react-parser": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.8.tgz", - "integrity": "sha512-5XsBdFVhJLxdtRp7tWwZ6DwqOt6fJ+2lJc0lctwjX1yaxWNB41S5uzqii7vJcSCaabM+CK28U75e5f4wIMqdSg==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.9.tgz", + "integrity": "sha512-V45RVd7GEGtk5bmL9iBV/AkaTE6jj9uhvUrJ/cWlq06DrcMzvz2kqMeZfWEV2pIWkRDzLAqrotCfmFSvdTjpHA==", "requires": { - "domhandler": "4.3.0", - "html-dom-parser": "1.1.0", + "domhandler": "4.3.1", + "html-dom-parser": "1.1.1", "react-property": "2.0.0", "style-to-js": "1.1.0" } diff --git a/package.json b/package.json index ff163851..d9963821 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.8", + "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^15.6.0", "micromark": "^3.0.10", From 7291932a0bca78525b326ded604b74b390390498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 19:03:38 +0530 Subject: [PATCH 016/824] Bump @babel/core from 7.17.7 to 7.17.8 (#407) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.7 to 7.17.8. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.17.8/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c7df279..cfe095c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "^14.0.1" }, "devDependencies": { - "@babel/core": "^7.17.7", + "@babel/core": "^7.17.8", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", @@ -115,9 +115,9 @@ } }, "node_modules/@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -125,8 +125,8 @@ "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -483,9 +483,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", @@ -511,9 +511,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", - "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -14120,9 +14120,9 @@ "dev": true }, "@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", @@ -14130,8 +14130,8 @@ "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -14397,9 +14397,9 @@ } }, "@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { "@babel/template": "^7.16.7", @@ -14419,9 +14419,9 @@ } }, "@babel/parser": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", - "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { diff --git a/package.json b/package.json index d9963821..bb72ca56 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "twemoji": "^14.0.1" }, "devDependencies": { - "@babel/core": "^7.17.7", + "@babel/core": "^7.17.8", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", From fe997d8b01826b02b57604f8da3dd0086bb0eacf Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:33:19 +0530 Subject: [PATCH 017/824] Fix loading on older browsers (#424) --- src/util/sort.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/sort.js b/src/util/sort.js index 72ba3c43..f9a0b790 100644 --- a/src/util/sort.js +++ b/src/util/sort.js @@ -13,8 +13,8 @@ export function roomIdByAtoZ(aId, bId) { // remove "#" from the room name // To ignore it in sorting - aName = aName.replaceAll('#', ''); - bName = bName.replaceAll('#', ''); + aName = aName.replace(/#/g, ''); + bName = bName.replace(/#/g, ''); if (aName.toLowerCase() < bName.toLowerCase()) { return -1; From 005434f79b3c003da390bf7f25e8178d60d90ec7 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:44:38 +0530 Subject: [PATCH 018/824] Add support for managing sessions (#415) * Allow node type prop in setting tile Signed-off-by: Ajay Bura * Update popup window max height Signed-off-by: Ajay Bura * Add device management setting Signed-off-by: Ajay Bura * Add password based login Signed-off-by: Ajay Bura * truncate long list of verified devices Signed-off-by: Ajay Bura --- .../molecules/popup-window/PopupWindow.scss | 2 +- .../molecules/setting-tile/SettingTile.jsx | 8 +- src/app/organisms/settings/DeviceManage.jsx | 219 ++++++++++++++++++ src/app/organisms/settings/DeviceManage.scss | 18 ++ src/app/organisms/settings/Settings.jsx | 10 +- src/app/organisms/settings/Settings.scss | 1 + 6 files changed, 251 insertions(+), 7 deletions(-) create mode 100644 src/app/organisms/settings/DeviceManage.jsx create mode 100644 src/app/organisms/settings/DeviceManage.scss diff --git a/src/app/molecules/popup-window/PopupWindow.scss b/src/app/molecules/popup-window/PopupWindow.scss index 421c9bbc..2d72963f 100644 --- a/src/app/molecules/popup-window/PopupWindow.scss +++ b/src/app/molecules/popup-window/PopupWindow.scss @@ -1,7 +1,7 @@ @use '../../partials/dir'; .pw-model { - --modal-height: 656px; + --modal-height: 774px; max-height: var(--modal-height) !important; height: 100%; } diff --git a/src/app/molecules/setting-tile/SettingTile.jsx b/src/app/molecules/setting-tile/SettingTile.jsx index 15ab5384..6b221965 100644 --- a/src/app/molecules/setting-tile/SettingTile.jsx +++ b/src/app/molecules/setting-tile/SettingTile.jsx @@ -9,7 +9,11 @@ function SettingTile({ title, options, content }) {
    - {title} + { + typeof title === 'string' + ? {title} + : title + }
    {content}
    @@ -24,7 +28,7 @@ SettingTile.defaultProps = { }; SettingTile.propTypes = { - title: PropTypes.string.isRequired, + title: PropTypes.node.isRequired, options: PropTypes.node, content: PropTypes.node, }; diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx new file mode 100644 index 00000000..ccc6c478 --- /dev/null +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -0,0 +1,219 @@ +import React, { useState, useEffect } from 'react'; +import './DeviceManage.scss'; +import dateFormat from 'dateformat'; + +import initMatrix from '../../../client/initMatrix'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import IconButton from '../../atoms/button/IconButton'; +import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; +import Spinner from '../../atoms/spinner/Spinner'; +import SettingTile from '../../molecules/setting-tile/SettingTile'; + +import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; +import BinIC from '../../../../public/res/ic/outlined/bin.svg'; + +import { useStore } from '../../hooks/useStore'; + +function useDeviceList() { + const mx = initMatrix.matrixClient; + const [deviceList, setDeviceList] = useState(null); + + useEffect(() => { + let isMounted = true; + + const updateDevices = () => mx.getDevices().then((data) => { + if (!isMounted) return; + setDeviceList(data.devices || []); + }); + updateDevices(); + + const handleDevicesUpdate = (users) => { + if (users.includes(mx.getUserId())) { + updateDevices(); + } + }; + + mx.on('crypto.devicesUpdated', handleDevicesUpdate); + return () => { + mx.removeListener('crypto.devicesUpdated', handleDevicesUpdate); + isMounted = false; + }; + }, []); + return deviceList; +} + +function isCrossVerified(deviceId) { + try { + const mx = initMatrix.matrixClient; + const crossSignInfo = mx.getStoredCrossSigningForUser(mx.getUserId()); + const deviceInfo = mx.getStoredDevice(mx.getUserId(), deviceId); + const deviceTrust = crossSignInfo.checkDeviceTrust(crossSignInfo, deviceInfo, false, true); + return deviceTrust.isCrossSigningVerified(); + } catch { + return false; + } +} + +function DeviceManage() { + const TRUNCATED_COUNT = 4; + const mx = initMatrix.matrixClient; + const deviceList = useDeviceList(); + const [processing, setProcessing] = useState([]); + const [truncated, setTruncated] = useState(true); + const mountStore = useStore(); + mountStore.setItem(true); + + useEffect(() => { + setProcessing([]); + }, [deviceList]); + + const addToProcessing = (device) => { + const old = [...processing]; + old.push(device.device_id); + setProcessing(old); + }; + + const removeFromProcessing = () => { + setProcessing([]); + }; + + if (deviceList === null) { + return ( +
    +
    + + Loading devices... +
    +
    + ); + } + + const handleRename = async (device) => { + const newName = window.prompt('Edit session name', device.display_name); + if (newName === null || newName.trim() === '') return; + if (newName.trim() === device.display_name) return; + addToProcessing(device); + try { + await mx.setDeviceDetails(device.device_id, { + display_name: newName, + }); + } catch { + if (!mountStore.getItem()) return; + removeFromProcessing(device); + } + }; + + const handleRemove = async (device, auth = undefined) => { + if (auth === undefined + ? window.confirm(`You are about to logout "${device.display_name}" session?`) + : true + ) { + addToProcessing(device); + try { + await mx.deleteDevice(device.device_id, auth); + } catch (e) { + if (e.httpStatus === 401 && e.data?.flows) { + const { flows } = e.data; + const flow = flows.find((f) => f.stages.includes('m.login.password')); + if (flow) { + const password = window.prompt('Please enter account password', ''); + if (password && password.trim() !== '') { + handleRemove(device, { + session: e.data.session, + type: 'm.login.password', + password, + identifier: { + type: 'm.id.user', + user: mx.getUserId(), + }, + }); + return; + } + } + } + window.alert('Failed to remove session!'); + if (!mountStore.getItem()) return; + removeFromProcessing(device); + } + } + }; + + const renderDevice = (device, isVerified) => { + const deviceId = device.device_id; + const displayName = device.display_name; + const lastIP = device.last_seen_ip; + const lastTS = device.last_seen_ts; + return ( + + {displayName} + {` — ${deviceId}${mx.deviceId === deviceId ? ' (current)' : ''}`} + + )} + options={ + processing.includes(deviceId) + ? + : ( + <> + handleRename(device)} src={PencilIC} tooltip="Rename" /> + handleRemove(device)} src={BinIC} tooltip="Remove session" /> + + ) + } + content={( + + Last activity + + {dateFormat(new Date(lastTS), ' hh:MM TT, dd/mm/yyyy')} + + {lastIP ? ` at ${lastIP}` : ''} + + )} + /> + ); + }; + + const unverified = []; + const verified = []; + deviceList.sort((a, b) => b.last_seen_ts - a.last_seen_ts).forEach((device) => { + if (isCrossVerified(device.device_id)) verified.push(device); + else unverified.push(device); + }); + return ( +
    +
    + Unverified sessions + { + unverified.length > 0 + ? unverified.map((device) => renderDevice(device, false)) + : No unverified session + } +
    +
    + Verified sessions + { + verified.length > 0 + ? verified.map((device, index) => { + if (truncated && index >= TRUNCATED_COUNT) return null; + return renderDevice(device, true); + }) + : No verified session + } + { verified.length > TRUNCATED_COUNT && ( + + )} + { deviceList.length > 0 && ( + Session names are visible to everyone, so do not put any private info here. + )} +
    +
    + ); +} + +export default DeviceManage; diff --git a/src/app/organisms/settings/DeviceManage.scss b/src/app/organisms/settings/DeviceManage.scss new file mode 100644 index 00000000..0daf2e61 --- /dev/null +++ b/src/app/organisms/settings/DeviceManage.scss @@ -0,0 +1,18 @@ +@use '../../partials/flex'; + +.device-manage { + &__loading { + @extend .cp-fx__row--c-c; + padding: var(--sp-extra-loose) var(--sp-normal); + + .text { + margin: 0 var(--sp-normal); + } + } + &__info { + margin: var(--sp-normal); + } + & .setting-tile:last-of-type { + border-bottom: none; + } +} \ No newline at end of file diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 84013cc9..acfef5c9 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -26,6 +26,7 @@ import ImportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/Impor import ExportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys'; import ProfileEditor from '../profile-editor/ProfileEditor'; +import DeviceManage from './DeviceManage'; import SunIC from '../../../../public/res/ic/outlined/sun.svg'; import LockIC from '../../../../public/res/ic/outlined/lock.svg'; @@ -167,15 +168,16 @@ function SecuritySection() { return (
    - Device Info + Session Info Use this device ID-key combo to verify or manage this session from Element client.} + title={`Session key: ${initMatrix.matrixClient.getDeviceEd25519Key().match(/.{1,4}/g).join(' ')}`} + content={Use this session ID-key combo to verify or manage this session.} />
    +
    Encryption Date: Wed, 23 Mar 2022 18:44:53 +0530 Subject: [PATCH 019/824] Fix crash on load and room creation (#418) Signed-off-by: Ajay Bura --- src/app/molecules/room-notification/RoomNotification.jsx | 7 ++++++- src/client/state/Notifications.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/room-notification/RoomNotification.jsx b/src/app/molecules/room-notification/RoomNotification.jsx index 26d123bc..0a3619f1 100644 --- a/src/app/molecules/room-notification/RoomNotification.jsx +++ b/src/app/molecules/room-notification/RoomNotification.jsx @@ -35,7 +35,12 @@ const items = [{ function setRoomNotifType(roomId, newType) { const mx = initMatrix.matrixClient; const { notifications } = initMatrix; - const roomPushRule = mx.getRoomPushRule('global', roomId); + let roomPushRule; + try { + roomPushRule = mx.getRoomPushRule('global', roomId); + } catch { + roomPushRule = undefined; + } const promises = []; if (newType === cons.notifs.MUTE) { diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 96338526..512b3e76 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -83,7 +83,12 @@ class Notifications extends EventEmitter { getNotiType(roomId) { const mx = this.matrixClient; - const pushRule = mx.getRoomPushRule('global', roomId); + let pushRule; + try { + pushRule = mx.getRoomPushRule('global', roomId); + } catch { + pushRule = undefined; + } if (pushRule === undefined) { const overrideRules = mx.getAccountData('m.push_rules')?.getContent()?.global?.override; From 0f97de1b09873e6fc58a75034caf7828646eaa31 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:45:13 +0530 Subject: [PATCH 020/824] Fix can't open spaces from public room list (#419) Signed-off-by: Ajay Bura --- src/app/organisms/public-rooms/PublicRooms.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/app/organisms/public-rooms/PublicRooms.jsx b/src/app/organisms/public-rooms/PublicRooms.jsx index 23401298..467f38d5 100644 --- a/src/app/organisms/public-rooms/PublicRooms.jsx +++ b/src/app/organisms/public-rooms/PublicRooms.jsx @@ -4,7 +4,7 @@ import './PublicRooms.scss'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; -import { selectRoom } from '../../../client/action/navigation'; +import { selectRoom, selectTab } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; @@ -179,7 +179,9 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) { }, [joiningRooms]); function handleViewRoom(roomId) { - selectRoom(roomId); + const room = initMatrix.matrixClient.getRoom(roomId); + if (room.isSpaceRoom()) selectTab(roomId); + else selectRoom(roomId); onRequestClose(); } @@ -193,7 +195,7 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) { return rooms.map((room) => { const alias = typeof room.canonical_alias === 'string' ? room.canonical_alias : room.room_id; const name = typeof room.name === 'string' ? room.name : alias; - const isJoined = initMatrix.roomList.rooms.has(room.room_id); + const isJoined = initMatrix.matrixClient.getRoom(room.room_id) !== null; return ( Date: Wed, 23 Mar 2022 18:46:35 +0530 Subject: [PATCH 021/824] Bump node-forge from 1.2.1 to 1.3.0 (#416) Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/digitalbazaar/forge/releases) - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: node-forge dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cfe095c6..fcec8ba2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9822,9 +9822,9 @@ } }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -21566,9 +21566,9 @@ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true }, "node-releases": { From 05eaa8d3e05eb05642faa63157f6343d034c160a Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 23 Mar 2022 19:40:39 +0530 Subject: [PATCH 022/824] General fix and consistency changes (#428) --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.yml | 1 - .github/workflows/build-pull-request.yml | 2 +- .github/workflows/deploy-pull-request.yml | 4 ++-- .github/workflows/netlify-dev.yaml | 10 ++++++---- .github/workflows/prod-deploy.yaml | 6 +++--- LICENSE | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 517d390e..f3f6ef3d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,4 @@ name: 🐞 Bug Report -title: '[bug] ' description: Report a bug labels: 'type: bug' diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index d45af200..7026f957 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,4 @@ name: 💡 Feature Request -title: '[feat] ' description: Suggest an idea labels: 'type: feature' diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index dbc72223..71c78511 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -10,7 +10,7 @@ jobs: env: PR_NUMBER: ${{github.event.number}} steps: - - name: Check out the repo + - name: Checkout repository uses: actions/checkout@v3.0.0 - name: Build app run: npm ci && npm run build diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index c30233eb..6894bad3 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -13,7 +13,7 @@ jobs: # There's a 'download artifact' action but it hasn't been updated for the # workflow_run action (https://github.com/actions/download-artifact/issues/60) # so instead we get this mess: - - name: 'Download artifact' + - name: Download artifact uses: actions/github-script@v6.0.0 with: script: | @@ -46,7 +46,7 @@ jobs: fs.writeFileSync('${{github.workspace}}/pr.json.zip', Buffer.from(download.data)); - name: Extract Artifacts run: unzip -d dist previewbuild.zip && rm previewbuild.zip && unzip pr.json.zip && rm pr.json.zip - - name: 'Read PR Info' + - name: Read PR Info id: readctx uses: actions/github-script@v6.0.0 with: diff --git a/.github/workflows/netlify-dev.yaml b/.github/workflows/netlify-dev.yaml index aa9dd410..d1100ebf 100644 --- a/.github/workflows/netlify-dev.yaml +++ b/.github/workflows/netlify-dev.yaml @@ -6,13 +6,15 @@ on: - dev jobs: - deploy: + deploy-to-netlify: name: 'Deploy' runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3.0.0 - - uses: jsmrcaga/action-netlify-deploy@v1.7.2 + steps: + - name: Checkout repository + uses: actions/checkout@v3.0.0 + - name: Build and deploy to Netlify + uses: jsmrcaga/action-netlify-deploy@v1.7.2 with: install_command: "npm ci" NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} diff --git a/.github/workflows/prod-deploy.yaml b/.github/workflows/prod-deploy.yaml index 91e14497..ff0c6ab6 100644 --- a/.github/workflows/prod-deploy.yaml +++ b/.github/workflows/prod-deploy.yaml @@ -9,7 +9,7 @@ jobs: name: 'Deploy to Netlify' runs-on: ubuntu-latest steps: - - name: Check out the repo + - name: Checkout repository uses: actions/checkout@v3.0.0 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@v1.7.2 @@ -26,7 +26,7 @@ jobs: - name: Create tar.gz run: tar -czvf cinny-${{ steps.vars.outputs.tag }}.tar.gz dist - name: Upload tagged release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v0.1.14 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz @@ -35,7 +35,7 @@ jobs: name: Push Docker image to Docker Hub runs-on: ubuntu-latest steps: - - name: Check out the repo + - name: Checkout repository uses: actions/checkout@v3.0.0 - name: Login to Docker Hub uses: docker/login-action@v1.14.1 diff --git a/LICENSE b/LICENSE index 42d4c6ca..fc638515 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Ajay Bura (ajbura) and other contributors +Copyright (c) 2021 Ajay Bura (ajbura) and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 30f89307731bb6242821ea91e8f00598dae06d5e Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Thu, 24 Mar 2022 18:47:53 +0530 Subject: [PATCH 023/824] Fix style and string Signed-off-by: Ajay Bura --- src/app/organisms/create-room/CreateRoom.jsx | 2 +- src/app/organisms/room/RoomViewCmdBar.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/organisms/create-room/CreateRoom.jsx b/src/app/organisms/create-room/CreateRoom.jsx index 03dba8ec..ac344b09 100644 --- a/src/app/organisms/create-room/CreateRoom.jsx +++ b/src/app/organisms/create-room/CreateRoom.jsx @@ -210,7 +210,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { /> )} content={( - Override the default (100) power level. + Founder (101) override the default Admin (100) power level. )} /> diff --git a/src/app/organisms/room/RoomViewCmdBar.scss b/src/app/organisms/room/RoomViewCmdBar.scss index 498c2359..3f03fb06 100644 --- a/src/app/organisms/room/RoomViewCmdBar.scss +++ b/src/app/organisms/room/RoomViewCmdBar.scss @@ -10,7 +10,7 @@ &__info { display: flex; width: 40px; - @include dir.side(margin, 10px, 14px); + @include dir.side(margin, 14px, 10px); & > * { margin: auto; From 9cb13a91cd889320f5044c1921d9a48c1d6a2091 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 25 Mar 2022 10:37:35 +0530 Subject: [PATCH 024/824] Fix incorrect custom html crashing app (#429) Signed-off-by: Ajay Bura --- src/app/molecules/message/Message.jsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index f5e3e2b2..5a906f0d 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -186,9 +186,17 @@ const MessageBody = React.memo(({ // if body is not string it is a React element. if (typeof body !== 'string') return
    {body}
    ; - let content = isCustomHTML - ? twemojify(sanitizeCustomHtml(body), undefined, true, false) - : twemojify(body, undefined, true); + let content = null; + if (isCustomHTML) { + try { + content = twemojify(sanitizeCustomHtml(body), undefined, true, false); + } catch { + console.error('Malformed custom html: ', body); + content = twemojify(body, undefined); + } + } else { + content = twemojify(body, undefined, true); + } // Determine if this message should render with large emojis // Criteria: From 8d25eb0acd604422296e6d8723554bc7d11c18c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:32:46 +0530 Subject: [PATCH 025/824] Bump node from 17.7.2-alpine3.15 to 17.8.0-alpine3.15 (#442) Bumps node from 17.7.2-alpine3.15 to 17.8.0-alpine3.15. --- updated-dependencies: - dependency-name: node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ce60c778..70658f61 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:17.7.2-alpine3.15 as builder +FROM node:17.8.0-alpine3.15 as builder WORKDIR /src From 16ee13f1f773b6f072c964b8ee412ab7abb19514 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:33:01 +0530 Subject: [PATCH 026/824] Bump eslint from 8.11.0 to 8.12.0 (#439) Bumps [eslint](https://github.com/eslint/eslint) from 8.11.0 to 8.12.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.11.0...v8.12.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcec8ba2..cef16d62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.11.0", + "eslint": "^8.12.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -5634,9 +5634,9 @@ } }, "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.2.1", @@ -18404,9 +18404,9 @@ "dev": true }, "eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "requires": { "@eslint/eslintrc": "^1.2.1", diff --git a/package.json b/package.json index bb72ca56..15f71694 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.11.0", + "eslint": "^8.12.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsx-a11y": "^6.4.1", From 9d15445eba0c68819c910a7bed4c77301f52ef99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:33:20 +0530 Subject: [PATCH 027/824] Bump @fontsource/roboto from 4.5.3 to 4.5.5 (#438) Bumps [@fontsource/roboto](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/roboto) from 4.5.3 to 4.5.5. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/roboto) --- updated-dependencies: - dependency-name: "@fontsource/roboto" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index cef16d62..96561e49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.5", - "@fontsource/roboto": "^4.5.3", + "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", @@ -1822,9 +1822,9 @@ "integrity": "sha512-mWnePEroLfaJQWmynipzOVcH6JwT8Jta3+yLsC5Pm/snHBXnOiAOnjBqYjKnvXwJ4eUPt2AaAhyrtwCgWQRGOg==" }, "node_modules/@fontsource/roboto": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.3.tgz", - "integrity": "sha512-NUvBTj332dFRdiVkLlavXbDGoD2zyyeGYmMyrXOnctg/3e4pq95+rJgNfUP+k4v8UBk2L1aomGw9dDjbRdAmTg==" + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.5.tgz", + "integrity": "sha512-Pe1p+gAO6K0aLxBXlLoJRHVx352tVc/v/7DOnvM3t+FYXb+KUga9aCD1NpnDfd0kKnWXqrZyAXguyyFWDDuphw==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.3", @@ -15313,9 +15313,9 @@ "integrity": "sha512-mWnePEroLfaJQWmynipzOVcH6JwT8Jta3+yLsC5Pm/snHBXnOiAOnjBqYjKnvXwJ4eUPt2AaAhyrtwCgWQRGOg==" }, "@fontsource/roboto": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.3.tgz", - "integrity": "sha512-NUvBTj332dFRdiVkLlavXbDGoD2zyyeGYmMyrXOnctg/3e4pq95+rJgNfUP+k4v8UBk2L1aomGw9dDjbRdAmTg==" + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.5.tgz", + "integrity": "sha512-Pe1p+gAO6K0aLxBXlLoJRHVx352tVc/v/7DOnvM3t+FYXb+KUga9aCD1NpnDfd0kKnWXqrZyAXguyyFWDDuphw==" }, "@humanwhocodes/config-array": { "version": "0.9.3", diff --git a/package.json b/package.json index 15f71694..6c6f1a3c 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.5", - "@fontsource/roboto": "^4.5.3", + "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", From 7bce501069aa76cb5827ec3ae1be9795d8bd010a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:33:35 +0530 Subject: [PATCH 028/824] Bump babel-loader from 8.2.3 to 8.2.4 (#437) Bumps [babel-loader](https://github.com/babel/babel-loader) from 8.2.3 to 8.2.4. - [Release notes](https://github.com/babel/babel-loader/releases) - [Changelog](https://github.com/babel/babel-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel-loader/compare/v8.2.3...v8.2.4) --- updated-dependencies: - dependency-name: babel-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 59 +++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96561e49..86f77b57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.2.4", "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", @@ -3325,13 +3325,13 @@ "dev": true }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -8758,29 +8758,17 @@ } }, "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "node": ">=8.9.0" } }, "node_modules/locate-path": { @@ -16572,13 +16560,13 @@ "dev": true }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" } @@ -20838,25 +20826,14 @@ "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "json5": "^2.1.2" } }, "locate-path": { diff --git a/package.json b/package.json index 6c6f1a3c..72852d4d 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.2.4", "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", From 370c224d3a35b8c4bf5f74254c9a0d1d6067cafa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:44:22 +0530 Subject: [PATCH 029/824] Bump @fontsource/inter from 4.5.5 to 4.5.7 (#443) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.5 to 4.5.7. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86f77b57..7c0ace26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.8.2", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.5", + "@fontsource/inter": "^4.5.7", "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", @@ -1817,9 +1817,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.5.tgz", - "integrity": "sha512-mWnePEroLfaJQWmynipzOVcH6JwT8Jta3+yLsC5Pm/snHBXnOiAOnjBqYjKnvXwJ4eUPt2AaAhyrtwCgWQRGOg==" + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.7.tgz", + "integrity": "sha512-25k3thupaOEBexuU+jAkGqieKPbuhSuA+sinDwp1iBNhqQPiJ9QHDvsXgoCgCbZ4sGlE8aCwZmSlDJrPdJHNkw==" }, "node_modules/@fontsource/roboto": { "version": "4.5.5", @@ -15296,9 +15296,9 @@ } }, "@fontsource/inter": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.5.tgz", - "integrity": "sha512-mWnePEroLfaJQWmynipzOVcH6JwT8Jta3+yLsC5Pm/snHBXnOiAOnjBqYjKnvXwJ4eUPt2AaAhyrtwCgWQRGOg==" + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.7.tgz", + "integrity": "sha512-25k3thupaOEBexuU+jAkGqieKPbuhSuA+sinDwp1iBNhqQPiJ9QHDvsXgoCgCbZ4sGlE8aCwZmSlDJrPdJHNkw==" }, "@fontsource/roboto": { "version": "4.5.5", diff --git a/package.json b/package.json index 72852d4d..1a6a36e5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.5", + "@fontsource/inter": "^4.5.7", "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", From 7d508e5a7d1421dfb39737b52d18539cd7acb85b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:03:05 +0530 Subject: [PATCH 030/824] Bump matrix-js-sdk from 15.6.0 to 16.0.1 (#440) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 15.6.0 to 16.0.1. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v15.6.0...v16.0.1) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c0ace26..95b6d948 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "formik": "^2.2.9", "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^15.6.0", + "matrix-js-sdk": "^16.0.1", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-util-chunked": "^1.0.0", @@ -8895,9 +8895,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-15.6.0.tgz", - "integrity": "sha512-jxx2jiuFVs6Vn76/Nm4+9+mLRW8NJMnA8XhFPtG9gzLpAOq5NQeRvr8mvGQqOQp2F85wthGVd0EkiP6cC1JXuw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-16.0.1.tgz", + "integrity": "sha512-GRYZY7JZRqsVFa2nKO2qJbU4gQail2+1PgX2QDcibWizTL5Gh8YS384twprpIKqzdLHJ3d7H7A0L+uqc562ZsQ==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -20938,9 +20938,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-15.6.0.tgz", - "integrity": "sha512-jxx2jiuFVs6Vn76/Nm4+9+mLRW8NJMnA8XhFPtG9gzLpAOq5NQeRvr8mvGQqOQp2F85wthGVd0EkiP6cC1JXuw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-16.0.1.tgz", + "integrity": "sha512-GRYZY7JZRqsVFa2nKO2qJbU4gQail2+1PgX2QDcibWizTL5Gh8YS384twprpIKqzdLHJ3d7H7A0L+uqc562ZsQ==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 1a6a36e5..3a751fa1 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "formik": "^2.2.9", "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^15.6.0", + "matrix-js-sdk": "^16.0.1", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-util-chunked": "^1.0.0", From 1a6e3e73c5dc72a2f593f32725b7e977c39227ad Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 30 Mar 2022 13:42:52 +0530 Subject: [PATCH 031/824] String update and file extension name consistency (#436) * Fixes #434 * Fixes #433 * Prtially fixes #432 * Disable auto labelling of issues * Use yaml instead of yml as recommended by yaml.org * shortened the strings * simplified option description --- .github/{FUNDING.yml => FUNDING.yaml} | 0 .../ISSUE_TEMPLATE/{bug_report.yml => bug_report.yaml} | 3 +-- .github/ISSUE_TEMPLATE/{config.yml => config.yaml} | 0 .../{feature_request.yml => feature_request.yaml} | 3 +-- .github/{dependabot.yml => dependabot.yaml} | 6 +++--- ...{build-pull-request.yml => build-pull-request.yaml} | 0 ...eploy-pull-request.yml => deploy-pull-request.yaml} | 0 .github/workflows/netlify-dev.yaml | 2 +- .../room-history-visibility/RoomHistoryVisibility.jsx | 10 +++++----- src/app/organisms/create-room/CreateRoom.jsx | 2 +- src/app/organisms/room/RoomSettings.jsx | 2 +- src/app/organisms/room/RoomViewContent.jsx | 2 +- 12 files changed, 14 insertions(+), 16 deletions(-) rename .github/{FUNDING.yml => FUNDING.yaml} (100%) rename .github/ISSUE_TEMPLATE/{bug_report.yml => bug_report.yaml} (98%) rename .github/ISSUE_TEMPLATE/{config.yml => config.yaml} (100%) rename .github/ISSUE_TEMPLATE/{feature_request.yml => feature_request.yaml} (96%) rename .github/{dependabot.yml => dependabot.yaml} (93%) rename .github/workflows/{build-pull-request.yml => build-pull-request.yaml} (100%) rename .github/workflows/{deploy-pull-request.yml => deploy-pull-request.yaml} (100%) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yaml similarity index 100% rename from .github/FUNDING.yml rename to .github/FUNDING.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yaml similarity index 98% rename from .github/ISSUE_TEMPLATE/bug_report.yml rename to .github/ISSUE_TEMPLATE/bug_report.yaml index f3f6ef3d..76fc578a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,6 +1,5 @@ name: 🐞 Bug Report description: Report a bug -labels: 'type: bug' body: - type: markdown @@ -50,7 +49,7 @@ body: render: shell validations: required: true - + - type: textarea id: context attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yaml similarity index 100% rename from .github/ISSUE_TEMPLATE/config.yml rename to .github/ISSUE_TEMPLATE/config.yaml diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yaml similarity index 96% rename from .github/ISSUE_TEMPLATE/feature_request.yml rename to .github/ISSUE_TEMPLATE/feature_request.yaml index 7026f957..412d5181 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,6 +1,5 @@ name: 💡 Feature Request description: Suggest an idea -labels: 'type: feature' body: - type: textarea @@ -26,7 +25,7 @@ body: attributes: label: Alternatives considered description: "Any alternative solutions you've considered" - + - type: textarea id: context attributes: diff --git a/.github/dependabot.yml b/.github/dependabot.yaml similarity index 93% rename from .github/dependabot.yml rename to .github/dependabot.yaml index 63e94ac7..f49eabc9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yaml @@ -5,7 +5,7 @@ version: 2 updates: - package-ecosystem: github-actions directory: / - schedule: + schedule: interval: weekly day: "tuesday" time: "01:00" @@ -13,7 +13,7 @@ updates: - package-ecosystem: docker directory: / - schedule: + schedule: interval: weekly day: "tuesday" time: "01:00" @@ -21,7 +21,7 @@ updates: - package-ecosystem: npm directory: / - schedule: + schedule: interval: weekly day: "tuesday" time: "01:00" diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yaml similarity index 100% rename from .github/workflows/build-pull-request.yml rename to .github/workflows/build-pull-request.yaml diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yaml similarity index 100% rename from .github/workflows/deploy-pull-request.yml rename to .github/workflows/deploy-pull-request.yaml diff --git a/.github/workflows/netlify-dev.yaml b/.github/workflows/netlify-dev.yaml index d1100ebf..5a71fcdd 100644 --- a/.github/workflows/netlify-dev.yaml +++ b/.github/workflows/netlify-dev.yaml @@ -10,7 +10,7 @@ jobs: name: 'Deploy' runs-on: ubuntu-latest - steps: + steps: - name: Checkout repository uses: actions/checkout@v3.0.0 - name: Build and deploy to Netlify diff --git a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx index 766f7653..6a72a99b 100644 --- a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx +++ b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx @@ -17,19 +17,19 @@ const visibility = { const items = [{ iconSrc: null, - text: 'World readable (anyone can read)', + text: 'Anyone (including guests)', type: visibility.WORLD_READABLE, }, { iconSrc: null, - text: 'Member shared (since the point in time of selecting this option)', + text: 'Members (all messages)', type: visibility.SHARED, }, { iconSrc: null, - text: 'Member invited (since they were invited)', + text: 'Members (messages after invite)', type: visibility.INVITED, }, { iconSrc: null, - text: 'Member joined (since they joined)', + text: 'Members (messages after join)', type: visibility.JOINED, }]; @@ -87,7 +87,7 @@ function RoomHistoryVisibility({ roomId }) { )) } - Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged. + Changes to history visibility will only apply to future messages. The visibility of existing history will have no effect.
    ); } diff --git a/src/app/organisms/create-room/CreateRoom.jsx b/src/app/organisms/create-room/CreateRoom.jsx index ac344b09..15be02d2 100644 --- a/src/app/organisms/create-room/CreateRoom.jsx +++ b/src/app/organisms/create-room/CreateRoom.jsx @@ -210,7 +210,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { /> )} content={( - Founder (101) override the default Admin (100) power level. + Selecting Admin sets 100 power level whereas Founder sets 101. )} /> diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index bd083c13..0fb27221 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -123,7 +123,7 @@ function SecuritySettings({ roomId }) {
    - Message history visibility (Who can read history) + Message history visibility
    diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index dd77e989..96839b24 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -63,7 +63,7 @@ function genRoomIntro(mEvent, roomTimeline) { avatarSrc={avatarSrc} name={roomTimeline.room.name} heading={`Welcome to ${roomTimeline.room.name}`} - desc={`This is the beginning of ${roomTimeline.room.name} room.${typeof roomTopic !== 'undefined' ? (` Topic: ${roomTopic}`) : ''}`} + desc={`This is the beginning of the ${roomTimeline.room.name} room.${typeof roomTopic !== 'undefined' ? (` Topic: ${roomTopic}`) : ''}`} time={mEvent ? `Created at ${dateFormat(mEvent.getDate(), 'dd mmmm yyyy, hh:MM TT')}` : null} /> ); From 3a3a830706eb0f595d537f428814c9b7e2497332 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 30 Mar 2022 15:01:41 +0530 Subject: [PATCH 032/824] Reverting .yaml as some things doesn't work (#451) --- .github/{FUNDING.yaml => FUNDING.yml} | 0 .github/ISSUE_TEMPLATE/{bug_report.yaml => bug_report.yml} | 0 .github/ISSUE_TEMPLATE/{config.yaml => config.yml} | 0 .../ISSUE_TEMPLATE/{feature_request.yaml => feature_request.yml} | 0 .github/{dependabot.yaml => dependabot.yml} | 0 .../workflows/{build-pull-request.yaml => build-pull-request.yml} | 0 .../{deploy-pull-request.yaml => deploy-pull-request.yml} | 0 .github/workflows/{netlify-dev.yaml => netlify-dev.yml} | 0 .github/workflows/{prod-deploy.yaml => prod-deploy.yml} | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename .github/{FUNDING.yaml => FUNDING.yml} (100%) rename .github/ISSUE_TEMPLATE/{bug_report.yaml => bug_report.yml} (100%) rename .github/ISSUE_TEMPLATE/{config.yaml => config.yml} (100%) rename .github/ISSUE_TEMPLATE/{feature_request.yaml => feature_request.yml} (100%) rename .github/{dependabot.yaml => dependabot.yml} (100%) rename .github/workflows/{build-pull-request.yaml => build-pull-request.yml} (100%) rename .github/workflows/{deploy-pull-request.yaml => deploy-pull-request.yml} (100%) rename .github/workflows/{netlify-dev.yaml => netlify-dev.yml} (100%) rename .github/workflows/{prod-deploy.yaml => prod-deploy.yml} (100%) diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yml similarity index 100% rename from .github/FUNDING.yaml rename to .github/FUNDING.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug_report.yaml rename to .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/config.yaml rename to .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/feature_request.yaml rename to .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/dependabot.yaml b/.github/dependabot.yml similarity index 100% rename from .github/dependabot.yaml rename to .github/dependabot.yml diff --git a/.github/workflows/build-pull-request.yaml b/.github/workflows/build-pull-request.yml similarity index 100% rename from .github/workflows/build-pull-request.yaml rename to .github/workflows/build-pull-request.yml diff --git a/.github/workflows/deploy-pull-request.yaml b/.github/workflows/deploy-pull-request.yml similarity index 100% rename from .github/workflows/deploy-pull-request.yaml rename to .github/workflows/deploy-pull-request.yml diff --git a/.github/workflows/netlify-dev.yaml b/.github/workflows/netlify-dev.yml similarity index 100% rename from .github/workflows/netlify-dev.yaml rename to .github/workflows/netlify-dev.yml diff --git a/.github/workflows/prod-deploy.yaml b/.github/workflows/prod-deploy.yml similarity index 100% rename from .github/workflows/prod-deploy.yaml rename to .github/workflows/prod-deploy.yml From 44ab6f181c56856b0bb998a0c5284df73b8cd705 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 30 Mar 2022 18:38:52 +0530 Subject: [PATCH 033/824] Fix docker check to only run on Dockerfile change (#452) --- .github/workflows/build-pull-request.yml | 5 ----- .github/workflows/docker-pr.yml | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/docker-pr.yml diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 71c78511..d67ee15d 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -32,8 +32,3 @@ jobs: name: pr.json path: pr.json retention-days: 1 - - name: Build Docker image - uses: docker/build-push-action@v2.10.0 - with: - context: . - push: false diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml new file mode 100644 index 00000000..29f41cc1 --- /dev/null +++ b/.github/workflows/docker-pr.yml @@ -0,0 +1,20 @@ +name: 'Docker check' + +on: + pull_request: + paths: + - 'Dockerfile' + +jobs: + docker-build: + runs-on: ubuntu-latest + env: + PR_NUMBER: ${{github.event.number}} + steps: + - name: Checkout repository + uses: actions/checkout@v3.0.0 + - name: Build Docker image + uses: docker/build-push-action@v2.10.0 + with: + context: . + push: false From 53a8e2aa57b857d90580c420887772050e7b923f Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Thu, 31 Mar 2022 15:42:37 +0530 Subject: [PATCH 034/824] Increase Pull request limit for dependabot npm updates (#454) * Increase PR limit for dependabot * Make the invisible visible --- .github/dependabot.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f49eabc9..3683b106 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,8 +1,16 @@ # Docs: version: 2 - updates: + - package-ecosystem: npm + directory: / + schedule: + interval: weekly + day: "tuesday" + time: "01:00" + timezone: "Asia/Kolkata" + open-pull-requests-limit: 15 + - package-ecosystem: github-actions directory: / schedule: @@ -10,6 +18,7 @@ updates: day: "tuesday" time: "01:00" timezone: "Asia/Kolkata" + open-pull-requests-limit: 5 - package-ecosystem: docker directory: / @@ -18,11 +27,4 @@ updates: day: "tuesday" time: "01:00" timezone: "Asia/Kolkata" - - - package-ecosystem: npm - directory: / - schedule: - interval: weekly - day: "tuesday" - time: "01:00" - timezone: "Asia/Kolkata" + open-pull-requests-limit: 5 From 3f6e3074f2b3697dc63e170d1d018e60f004cc64 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:39:05 +0530 Subject: [PATCH 035/824] Add reusable dialog (#459) Signed-off-by: Ajay Bura --- src/app/molecules/dialog/Dialog.jsx | 5 +- src/app/molecules/dialog/Dialog.scss | 5 -- src/app/molecules/dialog/ReusableDialog.jsx | 49 +++++++++++++++++++ src/app/organisms/create-room/CreateRoom.scss | 1 + src/app/organisms/pw/Dialogs.jsx | 4 ++ .../organisms/read-receipts/ReadReceipts.jsx | 8 +-- src/client/action/navigation.js | 9 ++++ src/client/state/cons.js | 2 + src/client/state/navigation.js | 8 +++ 9 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 src/app/molecules/dialog/ReusableDialog.jsx diff --git a/src/app/molecules/dialog/Dialog.jsx b/src/app/molecules/dialog/Dialog.jsx index 93307dc7..637766a9 100644 --- a/src/app/molecules/dialog/Dialog.jsx +++ b/src/app/molecules/dialog/Dialog.jsx @@ -12,6 +12,7 @@ import RawModal from '../../atoms/modal/RawModal'; function Dialog({ className, isOpen, title, onAfterOpen, onAfterClose, contentOptions, onRequestClose, closeFromOutside, children, + invisibleScroll, }) { return (
    - +
    {children}
    @@ -55,6 +56,7 @@ Dialog.defaultProps = { onAfterClose: null, onRequestClose: null, closeFromOutside: true, + invisibleScroll: false, }; Dialog.propTypes = { @@ -67,6 +69,7 @@ Dialog.propTypes = { onRequestClose: PropTypes.func, closeFromOutside: PropTypes.bool, children: PropTypes.node.isRequired, + invisibleScroll: PropTypes.bool, }; export default Dialog; diff --git a/src/app/molecules/dialog/Dialog.scss b/src/app/molecules/dialog/Dialog.scss index dd4c4336..77e5f059 100644 --- a/src/app/molecules/dialog/Dialog.scss +++ b/src/app/molecules/dialog/Dialog.scss @@ -21,8 +21,3 @@ flex-direction: column; } } - -.dialog__content-container { - padding-top: var(--sp-extra-tight); - padding-bottom: var(--sp-extra-loose); -} \ No newline at end of file diff --git a/src/app/molecules/dialog/ReusableDialog.jsx b/src/app/molecules/dialog/ReusableDialog.jsx new file mode 100644 index 00000000..b05cafcf --- /dev/null +++ b/src/app/molecules/dialog/ReusableDialog.jsx @@ -0,0 +1,49 @@ +import React, { useState, useEffect } from 'react'; + +import cons from '../../../client/state/cons'; + +import navigation from '../../../client/state/navigation'; +import IconButton from '../../atoms/button/IconButton'; +import Dialog from './Dialog'; + +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; + +function ReusableDialog() { + const [isOpen, setIsOpen] = useState(false); + const [data, setData] = useState(null); + + useEffect(() => { + const handleOpen = (title, render, afterClose) => { + setIsOpen(true); + setData({ title, render, afterClose }); + }; + navigation.on(cons.events.navigation.REUSABLE_DIALOG_OPENED, handleOpen); + return () => { + navigation.removeListener(cons.events.navigation.REUSABLE_DIALOG_OPENED, handleOpen); + }; + }, []); + + const handleAfterClose = () => { + data.afterClose(); + setData(null); + }; + + const handleRequestClose = () => { + setIsOpen(false); + }; + + return ( + } + invisibleScroll + > + {data?.render(handleRequestClose) ||
    } +
    + ); +} + +export default ReusableDialog; diff --git a/src/app/organisms/create-room/CreateRoom.scss b/src/app/organisms/create-room/CreateRoom.scss index de9efdbd..ccd3ea3b 100644 --- a/src/app/organisms/create-room/CreateRoom.scss +++ b/src/app/organisms/create-room/CreateRoom.scss @@ -2,6 +2,7 @@ @use '../../partials/dir'; .create-room { + margin: var(--sp-normal); @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); &__form > * { diff --git a/src/app/organisms/pw/Dialogs.jsx b/src/app/organisms/pw/Dialogs.jsx index 5c5e115c..f29a8192 100644 --- a/src/app/organisms/pw/Dialogs.jsx +++ b/src/app/organisms/pw/Dialogs.jsx @@ -8,6 +8,8 @@ import Search from '../search/Search'; import ViewSource from '../view-source/ViewSource'; import CreateRoom from '../create-room/CreateRoom'; +import ReusableDialog from '../../molecules/dialog/ReusableDialog'; + function Dialogs() { return ( <> @@ -18,6 +20,8 @@ function Dialogs() { + + ); } diff --git a/src/app/organisms/read-receipts/ReadReceipts.jsx b/src/app/organisms/read-receipts/ReadReceipts.jsx index 715fafef..1e648e0b 100644 --- a/src/app/organisms/read-receipts/ReadReceipts.jsx +++ b/src/app/organisms/read-receipts/ReadReceipts.jsx @@ -64,9 +64,11 @@ function ReadReceipts() { onRequestClose={() => setIsOpen(false)} contentOptions={ setIsOpen(false)} tooltip="Close" />} > - { - readers.map(renderPeople) - } +
    + { + readers.map(renderPeople) + } +
    ); } diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index d94044d1..e16d25d2 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -150,3 +150,12 @@ export function openReusableContextMenu(placement, cords, render, afterClose) { afterClose, }); } + +export function openReusableDialog(title, render, afterClose) { + appDispatcher.dispatch({ + type: cons.actions.navigation.OPEN_REUSABLE_DIALOG, + title, + render, + afterClose, + }); +} diff --git a/src/client/state/cons.js b/src/client/state/cons.js index f7ffc8f9..4e258ac3 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -47,6 +47,7 @@ const cons = { CLICK_REPLY_TO: 'CLICK_REPLY_TO', OPEN_SEARCH: 'OPEN_SEARCH', OPEN_REUSABLE_CONTEXT_MENU: 'OPEN_REUSABLE_CONTEXT_MENU', + OPEN_REUSABLE_DIALOG: 'OPEN_REUSABLE_DIALOG', }, room: { JOIN: 'JOIN', @@ -92,6 +93,7 @@ const cons = { REPLY_TO_CLICKED: 'REPLY_TO_CLICKED', SEARCH_OPENED: 'SEARCH_OPENED', REUSABLE_CONTEXT_MENU_OPENED: 'REUSABLE_CONTEXT_MENU_OPENED', + REUSABLE_DIALOG_OPENED: 'REUSABLE_DIALOG_OPENED', }, roomList: { ROOMLIST_UPDATED: 'ROOMLIST_UPDATED', diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 06871e92..eb59e7a2 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -174,6 +174,14 @@ class Navigation extends EventEmitter { action.afterClose, ); }, + [cons.actions.navigation.OPEN_REUSABLE_DIALOG]: () => { + this.emit( + cons.events.navigation.REUSABLE_DIALOG_OPENED, + action.title, + action.render, + action.afterClose, + ); + }, }; actions[action.type]?.(); } From fe61576dcdc7794d57a1287f6307cf73ce1c147c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 08:55:16 +0530 Subject: [PATCH 036/824] Bump twemoji from 14.0.1 to 14.0.2 (#457) Bumps [twemoji](https://github.com/twitter/twemoji) from 14.0.1 to 14.0.2. - [Release notes](https://github.com/twitter/twemoji/releases) - [Commits](https://github.com/twitter/twemoji/compare/v14.0.1...v14.0.2) --- updated-dependencies: - dependency-name: twemoji dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95b6d948..448639ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "react-modal": "^3.14.4", "sanitize-html": "^2.7.0", "tippy.js": "^6.3.7", - "twemoji": "^14.0.1" + "twemoji": "^14.0.2" }, "devDependencies": { "@babel/core": "^7.17.8", @@ -13125,9 +13125,9 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "node_modules/twemoji": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.1.tgz", - "integrity": "sha512-eoqhea0sUhmC10iTacksyp1v9O4BP1jKmVqtK+Nztw40/dzawSHkXL3/xCpyh+mukmEvJ0Gw9VLvwZfQ9HKXDw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", + "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==", "dependencies": { "fs-extra": "^8.0.1", "jsonfile": "^5.0.0", @@ -24030,9 +24030,9 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "twemoji": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.1.tgz", - "integrity": "sha512-eoqhea0sUhmC10iTacksyp1v9O4BP1jKmVqtK+Nztw40/dzawSHkXL3/xCpyh+mukmEvJ0Gw9VLvwZfQ9HKXDw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", + "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==", "requires": { "fs-extra": "^8.0.1", "jsonfile": "^5.0.0", diff --git a/package.json b/package.json index 3a751fa1..ff489ec8 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "react-modal": "^3.14.4", "sanitize-html": "^2.7.0", "tippy.js": "^6.3.7", - "twemoji": "^14.0.1" + "twemoji": "^14.0.2" }, "devDependencies": { "@babel/core": "^7.17.8", From 9279bc7060333357db730269f0551f11f1108222 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 08:56:39 +0530 Subject: [PATCH 037/824] Bump sass from 1.49.9 to 1.49.11 (#465) Bumps [sass](https://github.com/sass/dart-sass) from 1.49.9 to 1.49.11. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.49.9...1.49.11) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 448639ed..b0635d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.49.9", + "sass": "^1.49.11", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11953,9 +11953,9 @@ } }, "node_modules/sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "version": "1.49.11", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.11.tgz", + "integrity": "sha512-wvS/geXgHUGs6A/4ud5BFIWKO1nKd7wYIGimDk4q4GFkJicILActpv9ueMT4eRGSsp1BdKHuw1WwAHXbhsJELQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23136,9 +23136,9 @@ } }, "sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "version": "1.49.11", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.11.tgz", + "integrity": "sha512-wvS/geXgHUGs6A/4ud5BFIWKO1nKd7wYIGimDk4q4GFkJicILActpv9ueMT4eRGSsp1BdKHuw1WwAHXbhsJELQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index ff489ec8..641d1c99 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.49.9", + "sass": "^1.49.11", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From c95e312acbe8f29bfb0bf67f458a4f4316080f81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 09:00:14 +0530 Subject: [PATCH 038/824] Bump webpack from 5.70.0 to 5.71.0 (#463) Bumps [webpack](https://github.com/webpack/webpack) from 5.70.0 to 5.71.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.70.0...v5.71.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0635d49..355c0386 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.70.0", + "webpack": "^5.71.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.7.3" @@ -13476,9 +13476,9 @@ } }, "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -24308,9 +24308,9 @@ } }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 641d1c99..cb643d61 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.70.0", + "webpack": "^5.71.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.7.3" From 93ab48ac9ac2861a804bf2d26ef25ca3e9f04fea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 09:07:23 +0530 Subject: [PATCH 039/824] Bump react-dnd from 15.1.1 to 15.1.2 (#466) Bumps [react-dnd](https://github.com/react-dnd/react-dnd) from 15.1.1 to 15.1.2. - [Release notes](https://github.com/react-dnd/react-dnd/releases) - [Changelog](https://github.com/react-dnd/react-dnd/blob/main/CHANGELOG.md) - [Commits](https://github.com/react-dnd/react-dnd/commits/v15.1.2) --- updated-dependencies: - dependency-name: react-dnd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 80 ++++++++++++++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 355c0386..7a34b7f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "prop-types": "^15.8.1", "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", - "react-dnd": "^15.1.1", + "react-dnd": "^15.1.2", "react-dnd-html5-backend": "^15.1.2", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", @@ -2426,9 +2426,9 @@ "integrity": "sha512-keberJRIqPX15IK3SWS/iO1t/kGETiL1oczKrDitAaMnQ+kpHf81l3MrRmFjvfqcnApE+izEvwM6GsyoIcpsVA==" }, "node_modules/@react-dnd/shallowequal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.0.tgz", - "integrity": "sha512-1ELWQdJB2UrCXTKK5cCD9uGLLIwECLIEdttKA255owdpchtXohIjZBTlFJszwYi2ZKe2Do+QvUzsGyGCMNwbdw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", + "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, "node_modules/@tippyjs/react": { "version": "4.2.6", @@ -11331,13 +11331,13 @@ } }, "node_modules/react-dnd": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.1.tgz", - "integrity": "sha512-QLrHtPU08U4c5zop0ANeqrHXaQw2EWLMn8DQoN6/e4eSN/UbB84P49/80Qg0MEF29VLB5vikSoiFh9N8ASNmpQ==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", + "integrity": "sha512-EaSbMD9iFJDY/o48T3c8wn3uWU+2uxfFojhesZN3LhigJoAIvH2iOjxofSA9KbqhAKP6V9P853G6XG8JngKVtA==", "dependencies": { - "@react-dnd/invariant": "3.0.0", - "@react-dnd/shallowequal": "3.0.0", - "dnd-core": "15.1.1", + "@react-dnd/invariant": "3.0.1", + "@react-dnd/shallowequal": "3.0.1", + "dnd-core": "15.1.2", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" }, @@ -11367,6 +11367,26 @@ "dnd-core": "15.1.1" } }, + "node_modules/react-dnd/node_modules/@react-dnd/asap": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", + "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" + }, + "node_modules/react-dnd/node_modules/@react-dnd/invariant": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", + "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" + }, + "node_modules/react-dnd/node_modules/dnd-core": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", + "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", + "dependencies": { + "@react-dnd/asap": "4.0.1", + "@react-dnd/invariant": "3.0.1", + "redux": "^4.1.2" + } + }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -15771,9 +15791,9 @@ "integrity": "sha512-keberJRIqPX15IK3SWS/iO1t/kGETiL1oczKrDitAaMnQ+kpHf81l3MrRmFjvfqcnApE+izEvwM6GsyoIcpsVA==" }, "@react-dnd/shallowequal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.0.tgz", - "integrity": "sha512-1ELWQdJB2UrCXTKK5cCD9uGLLIwECLIEdttKA255owdpchtXohIjZBTlFJszwYi2ZKe2Do+QvUzsGyGCMNwbdw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", + "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, "@tippyjs/react": { "version": "4.2.6", @@ -22651,15 +22671,37 @@ } }, "react-dnd": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.1.tgz", - "integrity": "sha512-QLrHtPU08U4c5zop0ANeqrHXaQw2EWLMn8DQoN6/e4eSN/UbB84P49/80Qg0MEF29VLB5vikSoiFh9N8ASNmpQ==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", + "integrity": "sha512-EaSbMD9iFJDY/o48T3c8wn3uWU+2uxfFojhesZN3LhigJoAIvH2iOjxofSA9KbqhAKP6V9P853G6XG8JngKVtA==", "requires": { - "@react-dnd/invariant": "3.0.0", - "@react-dnd/shallowequal": "3.0.0", - "dnd-core": "15.1.1", + "@react-dnd/invariant": "3.0.1", + "@react-dnd/shallowequal": "3.0.1", + "dnd-core": "15.1.2", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" + }, + "dependencies": { + "@react-dnd/asap": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", + "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" + }, + "@react-dnd/invariant": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", + "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" + }, + "dnd-core": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", + "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", + "requires": { + "@react-dnd/asap": "4.0.1", + "@react-dnd/invariant": "3.0.1", + "redux": "^4.1.2" + } + } } }, "react-dnd-html5-backend": { diff --git a/package.json b/package.json index cb643d61..ded0377d 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "prop-types": "^15.8.1", "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", - "react-dnd": "^15.1.1", + "react-dnd": "^15.1.2", "react-dnd-html5-backend": "^15.1.2", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", From 039d9bae6843eefb52cdf51806d40af685525f02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 09:11:33 +0530 Subject: [PATCH 040/824] Bump react-dnd-html5-backend from 15.1.2 to 15.1.3 (#464) Bumps [react-dnd-html5-backend](https://github.com/react-dnd/react-dnd) from 15.1.2 to 15.1.3. - [Release notes](https://github.com/react-dnd/react-dnd/releases) - [Changelog](https://github.com/react-dnd/react-dnd/blob/main/CHANGELOG.md) - [Commits](https://github.com/react-dnd/react-dnd/commits) --- updated-dependencies: - dependency-name: react-dnd-html5-backend dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 108 ++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 34 insertions(+), 76 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a34b7f2..917128a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.2", + "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", @@ -2416,14 +2416,14 @@ } }, "node_modules/@react-dnd/asap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.0.tgz", - "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", + "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" }, "node_modules/@react-dnd/invariant": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.0.tgz", - "integrity": "sha512-keberJRIqPX15IK3SWS/iO1t/kGETiL1oczKrDitAaMnQ+kpHf81l3MrRmFjvfqcnApE+izEvwM6GsyoIcpsVA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", + "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" }, "node_modules/@react-dnd/shallowequal": { "version": "3.0.1", @@ -5276,13 +5276,13 @@ } }, "node_modules/dnd-core": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.1.tgz", - "integrity": "sha512-Mtj/Sltcx7stVXzeDg4g7roTe/AmzRuIf/FYOxX6F8gULbY54w066BlErBOzQfn9RIJ3gAYLGX7wvVvoBSq7ig==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", + "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", "dependencies": { - "@react-dnd/asap": "4.0.0", - "@react-dnd/invariant": "3.0.0", - "redux": "^4.1.1" + "@react-dnd/asap": "4.0.1", + "@react-dnd/invariant": "3.0.1", + "redux": "^4.1.2" } }, "node_modules/dns-equal": { @@ -11360,31 +11360,11 @@ } }, "node_modules/react-dnd-html5-backend": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.2.tgz", - "integrity": "sha512-mem9QbutUF+aA2YC1y47G3ECjnYV/sCYKSnu5Jd7cbg3fLMPAwbnTf/JayYdnCH5l3eg9akD9dQt+cD0UdF8QQ==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", + "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", "dependencies": { - "dnd-core": "15.1.1" - } - }, - "node_modules/react-dnd/node_modules/@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" - }, - "node_modules/react-dnd/node_modules/@react-dnd/invariant": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", - "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" - }, - "node_modules/react-dnd/node_modules/dnd-core": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", - "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", - "dependencies": { - "@react-dnd/asap": "4.0.1", - "@react-dnd/invariant": "3.0.1", - "redux": "^4.1.2" + "dnd-core": "15.1.2" } }, "node_modules/react-dom": { @@ -15781,14 +15761,14 @@ "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==" }, "@react-dnd/asap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.0.tgz", - "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", + "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" }, "@react-dnd/invariant": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.0.tgz", - "integrity": "sha512-keberJRIqPX15IK3SWS/iO1t/kGETiL1oczKrDitAaMnQ+kpHf81l3MrRmFjvfqcnApE+izEvwM6GsyoIcpsVA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", + "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" }, "@react-dnd/shallowequal": { "version": "3.0.1", @@ -18122,13 +18102,13 @@ } }, "dnd-core": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.1.tgz", - "integrity": "sha512-Mtj/Sltcx7stVXzeDg4g7roTe/AmzRuIf/FYOxX6F8gULbY54w066BlErBOzQfn9RIJ3gAYLGX7wvVvoBSq7ig==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", + "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", "requires": { - "@react-dnd/asap": "4.0.0", - "@react-dnd/invariant": "3.0.0", - "redux": "^4.1.1" + "@react-dnd/asap": "4.0.1", + "@react-dnd/invariant": "3.0.1", + "redux": "^4.1.2" } }, "dns-equal": { @@ -22680,36 +22660,14 @@ "dnd-core": "15.1.2", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" - }, - "dependencies": { - "@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" - }, - "@react-dnd/invariant": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", - "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" - }, - "dnd-core": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", - "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", - "requires": { - "@react-dnd/asap": "4.0.1", - "@react-dnd/invariant": "3.0.1", - "redux": "^4.1.2" - } - } } }, "react-dnd-html5-backend": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.2.tgz", - "integrity": "sha512-mem9QbutUF+aA2YC1y47G3ECjnYV/sCYKSnu5Jd7cbg3fLMPAwbnTf/JayYdnCH5l3eg9akD9dQt+cD0UdF8QQ==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", + "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", "requires": { - "dnd-core": "15.1.1" + "dnd-core": "15.1.2" } }, "react-dom": { diff --git a/package.json b/package.json index ded0377d..d6b83a10 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.2", + "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", From ed4390b99df1f66d691ff5b882b2245c74114616 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:36:01 +0530 Subject: [PATCH 041/824] Bump react-dnd-html5-backend from 15.1.3 to 16.0.0 (#469) Bumps [react-dnd-html5-backend](https://github.com/react-dnd/react-dnd) from 15.1.3 to 16.0.0. - [Release notes](https://github.com/react-dnd/react-dnd/releases) - [Changelog](https://github.com/react-dnd/react-dnd/blob/main/CHANGELOG.md) - [Commits](https://github.com/react-dnd/react-dnd/commits/v16.0.0) --- updated-dependencies: - dependency-name: react-dnd-html5-backend dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 60 ++++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 917128a3..66c085f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.3", + "react-dnd-html5-backend": "^16.0.0", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", @@ -11360,11 +11360,31 @@ } }, "node_modules/react-dnd-html5-backend": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", - "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.0.tgz", + "integrity": "sha512-be3lKEbbT8FQcoTjFlQ4ZXG/NVrFNJu9W0INc5rm/5EFQpHCkz+xpbB2U8j9uh5Bvk7AsJyQrZznEut0hrNPIA==", "dependencies": { - "dnd-core": "15.1.2" + "dnd-core": "^16.0.0" + } + }, + "node_modules/react-dnd-html5-backend/node_modules/@react-dnd/asap": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.0.tgz", + "integrity": "sha512-czNGSkNPZgxapKz1a8zj/C5me5MpVpN4wlXDQIMF4wDUuFJ37x7beakc4S7C1xKilHA4tgT9zZb4U64BdT/E5g==" + }, + "node_modules/react-dnd-html5-backend/node_modules/@react-dnd/invariant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.0.tgz", + "integrity": "sha512-tjPrh294NbH6Gj1YP1of6JYEe3+sm0Wy7YA1ImG6YghlZe3n8F+fBx1yIrA5dVJCuUh6pBp4XO7/lcSq7oLL0A==" + }, + "node_modules/react-dnd-html5-backend/node_modules/dnd-core": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.0.tgz", + "integrity": "sha512-8cGtybb5LBjG2euYgVv3amk49F+9dH3l5TuuGQf0mhFr+KWIPE1qPxB8VpPDov74ZevUAxVDxadL2zN7I0oQ1Q==", + "dependencies": { + "@react-dnd/asap": "^5.0.0", + "@react-dnd/invariant": "^4.0.0", + "redux": "^4.1.2" } }, "node_modules/react-dom": { @@ -22663,11 +22683,33 @@ } }, "react-dnd-html5-backend": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", - "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.0.tgz", + "integrity": "sha512-be3lKEbbT8FQcoTjFlQ4ZXG/NVrFNJu9W0INc5rm/5EFQpHCkz+xpbB2U8j9uh5Bvk7AsJyQrZznEut0hrNPIA==", "requires": { - "dnd-core": "15.1.2" + "dnd-core": "^16.0.0" + }, + "dependencies": { + "@react-dnd/asap": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.0.tgz", + "integrity": "sha512-czNGSkNPZgxapKz1a8zj/C5me5MpVpN4wlXDQIMF4wDUuFJ37x7beakc4S7C1xKilHA4tgT9zZb4U64BdT/E5g==" + }, + "@react-dnd/invariant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.0.tgz", + "integrity": "sha512-tjPrh294NbH6Gj1YP1of6JYEe3+sm0Wy7YA1ImG6YghlZe3n8F+fBx1yIrA5dVJCuUh6pBp4XO7/lcSq7oLL0A==" + }, + "dnd-core": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.0.tgz", + "integrity": "sha512-8cGtybb5LBjG2euYgVv3amk49F+9dH3l5TuuGQf0mhFr+KWIPE1qPxB8VpPDov74ZevUAxVDxadL2zN7I0oQ1Q==", + "requires": { + "@react-dnd/asap": "^5.0.0", + "@react-dnd/invariant": "^4.0.0", + "redux": "^4.1.2" + } + } } }, "react-dom": { diff --git a/package.json b/package.json index d6b83a10..0c147ded 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.3", + "react-dnd-html5-backend": "^16.0.0", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", From 9c54915e7362313845378cfa6d3e0b76d84de812 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:39:00 +0530 Subject: [PATCH 042/824] Revert "Bump react-dnd-html5-backend from 15.1.3 to 16.0.0 (#469)" (#473) This reverts commit ed4390b99df1f66d691ff5b882b2245c74114616. --- package-lock.json | 60 +++++++---------------------------------------- package.json | 2 +- 2 files changed, 10 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66c085f5..917128a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^16.0.0", + "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", @@ -11360,31 +11360,11 @@ } }, "node_modules/react-dnd-html5-backend": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.0.tgz", - "integrity": "sha512-be3lKEbbT8FQcoTjFlQ4ZXG/NVrFNJu9W0INc5rm/5EFQpHCkz+xpbB2U8j9uh5Bvk7AsJyQrZznEut0hrNPIA==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", + "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", "dependencies": { - "dnd-core": "^16.0.0" - } - }, - "node_modules/react-dnd-html5-backend/node_modules/@react-dnd/asap": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.0.tgz", - "integrity": "sha512-czNGSkNPZgxapKz1a8zj/C5me5MpVpN4wlXDQIMF4wDUuFJ37x7beakc4S7C1xKilHA4tgT9zZb4U64BdT/E5g==" - }, - "node_modules/react-dnd-html5-backend/node_modules/@react-dnd/invariant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.0.tgz", - "integrity": "sha512-tjPrh294NbH6Gj1YP1of6JYEe3+sm0Wy7YA1ImG6YghlZe3n8F+fBx1yIrA5dVJCuUh6pBp4XO7/lcSq7oLL0A==" - }, - "node_modules/react-dnd-html5-backend/node_modules/dnd-core": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.0.tgz", - "integrity": "sha512-8cGtybb5LBjG2euYgVv3amk49F+9dH3l5TuuGQf0mhFr+KWIPE1qPxB8VpPDov74ZevUAxVDxadL2zN7I0oQ1Q==", - "dependencies": { - "@react-dnd/asap": "^5.0.0", - "@react-dnd/invariant": "^4.0.0", - "redux": "^4.1.2" + "dnd-core": "15.1.2" } }, "node_modules/react-dom": { @@ -22683,33 +22663,11 @@ } }, "react-dnd-html5-backend": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.0.tgz", - "integrity": "sha512-be3lKEbbT8FQcoTjFlQ4ZXG/NVrFNJu9W0INc5rm/5EFQpHCkz+xpbB2U8j9uh5Bvk7AsJyQrZznEut0hrNPIA==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", + "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", "requires": { - "dnd-core": "^16.0.0" - }, - "dependencies": { - "@react-dnd/asap": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.0.tgz", - "integrity": "sha512-czNGSkNPZgxapKz1a8zj/C5me5MpVpN4wlXDQIMF4wDUuFJ37x7beakc4S7C1xKilHA4tgT9zZb4U64BdT/E5g==" - }, - "@react-dnd/invariant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.0.tgz", - "integrity": "sha512-tjPrh294NbH6Gj1YP1of6JYEe3+sm0Wy7YA1ImG6YghlZe3n8F+fBx1yIrA5dVJCuUh6pBp4XO7/lcSq7oLL0A==" - }, - "dnd-core": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.0.tgz", - "integrity": "sha512-8cGtybb5LBjG2euYgVv3amk49F+9dH3l5TuuGQf0mhFr+KWIPE1qPxB8VpPDov74ZevUAxVDxadL2zN7I0oQ1Q==", - "requires": { - "@react-dnd/asap": "^5.0.0", - "@react-dnd/invariant": "^4.0.0", - "redux": "^4.1.2" - } - } + "dnd-core": "15.1.2" } }, "react-dom": { diff --git a/package.json b/package.json index 0c147ded..d6b83a10 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^16.0.0", + "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.14.4", From 699bbee544960e3198e82f3d59c11e7580df6293 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 11 Apr 2022 21:29:39 +0530 Subject: [PATCH 043/824] Fix max power level in room permissions (#480) * Fix power level in permissions Fix allowed value of power level in room permissions, earlier the max value was 100 even if room members have power level more than 100. * Update RoomPermissions.jsx --- src/app/molecules/room-permissions/RoomPermissions.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/molecules/room-permissions/RoomPermissions.jsx b/src/app/molecules/room-permissions/RoomPermissions.jsx index d8046ae6..989a9396 100644 --- a/src/app/molecules/room-permissions/RoomPermissions.jsx +++ b/src/app/molecules/room-permissions/RoomPermissions.jsx @@ -179,6 +179,7 @@ function RoomPermissions({ roomId }) { const pLEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; const permissions = pLEvent.getContent(); const canChangePermission = room.currentState.maySendStateEvent('m.room.power_levels', mx.getUserId()); + const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel ?? 100; const handlePowerSelector = (e, permKey, parentKey, powerLevel) => { const handlePowerLevelChange = (newPowerLevel) => { @@ -208,7 +209,7 @@ function RoomPermissions({ roomId }) { (closeMenu) => ( { closeMenu(); handlePowerLevelChange(pl); From 1d1cb567dad02238522c821f0868fb5877e999c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:14:10 +0530 Subject: [PATCH 044/824] Bump webpack from 5.71.0 to 5.72.0 (#485) Bumps [webpack](https://github.com/webpack/webpack) from 5.71.0 to 5.72.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.71.0...v5.72.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 917128a3..f5697fa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.71.0", + "webpack": "^5.72.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.7.3" @@ -13476,9 +13476,9 @@ } }, "node_modules/webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -24308,9 +24308,9 @@ } }, "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index d6b83a10..c28de270 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.71.0", + "webpack": "^5.72.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.7.3" From afe3f2f3f327cb67eb7e138f2e50a5f5331da7f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:14:31 +0530 Subject: [PATCH 045/824] Bump docker/metadata-action from 3.6.2 to 3.7.0 (#487) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 3.6.2 to 3.7.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v3.6.2...v3.7.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index ff0c6ab6..b25ceb3d 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -44,7 +44,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v3.6.2 + uses: docker/metadata-action@v3.7.0 with: images: ajbura/cinny - name: Build and push Docker image From abf24d1942bcfa240e69998cadeeab0eeac28927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:17:55 +0530 Subject: [PATCH 046/824] Bump eslint-plugin-import from 2.25.4 to 2.26.0 (#472) Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.25.4 to 2.26.0. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.25.4...v2.26.0) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 117 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 71 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5697fa5..27f8f3c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "css-minimizer-webpack-plugin": "^3.4.1", "eslint": "^8.12.0", "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.2.0", @@ -5767,9 +5767,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "dependencies": { "array-includes": "^3.1.4", @@ -5777,14 +5777,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "engines": { "node": ">=4" @@ -7870,9 +7870,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -9686,9 +9686,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mkdirp-classic": { @@ -11783,13 +11783,17 @@ } }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12735,6 +12739,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -13079,14 +13095,14 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, @@ -18578,9 +18594,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -18588,14 +18604,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { @@ -20122,9 +20138,9 @@ "dev": true }, "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -21438,9 +21454,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mkdirp-classic": { @@ -23016,13 +23032,14 @@ } }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -23736,6 +23753,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -23988,14 +24011,14 @@ } }, "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { diff --git a/package.json b/package.json index c28de270..0ec311ca 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "css-minimizer-webpack-plugin": "^3.4.1", "eslint": "^8.12.0", "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.2.0", From 0d58478a7319b87324b64d1b5d966c32d31de812 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:20:49 +0530 Subject: [PATCH 047/824] Bump @babel/core from 7.17.8 to 7.17.9 (#482) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.8 to 7.17.9. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.17.9/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 157 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 65 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27f8f3c2..44a58d35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.8", + "@babel/core": "^7.17.9", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", @@ -115,25 +115,25 @@ } }, "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "engines": { @@ -145,9 +145,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "dependencies": { "@babel/types": "^7.17.0", @@ -282,26 +282,13 @@ } }, "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==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "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" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -483,13 +470,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" }, "engines": { @@ -511,9 +498,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1739,18 +1726,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -8364,13 +8351,10 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -14124,32 +14108,32 @@ "dev": true }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "requires": { "@babel/types": "^7.17.0", @@ -14248,23 +14232,13 @@ } }, "@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==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "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/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -14401,13 +14375,13 @@ } }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" } }, @@ -14423,9 +14397,9 @@ } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15250,18 +15224,18 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -20499,13 +20473,10 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "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" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonfile": { "version": "5.0.0", diff --git a/package.json b/package.json index 0ec311ca..437846ba 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.8", + "@babel/core": "^7.17.9", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", From fedc207de271bda661bb304181790724cc6f6f7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:23:53 +0530 Subject: [PATCH 048/824] Bump eslint from 8.12.0 to 8.13.0 (#481) Bumps [eslint](https://github.com/eslint/eslint) from 8.12.0 to 8.13.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.12.0...v8.13.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44a58d35..5a8323d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.12.0", + "eslint": "^8.13.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -5621,9 +5621,9 @@ } }, "node_modules/eslint": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", - "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", + "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.2.1", @@ -18382,9 +18382,9 @@ "dev": true }, "eslint": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", - "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", + "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.2.1", diff --git a/package.json b/package.json index 437846ba..9e6d32af 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.12.0", + "eslint": "^8.13.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From bf2559da80a2edee20f2cf7cad833dbc4ca6d81f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:27:09 +0530 Subject: [PATCH 049/824] Bump webpack-dev-server from 4.7.4 to 4.8.1 (#483) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.7.4 to 4.8.1. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.7.4...v4.8.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 998 +++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 369 insertions(+), 631 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a8323d2..058f0fb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "util": "^0.12.4", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.4", + "webpack-dev-server": "^4.8.1", "webpack-merge": "^5.7.3" }, "engines": { @@ -2352,6 +2352,12 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "dev": true + }, "node_modules/@matrix-org/olm": { "version": "3.2.8", "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", @@ -2559,9 +2565,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "dependencies": { "@types/node": "*" @@ -2648,9 +2654,9 @@ } }, "node_modules/@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "dependencies": { "@types/node": "*" @@ -2869,13 +2875,13 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -2902,19 +2908,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3125,15 +3118,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -3517,30 +3501,30 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dev": true, "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" @@ -3562,26 +3546,27 @@ "dev": true }, "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "dev": true, "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, "node_modules/boolbase": { @@ -3818,12 +3803,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -4017,15 +3996,6 @@ "node": ">=0.10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/clean-webpack-plugin": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", @@ -4334,17 +4304,37 @@ "dev": true }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -4363,9 +4353,9 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" @@ -5002,23 +4992,6 @@ "node": ">=8" } }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -5279,22 +5252,15 @@ "dev": true }, "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { @@ -6212,17 +6178,17 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -6236,13 +6202,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -6273,21 +6239,38 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6656,9 +6639,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true, "funding": [ { @@ -7008,26 +6991,6 @@ "node": ">=4" } }, - "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.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -7382,27 +7345,21 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "node_modules/http-parser-js": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", @@ -7424,12 +7381,12 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -7437,18 +7394,14 @@ }, "engines": { "node": ">=12.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/http-signature": { @@ -7677,15 +7630,6 @@ "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/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -7742,12 +7686,6 @@ "node": ">= 0.10" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -8061,6 +7999,18 @@ "node": ">=6" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -9525,19 +9475,19 @@ } }, "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -9695,24 +9645,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "dev": true, "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, "node_modules/nanoid": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", @@ -9737,9 +9681,9 @@ "dev": true }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { "node": ">= 0.6" @@ -9794,9 +9738,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -10147,21 +10091,6 @@ "node": ">=4" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-retry": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", @@ -10368,6 +10297,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -11229,13 +11164,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dev": true, "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -11244,9 +11179,9 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" @@ -12035,12 +11970,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "node-forge": "^1.2.0" + "node-forge": "^1" }, "engines": { "node": ">=10" @@ -12056,9 +11991,9 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -12068,9 +12003,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -12095,9 +12030,9 @@ "dev": true }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/serialize-javascript": { @@ -12170,15 +12105,15 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" @@ -12196,9 +12131,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "node_modules/sha.js": { @@ -12350,15 +12285,6 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "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/sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -13050,9 +12976,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "engines": { "node": ">=0.6" @@ -13651,9 +13577,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13661,29 +13587,28 @@ "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" }, @@ -13730,40 +13655,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/webpack-dev-server/node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -13773,15 +13664,6 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -13807,21 +13689,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", @@ -15715,6 +15582,12 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "dev": true + }, "@matrix-org/olm": { "version": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "integrity": "sha512-yCJzEYY2aG1z+7nxKYZC4DFYwQO/5iG019qgotJhauYJRhEG9gLrKTvXO6lRHS8TjnZzsZFZyO/hQUlI4Dryig==" @@ -15900,9 +15773,9 @@ "dev": true }, "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "requires": { "@types/node": "*" @@ -15989,9 +15862,9 @@ } }, "@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "requires": { "@types/node": "*" @@ -16196,13 +16069,13 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -16218,16 +16091,6 @@ "dev": true, "requires": {} }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -16400,12 +16263,6 @@ "is-string": "^1.0.7" } }, - "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 - }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -16720,27 +16577,27 @@ "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "debug": { @@ -16759,25 +16616,23 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, "boolbase": { @@ -16969,12 +16824,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -17121,12 +16970,6 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "clean-webpack-plugin": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", @@ -17402,12 +17245,20 @@ "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -17425,9 +17276,9 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cookie-signature": { @@ -17882,20 +17733,6 @@ "mimic-response": "^2.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -18108,22 +17945,12 @@ "dev": true }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { @@ -18837,17 +18664,17 @@ "dev": true }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -18861,13 +18688,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -18895,16 +18722,16 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } @@ -19211,9 +19038,9 @@ } }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "foreach": { @@ -19493,20 +19320,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "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.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -19770,24 +19583,16 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "toidentifier": "1.0.1" } }, "http-parser-js": { @@ -19808,24 +19613,16 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - } } }, "http-signature": { @@ -19979,12 +19776,6 @@ "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 - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -20035,12 +19826,6 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -20245,6 +20030,12 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -21320,16 +21111,16 @@ "dev": true }, "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -21447,21 +21238,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, "nanoid": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", @@ -21480,9 +21265,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -21530,9 +21315,9 @@ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, "node-releases": { @@ -21786,15 +21571,6 @@ } } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-retry": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", @@ -21970,6 +21746,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -22570,21 +22352,21 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true } } @@ -23177,12 +22959,12 @@ "dev": true }, "selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^1.2.0" + "node-forge": "^1" } }, "semver": { @@ -23192,9 +22974,9 @@ "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "requires": { "debug": "2.6.9", @@ -23204,9 +22986,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -23230,9 +23012,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -23303,15 +23085,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -23326,9 +23108,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "sha.js": { @@ -23442,12 +23224,6 @@ } } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -23962,9 +23738,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "totalist": { @@ -24436,9 +24212,9 @@ } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -24446,29 +24222,28 @@ "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" }, @@ -24494,40 +24269,12 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -24545,15 +24292,6 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } } } }, diff --git a/package.json b/package.json index 9e6d32af..acc28ac8 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "util": "^0.12.4", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.4", + "webpack-dev-server": "^4.8.1", "webpack-merge": "^5.7.3" } } From 6575542281168e06b6595af79163482c609eff4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:31:57 +0530 Subject: [PATCH 050/824] Bump sass from 1.49.11 to 1.50.0 (#484) Bumps [sass](https://github.com/sass/dart-sass) from 1.49.11 to 1.50.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.49.11...1.50.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 058f0fb2..daa17a60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.49.11", + "sass": "^1.50.0", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11876,9 +11876,9 @@ } }, "node_modules/sass": { - "version": "1.49.11", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.11.tgz", - "integrity": "sha512-wvS/geXgHUGs6A/4ud5BFIWKO1nKd7wYIGimDk4q4GFkJicILActpv9ueMT4eRGSsp1BdKHuw1WwAHXbhsJELQ==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz", + "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -22906,9 +22906,9 @@ } }, "sass": { - "version": "1.49.11", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.11.tgz", - "integrity": "sha512-wvS/geXgHUGs6A/4ud5BFIWKO1nKd7wYIGimDk4q4GFkJicILActpv9ueMT4eRGSsp1BdKHuw1WwAHXbhsJELQ==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz", + "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index acc28ac8..4bead86d 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.49.11", + "sass": "^1.50.0", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From cd5ae4cb7f1ea1ec314fcaca1aee23961c0c647a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:35:38 +0530 Subject: [PATCH 051/824] Bump matrix-js-sdk from 16.0.1 to 17.0.0 (#486) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 16.0.1 to 17.0.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v16.0.1...v17.0.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index daa17a60..d6a5be8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "formik": "^2.2.9", "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^16.0.1", + "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-util-chunked": "^1.0.0", @@ -8829,9 +8829,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-16.0.1.tgz", - "integrity": "sha512-GRYZY7JZRqsVFa2nKO2qJbU4gQail2+1PgX2QDcibWizTL5Gh8YS384twprpIKqzdLHJ3d7H7A0L+uqc562ZsQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz", + "integrity": "sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -20716,9 +20716,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-16.0.1.tgz", - "integrity": "sha512-GRYZY7JZRqsVFa2nKO2qJbU4gQail2+1PgX2QDcibWizTL5Gh8YS384twprpIKqzdLHJ3d7H7A0L+uqc562ZsQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz", + "integrity": "sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 4bead86d..d9b7c327 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "formik": "^2.2.9", "html-react-parser": "^1.4.9", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^16.0.1", + "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-util-chunked": "^1.0.0", From ba0de8800a2b8528ade28b61d27cbc22a3605da2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 16 Apr 2022 20:53:24 +0530 Subject: [PATCH 052/824] Fix crash on unable to getContent of tombstoned room --- src/client/state/RoomList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/state/RoomList.js b/src/client/state/RoomList.js index f1e0d6d0..8b7cdc19 100644 --- a/src/client/state/RoomList.js +++ b/src/client/state/RoomList.js @@ -206,7 +206,7 @@ class RoomList extends EventEmitter { this.matrixClient.getRooms().forEach((room) => { const { roomId } = room; const tombstone = room.currentState.events.get('m.room.tombstone'); - if (typeof tombstone !== 'undefined') { + if (tombstone?.get('') !== undefined) { const repRoomId = tombstone.get('').getContent().replacement_room; const repRoomMembership = this.matrixClient.getRoom(repRoomId)?.getMyMembership(); if (repRoomMembership === 'join') return; From 8b3bd38bad1d89ab5aefcfd7466bc13fff94129c Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 18 Apr 2022 08:55:16 +0530 Subject: [PATCH 053/824] Improve strings (#488) * Update SpaceOptions.jsx * Update RoomOptions.jsx * Update RoomProfile.jsx * Update ProfileEditor.jsx * Update RoomSettings.jsx * Update SpaceSettings.jsx * Update Message.jsx * Update DeviceManage.jsx * Update Message.jsx * Update RoomProfile.jsx --- src/app/molecules/message/Message.jsx | 2 +- src/app/molecules/room-options/RoomOptions.jsx | 2 +- src/app/molecules/room-profile/RoomProfile.jsx | 2 +- src/app/molecules/space-options/SpaceOptions.jsx | 2 +- src/app/organisms/profile-editor/ProfileEditor.jsx | 2 +- src/app/organisms/room/RoomSettings.jsx | 2 +- src/app/organisms/settings/DeviceManage.jsx | 2 +- src/app/organisms/space-settings/SpaceSettings.jsx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 5a906f0d..07499977 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -547,7 +547,7 @@ const MessageOptions = React.memo(({ variant="danger" iconSrc={BinIC} onClick={() => { - if (window.confirm('Are you sure you want to delete this event')) { + if (window.confirm('Are you sure that you want to delete this event?')) { redactEvent(roomId, mEvent.getId()); } }} diff --git a/src/app/molecules/room-options/RoomOptions.jsx b/src/app/molecules/room-options/RoomOptions.jsx index 85b2b5a5..50178895 100644 --- a/src/app/molecules/room-options/RoomOptions.jsx +++ b/src/app/molecules/room-options/RoomOptions.jsx @@ -30,7 +30,7 @@ function RoomOptions({ roomId, afterOptionSelect }) { afterOptionSelect(); }; const handleLeaveClick = () => { - if (confirm('Are you really want to leave this room?')) { + if (confirm('Are you sure that you want to leave this room?')) { roomActions.leave(roomId); afterOptionSelect(); } diff --git a/src/app/molecules/room-profile/RoomProfile.jsx b/src/app/molecules/room-profile/RoomProfile.jsx index e485bede..4043cbf8 100644 --- a/src/app/molecules/room-profile/RoomProfile.jsx +++ b/src/app/molecules/room-profile/RoomProfile.jsx @@ -117,7 +117,7 @@ function RoomProfile({ roomId }) { const handleAvatarUpload = async (url) => { if (url === null) { - if (confirm('Are you sure you want to remove avatar?')) { + if (confirm('Are you sure that you want to remove room avatar?')) { await mx.sendStateEvent(roomId, 'm.room.avatar', { url }, ''); } } else await mx.sendStateEvent(roomId, 'm.room.avatar', { url }, ''); diff --git a/src/app/molecules/space-options/SpaceOptions.jsx b/src/app/molecules/space-options/SpaceOptions.jsx index 4b3e8cad..e9b72cb6 100644 --- a/src/app/molecules/space-options/SpaceOptions.jsx +++ b/src/app/molecules/space-options/SpaceOptions.jsx @@ -55,7 +55,7 @@ function SpaceOptions({ roomId, afterOptionSelect }) { }; const handleLeaveClick = () => { - if (confirm('Are you really want to leave this space?')) { + if (confirm('Are you sure that you want to leave this space?')) { leave(roomId); afterOptionSelect(); } diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index 038c2175..677985f4 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -40,7 +40,7 @@ function ProfileEditor({ userId }) { const handleAvatarUpload = (url) => { if (url === null) { - if (confirm('Are you sure you want to remove avatar?')) { + if (confirm('Are you sure that you want to remove avatar?')) { mx.setAvatarUrl(''); setAvatarSrc(null); } diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 0fb27221..8d14c18d 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -86,7 +86,7 @@ function GeneralSettings({ roomId }) { { - if (confirm('Are you really want to leave this room?')) { + if (confirm('Are you sure that you want to leave this room?')) { roomActions.leave(roomId); } }} diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index ccc6c478..6beb2dc6 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -107,7 +107,7 @@ function DeviceManage() { const handleRemove = async (device, auth = undefined) => { if (auth === undefined - ? window.confirm(`You are about to logout "${device.display_name}" session?`) + ? window.confirm(`You are about to logout "${device.display_name}" session.`) : true ) { addToProcessing(device); diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index 5e557c80..18e21cf3 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -90,7 +90,7 @@ function GeneralSettings({ roomId }) { { - if (confirm('Are you really want to leave this space?')) { + if (confirm('Are you sure that you want to leave this space?')) { leave(roomId); } }} From bf264d5add36c3d2833c223e013ca35cec279856 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 09:34:33 +0530 Subject: [PATCH 054/824] Bump actions/checkout from 3.0.0 to 3.0.1 (#491) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index d67ee15d..b2bf558d 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -11,7 +11,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.0.1 - name: Build app run: npm ci && npm run build - name: Upload artifact diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 29f41cc1..f2b4e955 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.0.1 - name: Build Docker image uses: docker/build-push-action@v2.10.0 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 5a71fcdd..1445e815 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.0.1 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@v1.7.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index b25ceb3d..eee20115 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.0.1 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@v1.7.2 with: @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.0.1 - name: Login to Docker Hub uses: docker/login-action@v1.14.1 with: From 8c01eb9c00b064307eeb8b3533c6ae9727bd4c86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 09:35:09 +0530 Subject: [PATCH 055/824] Bump node from 17.8.0-alpine3.15 to 17.9.0-alpine3.15 (#492) Bumps node from 17.8.0-alpine3.15 to 17.9.0-alpine3.15. --- updated-dependencies: - dependency-name: node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 70658f61..5712068f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:17.8.0-alpine3.15 as builder +FROM node:17.9.0-alpine3.15 as builder WORKDIR /src From 51e12184d75b9722c0abc5c54432e3630ec4f49f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 09:37:00 +0530 Subject: [PATCH 056/824] Bump eslint-plugin-react-hooks from 4.3.0 to 4.4.0 (#448) Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 4.3.0 to 4.4.0. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks) --- updated-dependencies: - dependency-name: eslint-plugin-react-hooks dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6a5be8c..6e07f888 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-react-hooks": "^4.4.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", @@ -5828,9 +5828,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", "dev": true, "engines": { "node": ">=10" @@ -18505,9 +18505,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index d9b7c327..baa09bc7 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-react-hooks": "^4.4.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", From 62c03d1334544c7875743348083aee54e026e5b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 09:39:14 +0530 Subject: [PATCH 057/824] Bump html-react-parser from 1.4.9 to 1.4.11 (#490) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 1.4.9 to 1.4.11. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v1.4.9...v1.4.11) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 32 ++++++++++++++++---------------- package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e07f888..c028f047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.9", + "html-react-parser": "^1.4.11", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", @@ -7199,9 +7199,9 @@ } }, "node_modules/html-dom-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.1.tgz", - "integrity": "sha512-ddijSO0GluZEdlLNmiAjFI+CkAgzUgf8n3vpitQhvlsniPMbCSWtu+QYmioaVmEN0stytm9C38p6SsTDthv0cA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz", + "integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==", "dependencies": { "domhandler": "4.3.1", "htmlparser2": "7.2.0" @@ -7284,17 +7284,17 @@ } }, "node_modules/html-react-parser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.9.tgz", - "integrity": "sha512-V45RVd7GEGtk5bmL9iBV/AkaTE6jj9uhvUrJ/cWlq06DrcMzvz2kqMeZfWEV2pIWkRDzLAqrotCfmFSvdTjpHA==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.11.tgz", + "integrity": "sha512-NDSz8MS89I286N7FzNScBtCRBs6MU7w72k+jWk4dBqcTgTrCQHHrIUlryJB9U5MJuKhq5/CFGz0JPPYS6OnjZw==", "dependencies": { "domhandler": "4.3.1", - "html-dom-parser": "1.1.1", + "html-dom-parser": "1.2.0", "react-property": "2.0.0", "style-to-js": "1.1.0" }, "peerDependencies": { - "react": "0.14 || 15 || 16 || 17" + "react": "0.14 || 15 || 16 || 17 || 18" } }, "node_modules/html-webpack-plugin": { @@ -19484,9 +19484,9 @@ } }, "html-dom-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.1.1.tgz", - "integrity": "sha512-ddijSO0GluZEdlLNmiAjFI+CkAgzUgf8n3vpitQhvlsniPMbCSWtu+QYmioaVmEN0stytm9C38p6SsTDthv0cA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz", + "integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==", "requires": { "domhandler": "4.3.1", "htmlparser2": "7.2.0" @@ -19542,12 +19542,12 @@ } }, "html-react-parser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.9.tgz", - "integrity": "sha512-V45RVd7GEGtk5bmL9iBV/AkaTE6jj9uhvUrJ/cWlq06DrcMzvz2kqMeZfWEV2pIWkRDzLAqrotCfmFSvdTjpHA==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.11.tgz", + "integrity": "sha512-NDSz8MS89I286N7FzNScBtCRBs6MU7w72k+jWk4dBqcTgTrCQHHrIUlryJB9U5MJuKhq5/CFGz0JPPYS6OnjZw==", "requires": { "domhandler": "4.3.1", - "html-dom-parser": "1.1.1", + "html-dom-parser": "1.2.0", "react-property": "2.0.0", "style-to-js": "1.1.0" } diff --git a/package.json b/package.json index baa09bc7..eb783b91 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.9", + "html-react-parser": "^1.4.11", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", From 3b1b3387e70523f4b2564543a24c181f9237f037 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 20 Apr 2022 08:58:47 +0530 Subject: [PATCH 058/824] Replace forked action with original one (#496) The reason to replace is that previous action fails when pull request content is empty and Beakyn/gha-comment-pull-request@v1.0.2 fixed this. --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 6894bad3..94752cf0 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -68,7 +68,7 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE3_ID }} timeout-minutes: 1 - name: Edit PR Description - uses: velas/pr-description@v1.0.1 + uses: Beakyn/gha-comment-pull-request@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From ec26c03d58f5ee8fb86c65a7154ebb762a3bec64 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 20 Apr 2022 08:58:58 +0530 Subject: [PATCH 059/824] Run docker check when someone change the action too (#495) --- .github/workflows/docker-pr.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index f2b4e955..b5f011f3 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -2,8 +2,9 @@ name: 'Docker check' on: pull_request: - paths: + paths: - 'Dockerfile' + - '.github/workflows/docker-pr.yml' jobs: docker-build: From 989ab5a432e818240e03d8be0c34c08c407862ab Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 24 Apr 2022 15:42:24 +0530 Subject: [PATCH 060/824] Add support to manage cross-signing and key backup (#461) * Add useDeviceList hook Signed-off-by: Ajay Bura * Add isCrossVerified func to matrixUtil Signed-off-by: Ajay Bura * Add className prop in sidebar avatar comp Signed-off-by: Ajay Bura * Add unverified session indicator in sidebar Signed-off-by: Ajay Bura * Add info card component Signed-off-by: Ajay Bura * Add css variables Signed-off-by: Ajay Bura * Add cross signin status hook Signed-off-by: Ajay Bura * Add hasCrossSigninAccountData function Signed-off-by: Ajay Bura * Add cross signin info card in device manage component Signed-off-by: Ajay Bura * Add cross signing and key backup component Signed-off-by: Ajay Bura * Fix typo Signed-off-by: Ajay Bura * WIP Signed-off-by: Ajay Bura * Add cross singing dialogs Signed-off-by: Ajay Bura * Add cross signing set/reset Signed-off-by: Ajay Bura * Add SecretStorageAccess component Signed-off-by: Ajay Bura * Add key backup Signed-off-by: Ajay Bura * WIP * WIP * WIP * WIP * Show progress when restoring key backup * Add SSSS and key backup --- src/app/atoms/card/InfoCard.jsx | 59 ++++ src/app/atoms/card/InfoCard.scss | 79 +++++ src/app/hooks/useCrossSigningStatus.js | 25 ++ src/app/hooks/useDeviceList.js | 32 ++ src/app/molecules/dialog/Dialog.jsx | 2 +- src/app/molecules/dialog/ReusableDialog.jsx | 2 +- .../sidebar-avatar/SidebarAvatar.jsx | 13 +- src/app/organisms/emoji-board/EmojiBoard.scss | 4 + src/app/organisms/navigation/SideBar.jsx | 22 ++ src/app/organisms/navigation/SideBar.scss | 17 ++ src/app/organisms/settings/AuthRequest.jsx | 117 +++++++ src/app/organisms/settings/AuthRequest.scss | 12 + src/app/organisms/settings/CrossSigning.jsx | 223 ++++++++++++++ src/app/organisms/settings/CrossSigning.scss | 55 ++++ src/app/organisms/settings/DeviceManage.jsx | 95 ++---- src/app/organisms/settings/KeyBackup.jsx | 288 ++++++++++++++++++ src/app/organisms/settings/KeyBackup.scss | 27 ++ .../settings/SecretStorageAccess.jsx | 133 ++++++++ .../settings/SecretStorageAccess.scss | 20 ++ src/app/organisms/settings/Settings.jsx | 17 +- src/client/initMatrix.js | 2 + src/client/state/secretStorageKeys.js | 41 +++ src/index.scss | 4 + src/util/common.js | 18 ++ src/util/matrixUtil.js | 36 +++ webpack.common.js | 5 + 26 files changed, 1261 insertions(+), 87 deletions(-) create mode 100644 src/app/atoms/card/InfoCard.jsx create mode 100644 src/app/atoms/card/InfoCard.scss create mode 100644 src/app/hooks/useCrossSigningStatus.js create mode 100644 src/app/hooks/useDeviceList.js create mode 100644 src/app/organisms/settings/AuthRequest.jsx create mode 100644 src/app/organisms/settings/AuthRequest.scss create mode 100644 src/app/organisms/settings/CrossSigning.jsx create mode 100644 src/app/organisms/settings/CrossSigning.scss create mode 100644 src/app/organisms/settings/KeyBackup.jsx create mode 100644 src/app/organisms/settings/KeyBackup.scss create mode 100644 src/app/organisms/settings/SecretStorageAccess.jsx create mode 100644 src/app/organisms/settings/SecretStorageAccess.scss create mode 100644 src/client/state/secretStorageKeys.js diff --git a/src/app/atoms/card/InfoCard.jsx b/src/app/atoms/card/InfoCard.jsx new file mode 100644 index 00000000..e530d5c0 --- /dev/null +++ b/src/app/atoms/card/InfoCard.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './InfoCard.scss'; + +import Text from '../text/Text'; +import RawIcon from '../system-icons/RawIcon'; +import IconButton from '../button/IconButton'; + +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; + +function InfoCard({ + className, style, + variant, iconSrc, + title, content, + rounded, requestClose, +}) { + const classes = [`info-card info-card--${variant}`]; + if (rounded) classes.push('info-card--rounded'); + if (className) classes.push(className); + return ( +
    + {iconSrc && ( +
    + +
    + )} +
    + {title} + {content} +
    + {requestClose && ( + + )} +
    + ); +} + +InfoCard.defaultProps = { + className: null, + style: null, + variant: 'surface', + iconSrc: null, + content: null, + rounded: false, + requestClose: null, +}; + +InfoCard.propTypes = { + className: PropTypes.string, + style: PropTypes.shape({}), + variant: PropTypes.oneOf(['surface', 'primary', 'positive', 'caution', 'danger']), + iconSrc: PropTypes.string, + title: PropTypes.string.isRequired, + content: PropTypes.node, + rounded: PropTypes.bool, + requestClose: PropTypes.func, +}; + +export default InfoCard; diff --git a/src/app/atoms/card/InfoCard.scss b/src/app/atoms/card/InfoCard.scss new file mode 100644 index 00000000..79d72ebb --- /dev/null +++ b/src/app/atoms/card/InfoCard.scss @@ -0,0 +1,79 @@ +@use '.././../partials/flex'; +@use '.././../partials/dir'; + +.info-card { + display: flex; + align-items: flex-start; + line-height: 0; + padding: var(--sp-tight); + @include dir.prop(border-left, 4px solid transparent, none); + @include dir.prop(border-right, none, 4px solid transparent); + + & > .ic-btn { + padding: 0; + border-radius: 4; + } + + &__content { + margin: 0 var(--sp-tight); + @extend .cp-fx__item-one; + + & > *:nth-child(2) { + margin-top: var(--sp-ultra-tight); + } + } + + &--rounded { + @include dir.prop( + border-radius, + 0 var(--bo-radius) var(--bo-radius) 0, + var(--bo-radius) 0 0 var(--bo-radius) + ); + } + + &--surface { + border-color: var(--bg-surface-border); + background-color: var(--bg-surface-hover); + + } + &--primary { + border-color: var(--bg-primary); + background-color: var(--bg-primary-hover); + & .text { + color: var(--tc-primary-high); + &-b3 { + color: var(--tc-primary-normal); + } + } + } + &--positive { + border-color: var(--bg-positive-border); + background-color: var(--bg-positive-hover); + & .text { + color: var(--tc-positive-high); + &-b3 { + color: var(--tc-positive-normal); + } + } + } + &--caution { + border-color: var(--bg-caution-border); + background-color: var(--bg-caution-hover); + & .text { + color: var(--tc-caution-high); + &-b3 { + color: var(--tc-caution-normal); + } + } + } + &--danger { + border-color: var(--bg-danger-border); + background-color: var(--bg-danger-hover); + & .text { + color: var(--tc-danger-high); + &-b3 { + color: var(--tc-danger-normal); + } + } + } +} \ No newline at end of file diff --git a/src/app/hooks/useCrossSigningStatus.js b/src/app/hooks/useCrossSigningStatus.js new file mode 100644 index 00000000..61b69d1d --- /dev/null +++ b/src/app/hooks/useCrossSigningStatus.js @@ -0,0 +1,25 @@ +/* eslint-disable import/prefer-default-export */ +import { useState, useEffect } from 'react'; + +import initMatrix from '../../client/initMatrix'; +import { hasCrossSigningAccountData } from '../../util/matrixUtil'; + +export function useCrossSigningStatus() { + const mx = initMatrix.matrixClient; + const [isCSEnabled, setIsCSEnabled] = useState(hasCrossSigningAccountData()); + + useEffect(() => { + if (isCSEnabled) return null; + const handleAccountData = (event) => { + if (event.getType() === 'm.cross_signing.master') { + setIsCSEnabled(true); + } + }; + + mx.on('accountData', handleAccountData); + return () => { + mx.removeListener('accountData', handleAccountData); + }; + }, [isCSEnabled === false]); + return isCSEnabled; +} diff --git a/src/app/hooks/useDeviceList.js b/src/app/hooks/useDeviceList.js new file mode 100644 index 00000000..2cce0fe5 --- /dev/null +++ b/src/app/hooks/useDeviceList.js @@ -0,0 +1,32 @@ +/* eslint-disable import/prefer-default-export */ +import { useState, useEffect } from 'react'; + +import initMatrix from '../../client/initMatrix'; + +export function useDeviceList() { + const mx = initMatrix.matrixClient; + const [deviceList, setDeviceList] = useState(null); + + useEffect(() => { + let isMounted = true; + + const updateDevices = () => mx.getDevices().then((data) => { + if (!isMounted) return; + setDeviceList(data.devices || []); + }); + updateDevices(); + + const handleDevicesUpdate = (users) => { + if (users.includes(mx.getUserId())) { + updateDevices(); + } + }; + + mx.on('crypto.devicesUpdated', handleDevicesUpdate); + return () => { + mx.removeListener('crypto.devicesUpdated', handleDevicesUpdate); + isMounted = false; + }; + }, []); + return deviceList; +} diff --git a/src/app/molecules/dialog/Dialog.jsx b/src/app/molecules/dialog/Dialog.jsx index 637766a9..a59520f6 100644 --- a/src/app/molecules/dialog/Dialog.jsx +++ b/src/app/molecules/dialog/Dialog.jsx @@ -37,7 +37,7 @@ function Dialog({ {contentOptions}
    - +
    {children}
    diff --git a/src/app/molecules/dialog/ReusableDialog.jsx b/src/app/molecules/dialog/ReusableDialog.jsx index b05cafcf..7340e119 100644 --- a/src/app/molecules/dialog/ReusableDialog.jsx +++ b/src/app/molecules/dialog/ReusableDialog.jsx @@ -24,7 +24,7 @@ function ReusableDialog() { }, []); const handleAfterClose = () => { - data.afterClose(); + data.afterClose?.(); setData(null); }; diff --git a/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx b/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx index 7b281454..bc8b7c8f 100644 --- a/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx +++ b/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx @@ -9,11 +9,12 @@ import Tooltip from '../../atoms/tooltip/Tooltip'; import { blurOnBubbling } from '../../atoms/button/script'; const SidebarAvatar = React.forwardRef(({ - tooltip, active, onClick, onContextMenu, - avatar, notificationBadge, + className, tooltip, active, onClick, + onContextMenu, avatar, notificationBadge, }, ref) => { - let activeClass = ''; - if (active) activeClass = ' sidebar-avatar--active'; + const classes = ['sidebar-avatar']; + if (active) classes.push('sidebar-avatar--active'); + if (className) classes.push(className); return ( {twemojify(tooltip)}} @@ -21,7 +22,7 @@ const SidebarAvatar = React.forwardRef(({ >
    diff --git a/src/app/organisms/navigation/SideBar.scss b/src/app/organisms/navigation/SideBar.scss index 9f9ade72..6ff66288 100644 --- a/src/app/organisms/navigation/SideBar.scss +++ b/src/app/organisms/navigation/SideBar.scss @@ -57,4 +57,21 @@ width: 24px; height: 1px; background-color: var(--bg-surface-border); +} + +.sidebar__cross-signin-alert .avatar-container { + box-shadow: var(--bs-danger-border); + animation-name: pushRight; + animation-duration: 400ms; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +@keyframes pushRight { + from { + transform: translateX(4px) scale(1); + } + to { + transform: translateX(0) scale(1); + } } \ No newline at end of file diff --git a/src/app/organisms/settings/AuthRequest.jsx b/src/app/organisms/settings/AuthRequest.jsx new file mode 100644 index 00000000..ca07c2a2 --- /dev/null +++ b/src/app/organisms/settings/AuthRequest.jsx @@ -0,0 +1,117 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import './AuthRequest.scss'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableDialog } from '../../../client/action/navigation'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import Input from '../../atoms/input/Input'; +import Spinner from '../../atoms/spinner/Spinner'; + +import { useStore } from '../../hooks/useStore'; + +let lastUsedPassword; +const getAuthId = (password) => ({ + type: 'm.login.password', + password, + identifier: { + type: 'm.id.user', + user: initMatrix.matrixClient.getUserId(), + }, +}); + +function AuthRequest({ onComplete, makeRequest }) { + const [status, setStatus] = useState(false); + const mountStore = useStore(); + + const handleForm = async (e) => { + mountStore.setItem(true); + e.preventDefault(); + const password = e.target.password.value; + if (password.trim() === '') return; + try { + setStatus({ ongoing: true }); + await makeRequest(getAuthId(password)); + lastUsedPassword = password; + if (!mountStore.getItem()) return; + onComplete(true); + } catch (err) { + lastUsedPassword = undefined; + if (!mountStore.getItem()) return; + if (err.errcode === 'M_FORBIDDEN') { + setStatus({ error: 'Wrong password. Please enter correct password.' }); + return; + } + setStatus({ error: 'Request failed!' }); + } + }; + + const handleChange = () => { + setStatus(false); + }; + + return ( +
    +
    + + {status.ongoing && } + {status.error && {status.error}} + {(status === false || status.error) && } + +
    + ); +} +AuthRequest.propTypes = { + onComplete: PropTypes.func.isRequired, + makeRequest: PropTypes.func.isRequired, +}; + +/** + * @param {string} title Title of dialog + * @param {(auth) => void} makeRequest request to make + * @returns {Promise} whether the request succeed or not. + */ +export const authRequest = async (title, makeRequest) => { + try { + const auth = lastUsedPassword ? getAuthId(lastUsedPassword) : undefined; + await makeRequest(auth); + return true; + } catch (e) { + lastUsedPassword = undefined; + if (e.httpStatus !== 401 || e.data?.flows === undefined) return false; + + const { flows } = e.data; + const canUsePassword = flows.find((f) => f.stages.includes('m.login.password')); + if (!canUsePassword) return false; + + return new Promise((resolve) => { + let isCompleted = false; + openReusableDialog( + {title}, + (requestClose) => ( + { + isCompleted = true; + resolve(done); + requestClose(); + }} + makeRequest={makeRequest} + /> + ), + () => { + if (!isCompleted) resolve(false); + }, + ); + }); + } +}; + +export default AuthRequest; diff --git a/src/app/organisms/settings/AuthRequest.scss b/src/app/organisms/settings/AuthRequest.scss new file mode 100644 index 00000000..35e95bf2 --- /dev/null +++ b/src/app/organisms/settings/AuthRequest.scss @@ -0,0 +1,12 @@ +.auth-request { + padding: var(--sp-normal); + + & form > *:not(:first-child) { + margin-top: var(--sp-normal); + } + + & .text-b3 { + color: var(--tc-danger-high); + margin-top: var(--sp-ultra-tight) !important; + } +} \ No newline at end of file diff --git a/src/app/organisms/settings/CrossSigning.jsx b/src/app/organisms/settings/CrossSigning.jsx new file mode 100644 index 00000000..9213e9da --- /dev/null +++ b/src/app/organisms/settings/CrossSigning.jsx @@ -0,0 +1,223 @@ +/* eslint-disable react/jsx-one-expression-per-line */ +import React, { useState } from 'react'; +import './CrossSigning.scss'; +import FileSaver from 'file-saver'; +import { Formik } from 'formik'; +import { twemojify } from '../../../util/twemojify'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableDialog } from '../../../client/action/navigation'; +import { copyToClipboard } from '../../../util/common'; +import { clearSecretStorageKeys } from '../../../client/state/secretStorageKeys'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import Input from '../../atoms/input/Input'; +import Spinner from '../../atoms/spinner/Spinner'; +import SettingTile from '../../molecules/setting-tile/SettingTile'; + +import { authRequest } from './AuthRequest'; +import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; + +const failedDialog = () => { + const renderFailure = (requestClose) => ( +
    + {twemojify('❌')} + Failed to setup cross signing. Please try again. + +
    + ); + + openReusableDialog( + Setup cross signing, + renderFailure, + ); +}; + +const securityKeyDialog = (key) => { + const downloadKey = () => { + const blob = new Blob([key.encodedPrivateKey], { + type: 'text/plain;charset=us-ascii', + }); + FileSaver.saveAs(blob, 'security-key.txt'); + }; + const copyKey = () => { + copyToClipboard(key.encodedPrivateKey); + }; + + const renderSecurityKey = () => ( +
    + Please save this security key somewhere safe. + + {key.encodedPrivateKey} + +
    + + +
    +
    + ); + + // Download automatically. + downloadKey(); + + openReusableDialog( + Security Key, + () => renderSecurityKey(), + ); +}; + +function CrossSigningSetup() { + const initialValues = { phrase: '', confirmPhrase: '' }; + const [genWithPhrase, setGenWithPhrase] = useState(undefined); + + const setup = async (securityPhrase = undefined) => { + const mx = initMatrix.matrixClient; + setGenWithPhrase(typeof securityPhrase === 'string'); + const recoveryKey = await mx.createRecoveryKeyFromPassphrase(securityPhrase); + clearSecretStorageKeys(); + + await mx.bootstrapSecretStorage({ + createSecretStorageKey: async () => recoveryKey, + setupNewKeyBackup: true, + setupNewSecretStorage: true, + }); + + const authUploadDeviceSigningKeys = async (makeRequest) => { + const isDone = await authRequest('Setup cross signing', async (auth) => { + await makeRequest(auth); + }); + setTimeout(() => { + if (isDone) securityKeyDialog(recoveryKey); + else failedDialog(); + }); + }; + + await mx.bootstrapCrossSigning({ + authUploadDeviceSigningKeys, + setupNewCrossSigning: true, + }); + }; + + const validator = (values) => { + const errors = {}; + if (values.phrase === '12345678') { + errors.phrase = 'How about 87654321 ?'; + } + if (values.phrase === '87654321') { + errors.phrase = 'Your are playing with 🔥'; + } + const PHRASE_REGEX = /^([^\s]){8,127}$/; + if (values.phrase.length > 0 && !PHRASE_REGEX.test(values.phrase)) { + errors.phrase = 'Phrase must contain 8-127 characters with no space.'; + } + if (values.confirmPhrase.length > 0 && values.confirmPhrase !== values.phrase) { + errors.confirmPhrase = 'Phrase don\'t match.'; + } + return errors; + }; + + return ( +
    +
    + + We will generate a Security Key, + which you can use to manage messages backup and session verification. + + {genWithPhrase !== false && } + {genWithPhrase === false && } +
    + OR + setup(values.phrase)} + validate={validator} + > + {({ + values, errors, handleChange, handleSubmit, + }) => ( +
    + + Alternatively you can also set a Security Phrase + so you don't have to remember long Security Key, + and optionally save the Key as backup. + + + {errors.phrase && {errors.phrase}} + + {errors.confirmPhrase && {errors.confirmPhrase}} + {genWithPhrase !== true && } + {genWithPhrase === true && } + + )} +
    +
    + ); +} + +const setupDialog = () => { + openReusableDialog( + Setup cross signing, + () => , + ); +}; + +function CrossSigningReset() { + return ( +
    + {twemojify('✋🧑‍🚒🤚')} + Resetting cross-signing keys is permanent. + + Anyone you have verified with will see security alerts and your message backup will lost. + You almost certainly do not want to do this, + unless you have lost Security Key or Phrase and + every session you can cross-sign from. + + +
    + ); +} + +const resetDialog = () => { + openReusableDialog( + Reset cross signing, + () => , + ); +}; + +function CrossSignin() { + const isCSEnabled = useCrossSigningStatus(); + return ( + Setup to verify and keep track of all your sessions. Also required to backup encrypted message.} + options={( + isCSEnabled + ? + : + )} + /> + ); +} + +export default CrossSignin; diff --git a/src/app/organisms/settings/CrossSigning.scss b/src/app/organisms/settings/CrossSigning.scss new file mode 100644 index 00000000..b4b606d0 --- /dev/null +++ b/src/app/organisms/settings/CrossSigning.scss @@ -0,0 +1,55 @@ +.cross-signing { + &__setup { + padding: var(--sp-normal); + } + &__setup-entry { + & > *:not(:first-child) { + margin-top: var(--sp-normal); + } + } + + &__error { + color: var(--tc-danger-high); + margin-top: var(--sp-ultra-tight) !important; + } + + &__setup-divider { + margin: var(--sp-tight) 0; + display: flex; + align-items: center; + + &::before, + &::after { + flex: 1; + content: ''; + margin: var(--sp-tight) 0; + border-bottom: 1px solid var(--bg-surface-border); + } + } +} + +.cross-signing__key { + padding: var(--sp-normal); + + &-text { + margin: var(--sp-normal) 0; + padding: var(--sp-extra-tight); + background-color: var(--bg-surface-low); + border-radius: var(--bo-radius); + } + &-btn { + display: flex; + & > button:last-child { + margin: 0 var(--sp-normal); + } + } +} + +.cross-signing__failure, +.cross-signing__reset { + padding: var(--sp-normal); + padding-top: var(--sp-extra-loose); + & > .text { + padding-bottom: var(--sp-normal); + } +} \ No newline at end of file diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 6beb2dc6..5c60bf0a 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -3,62 +3,30 @@ import './DeviceManage.scss'; import dateFormat from 'dateformat'; import initMatrix from '../../../client/initMatrix'; +import { isCrossVerified } from '../../../util/matrixUtil'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; import IconButton from '../../atoms/button/IconButton'; import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; +import InfoCard from '../../atoms/card/InfoCard'; import Spinner from '../../atoms/spinner/Spinner'; import SettingTile from '../../molecules/setting-tile/SettingTile'; import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; import BinIC from '../../../../public/res/ic/outlined/bin.svg'; +import InfoIC from '../../../../public/res/ic/outlined/info.svg'; + +import { authRequest } from './AuthRequest'; import { useStore } from '../../hooks/useStore'; - -function useDeviceList() { - const mx = initMatrix.matrixClient; - const [deviceList, setDeviceList] = useState(null); - - useEffect(() => { - let isMounted = true; - - const updateDevices = () => mx.getDevices().then((data) => { - if (!isMounted) return; - setDeviceList(data.devices || []); - }); - updateDevices(); - - const handleDevicesUpdate = (users) => { - if (users.includes(mx.getUserId())) { - updateDevices(); - } - }; - - mx.on('crypto.devicesUpdated', handleDevicesUpdate); - return () => { - mx.removeListener('crypto.devicesUpdated', handleDevicesUpdate); - isMounted = false; - }; - }, []); - return deviceList; -} - -function isCrossVerified(deviceId) { - try { - const mx = initMatrix.matrixClient; - const crossSignInfo = mx.getStoredCrossSigningForUser(mx.getUserId()); - const deviceInfo = mx.getStoredDevice(mx.getUserId(), deviceId); - const deviceTrust = crossSignInfo.checkDeviceTrust(crossSignInfo, deviceInfo, false, true); - return deviceTrust.isCrossSigningVerified(); - } catch { - return false; - } -} +import { useDeviceList } from '../../hooks/useDeviceList'; +import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; function DeviceManage() { const TRUNCATED_COUNT = 4; const mx = initMatrix.matrixClient; + const isCSEnabled = useCrossSigningStatus(); const deviceList = useDeviceList(); const [processing, setProcessing] = useState([]); const [truncated, setTruncated] = useState(true); @@ -105,38 +73,15 @@ function DeviceManage() { } }; - const handleRemove = async (device, auth = undefined) => { - if (auth === undefined - ? window.confirm(`You are about to logout "${device.display_name}" session.`) - : true - ) { + const handleRemove = async (device) => { + if (window.confirm(`You are about to logout "${device.display_name}" session.`)) { addToProcessing(device); - try { + await authRequest(`Logout "${device.display_name}"`, async (auth) => { await mx.deleteDevice(device.device_id, auth); - } catch (e) { - if (e.httpStatus === 401 && e.data?.flows) { - const { flows } = e.data; - const flow = flows.find((f) => f.stages.includes('m.login.password')); - if (flow) { - const password = window.prompt('Please enter account password', ''); - if (password && password.trim() !== '') { - handleRemove(device, { - session: e.data.session, - type: 'm.login.password', - password, - identifier: { - type: 'm.id.user', - user: mx.getUserId(), - }, - }); - return; - } - } - } - window.alert('Failed to remove session!'); - if (!mountStore.getItem()) return; - removeFromProcessing(device); - } + }); + + if (!mountStore.getItem()) return; + removeFromProcessing(device); } }; @@ -187,6 +132,16 @@ function DeviceManage() {
    Unverified sessions + {!isCSEnabled && ( +
    + +
    + )} { unverified.length > 0 ? unverified.map((device) => renderDevice(device, false)) diff --git a/src/app/organisms/settings/KeyBackup.jsx b/src/app/organisms/settings/KeyBackup.jsx new file mode 100644 index 00000000..5d2f4ed7 --- /dev/null +++ b/src/app/organisms/settings/KeyBackup.jsx @@ -0,0 +1,288 @@ +/* eslint-disable react/prop-types */ +import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import './KeyBackup.scss'; +import { twemojify } from '../../../util/twemojify'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableDialog } from '../../../client/action/navigation'; +import { deletePrivateKey } from '../../../client/state/secretStorageKeys'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import IconButton from '../../atoms/button/IconButton'; +import Spinner from '../../atoms/spinner/Spinner'; +import InfoCard from '../../atoms/card/InfoCard'; +import SettingTile from '../../molecules/setting-tile/SettingTile'; + +import { accessSecretStorage } from './SecretStorageAccess'; + +import InfoIC from '../../../../public/res/ic/outlined/info.svg'; +import BinIC from '../../../../public/res/ic/outlined/bin.svg'; +import DownloadIC from '../../../../public/res/ic/outlined/download.svg'; + +import { useStore } from '../../hooks/useStore'; +import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; + +function CreateKeyBackupDialog({ keyData }) { + const [done, setDone] = useState(false); + const mx = initMatrix.matrixClient; + const mountStore = useStore(); + + const doBackup = async () => { + setDone(false); + let info; + + try { + info = await mx.prepareKeyBackupVersion( + null, + { secureSecretStorage: true }, + ); + info = await mx.createKeyBackupVersion(info); + await mx.scheduleAllGroupSessionsForBackup(); + if (!mountStore.getItem()) return; + setDone(true); + } catch (e) { + deletePrivateKey(keyData.keyId); + await mx.deleteKeyBackupVersion(info.version); + if (!mountStore.getItem()) return; + setDone(null); + } + }; + + useEffect(() => { + mountStore.setItem(true); + doBackup(); + }, []); + + return ( +
    + {done === false && ( +
    + + Creating backup... +
    + )} + {done === true && ( + <> + {twemojify('✅')} + Successfully created backup + + )} + {done === null && ( + <> + Failed to create backup + + + )} +
    + ); +} +CreateKeyBackupDialog.propTypes = { + keyData: PropTypes.shape({}).isRequired, +}; + +function RestoreKeyBackupDialog({ keyData }) { + const [status, setStatus] = useState(false); + const mx = initMatrix.matrixClient; + const mountStore = useStore(); + + const restoreBackup = async () => { + setStatus(false); + + let meBreath = true; + const progressCallback = (progress) => { + if (!progress.successes) return; + if (meBreath === false) return; + meBreath = false; + setTimeout(() => { + meBreath = true; + }, 200); + + setStatus({ message: `Restoring backup keys... (${progress.successes}/${progress.total})` }); + }; + + try { + const backupInfo = await mx.getKeyBackupVersion(); + const info = await mx.restoreKeyBackupWithSecretStorage( + backupInfo, + undefined, + undefined, + { progressCallback }, + ); + if (!mountStore.getItem()) return; + setStatus({ done: `Successfully restored backup keys (${info.imported}/${info.total}).` }); + } catch (e) { + if (!mountStore.getItem()) return; + if (e.errcode === 'RESTORE_BACKUP_ERROR_BAD_KEY') { + deletePrivateKey(keyData.keyId); + setStatus({ error: 'Failed to restore backup. Key is invalid!', errorCode: 'BAD_KEY' }); + } else { + setStatus({ error: 'Failed to restore backup.', errCode: 'UNKNOWN' }); + } + } + }; + + useEffect(() => { + mountStore.setItem(true); + restoreBackup(); + }, []); + + return ( +
    + {(status === false || status.message) && ( +
    + + {status.message ?? 'Restoring backup keys...'} +
    + )} + {status.done && ( + <> + {twemojify('✅')} + {status.done} + + )} + {status.error && ( + <> + {status.error} + + + )} +
    + ); +} +RestoreKeyBackupDialog.propTypes = { + keyData: PropTypes.shape({}).isRequired, +}; + +function DeleteKeyBackupDialog({ requestClose }) { + const [isDeleting, setIsDeleting] = useState(false); + const mx = initMatrix.matrixClient; + const mountStore = useStore(); + mountStore.setItem(true); + + const deleteBackup = async () => { + setIsDeleting(true); + try { + const backupInfo = await mx.getKeyBackupVersion(); + if (backupInfo) await mx.deleteKeyBackupVersion(backupInfo.version); + if (!mountStore.getItem()) return; + requestClose(true); + } catch { + if (!mountStore.getItem()) return; + setIsDeleting(false); + } + }; + + return ( +
    + {twemojify('🗑')} + Deleting key backup is permanent. + All encrypted messages keys stored on server will be deleted. + { + isDeleting + ? + : + } +
    + ); +} +DeleteKeyBackupDialog.propTypes = { + requestClose: PropTypes.func.isRequired, +}; + +function KeyBackup() { + const mx = initMatrix.matrixClient; + const isCSEnabled = useCrossSigningStatus(); + const [keyBackup, setKeyBackup] = useState(undefined); + const mountStore = useStore(); + + const fetchKeyBackupVersion = async () => { + const info = await mx.getKeyBackupVersion(); + if (!mountStore.getItem()) return; + setKeyBackup(info); + }; + + useEffect(() => { + mountStore.setItem(true); + fetchKeyBackupVersion(); + + const handleAccountData = (event) => { + if (event.getType() === 'm.megolm_backup.v1') { + fetchKeyBackupVersion(); + } + }; + + mx.on('accountData', handleAccountData); + return () => { + mx.removeListener('accountData', handleAccountData); + }; + }, [isCSEnabled]); + + const openCreateKeyBackup = async () => { + const keyData = await accessSecretStorage('Create Key Backup'); + if (keyData === null) return; + + openReusableDialog( + Create Key Backup, + () => , + () => fetchKeyBackupVersion(), + ); + }; + + const openRestoreKeyBackup = async () => { + const keyData = await accessSecretStorage('Restore Key Backup'); + if (keyData === null) return; + + openReusableDialog( + Restore Key Backup, + () => , + ); + }; + + const openDeleteKeyBackup = () => openReusableDialog( + Delete Key Backup, + (requestClose) => ( + { + if (isDone) setKeyBackup(null); + requestClose(); + }} + /> + ), + ); + + const renderOptions = () => { + if (keyBackup === undefined) return ; + if (keyBackup === null) return ; + return ( + <> + + + + ); + }; + + return ( + + Online backup your encrypted messages keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key. + {!isCSEnabled && ( + + )} + + )} + options={isCSEnabled ? renderOptions() : null} + /> + ); +} + +export default KeyBackup; diff --git a/src/app/organisms/settings/KeyBackup.scss b/src/app/organisms/settings/KeyBackup.scss new file mode 100644 index 00000000..1f2b9b66 --- /dev/null +++ b/src/app/organisms/settings/KeyBackup.scss @@ -0,0 +1,27 @@ +.key-backup__create, +.key-backup__restore { + padding: var(--sp-normal); + + & > div { + padding: var(--sp-normal) 0; + display: flex; + align-items: center; + + & > .text { + margin: 0 var(--sp-normal); + } + } + + & > .text { + margin-bottom: var(--sp-normal); + } +} + +.key-backup__delete { + padding: var(--sp-normal); + padding-top: var(--sp-extra-loose); + + & > .text { + padding-bottom: var(--sp-normal); + } +} \ No newline at end of file diff --git a/src/app/organisms/settings/SecretStorageAccess.jsx b/src/app/organisms/settings/SecretStorageAccess.jsx new file mode 100644 index 00000000..f0131b14 --- /dev/null +++ b/src/app/organisms/settings/SecretStorageAccess.jsx @@ -0,0 +1,133 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import './SecretStorageAccess.scss'; +import { deriveKey } from 'matrix-js-sdk/lib/crypto/key_passphrase'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableDialog } from '../../../client/action/navigation'; +import { getDefaultSSKey, getSSKeyInfo } from '../../../util/matrixUtil'; +import { storePrivateKey, hasPrivateKey, getPrivateKey } from '../../../client/state/secretStorageKeys'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import Input from '../../atoms/input/Input'; +import Spinner from '../../atoms/spinner/Spinner'; + +import { useStore } from '../../hooks/useStore'; + +function SecretStorageAccess({ onComplete }) { + const mx = initMatrix.matrixClient; + const sSKeyId = getDefaultSSKey(); + const sSKeyInfo = getSSKeyInfo(sSKeyId); + const isPassphrase = !!sSKeyInfo.passphrase; + const [withPhrase, setWithPhrase] = useState(isPassphrase); + const [process, setProcess] = useState(false); + const [error, setError] = useState(null); + const mountStore = useStore(); + mountStore.setItem(true); + + const toggleWithPhrase = () => setWithPhrase(!withPhrase); + + const processInput = async ({ key, phrase }) => { + setProcess(true); + try { + const { salt, iterations } = sSKeyInfo.passphrase; + const privateKey = key + ? mx.keyBackupKeyFromRecoveryKey(key) + : await deriveKey(phrase, salt, iterations); + const isCorrect = await mx.checkSecretStorageKey(privateKey, sSKeyInfo); + + if (!mountStore.getItem()) return; + if (!isCorrect) { + setError(`Incorrect Security ${key ? 'Key' : 'Phrase'}`); + setProcess(false); + return; + } + onComplete({ + keyId: sSKeyId, + key, + phrase, + privateKey, + }); + } catch (e) { + if (!mountStore.getItem()) return; + setError(`Incorrect Security ${key ? 'Key' : 'Phrase'}`); + setProcess(false); + } + }; + + const handleForm = async (e) => { + e.preventDefault(); + const password = e.target.password.value; + if (password.trim() === '') return; + const data = {}; + if (withPhrase) data.phrase = password; + else data.key = password; + processInput(data); + }; + + const handleChange = () => { + setError(null); + setProcess(false); + }; + + return ( +
    +
    + + {error && {error}} + {!process && ( +
    + + {isPassphrase && } +
    + )} +
    + {process && } +
    + ); +} +SecretStorageAccess.propTypes = { + onComplete: PropTypes.func.isRequired, +}; + +/** + * @param {string} title Title of secret storage access dialog + * @returns {Promise} resolve to keyData or null + */ +export const accessSecretStorage = (title) => new Promise((resolve) => { + let isCompleted = false; + const defaultSSKey = getDefaultSSKey(); + if (hasPrivateKey(defaultSSKey)) { + resolve({ keyId: defaultSSKey, privateKey: getPrivateKey(defaultSSKey) }); + return; + } + const handleComplete = (keyData) => { + isCompleted = true; + storePrivateKey(keyData.keyId, keyData.privateKey); + resolve(keyData); + }; + + openReusableDialog( + {title}, + (requestClose) => ( + { + handleComplete(keyData); + requestClose(requestClose); + }} + /> + ), + () => { + if (!isCompleted) resolve(null); + }, + ); +}); + +export default SecretStorageAccess; diff --git a/src/app/organisms/settings/SecretStorageAccess.scss b/src/app/organisms/settings/SecretStorageAccess.scss new file mode 100644 index 00000000..a7c0a9f6 --- /dev/null +++ b/src/app/organisms/settings/SecretStorageAccess.scss @@ -0,0 +1,20 @@ +.secret-storage-access { + padding: var(--sp-normal); + + & form > *:not(:first-child) { + margin-top: var(--sp-normal); + } + + & .text-b3 { + color: var(--tc-danger-high); + margin-top: var(--sp-ultra-tight) !important; + } + + &__btn { + display: flex; + justify-content: space-between; + } + & .donut-spinner { + margin-top: var(--sp-normal); + } +} \ No newline at end of file diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index acfef5c9..6dbbffb2 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -26,6 +26,8 @@ import ImportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/Impor import ExportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys'; import ProfileEditor from '../profile-editor/ProfileEditor'; +import CrossSigning from './CrossSigning'; +import KeyBackup from './KeyBackup'; import DeviceManage from './DeviceManage'; import SunIC from '../../../../public/res/ic/outlined/sun.svg'; @@ -168,18 +170,13 @@ function SecuritySection() { return (
    - Session Info - - Use this session ID-key combo to verify or manage this session.} - /> + Cross signing and backup + +
    - Encryption + Export/Import encryption keys Date: Sun, 24 Apr 2022 11:23:10 +0100 Subject: [PATCH 061/824] Adapt to different device widths (#401) * Now adapting to small screen sizes, needs improvements * Fix that site only gets into mobile mode when resized * - Added navigation event triggered if user requests to return to navigation on compact screens - People drawer wont be shown on compact screens - Still accessible using settings - would be duplicated UI - mobileSize is now compactSize * Put threshold for collapsing the base UI in a shared file * Switch to a more simple solution using CSS media queries over JS - Move back button to the left a bit so it doesnt get in touch with room icon * switch from component-individual-thresholds to device-type thresholds - <750px: Mobile - <900px: Tablet - >900px: Desktop * Make Settings drawer component collapse on mobile * Fix EmojiBoard not showing up and messing up UI when screen is smaller than 360px * Improve code quality; allow passing classNames to IconButton - remove unnessesary div wrappers - use dir.side where appropriate - rename threshold and its mixins to more descriptive names - Rename "OPEN_NAVIGATION" to "NAVIGATION_OPENED" * - follow BEM methology - remove ROOM_SELECTED listener - rename NAVIGATION_OPENED to OPEN_NAVIGATION where appropriate - this does NOT changes that ref should be used for changing visability * Use ref to change visability to avoid re-rendering * Use ref to change visability to avoid re-rendering * Fix that room component is not hidden by default. This resulted in a broken view when application is viewed in mobile size without having selected a room since loading. * fix: leaving a room should bring one back to navigation Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- src/app/atoms/button/IconButton.jsx | 5 ++- src/app/atoms/header/Header.scss | 5 +++ .../molecules/popup-window/PopupWindow.scss | 2 +- .../molecules/room-options/RoomOptions.jsx | 3 +- src/app/organisms/emoji-board/EmojiBoard.scss | 2 + src/app/organisms/invite-list/InviteList.jsx | 3 +- src/app/organisms/room/Room.jsx | 4 +- src/app/organisms/room/Room.scss | 9 +++- src/app/organisms/room/RoomSettings.jsx | 3 +- src/app/organisms/room/RoomViewCmdBar.jsx | 6 ++- src/app/organisms/room/RoomViewHeader.jsx | 11 ++++- src/app/organisms/room/RoomViewHeader.scss | 17 +++++++- src/app/organisms/settings/Settings.scss | 16 ++++++- src/app/partials/screen.scss | 28 +++++++++++++ src/app/templates/client/Client.jsx | 42 +++++++++++++++++-- src/app/templates/client/Client.scss | 14 ++++++- src/client/action/navigation.js | 9 ++++ src/client/state/cons.js | 2 + src/client/state/navigation.js | 3 ++ 19 files changed, 167 insertions(+), 17 deletions(-) create mode 100644 src/app/partials/screen.scss diff --git a/src/app/atoms/button/IconButton.jsx b/src/app/atoms/button/IconButton.jsx index a06c136c..f6a8730e 100644 --- a/src/app/atoms/button/IconButton.jsx +++ b/src/app/atoms/button/IconButton.jsx @@ -11,11 +11,12 @@ const IconButton = React.forwardRef(({ variant, size, type, tooltip, tooltipPlacement, src, onClick, tabIndex, disabled, isImage, + className, }, ref) => { const btn = (
    - { isDrawer && } + {isDrawer && }
    ); } diff --git a/src/app/organisms/room/Room.scss b/src/app/organisms/room/Room.scss index 975acbd7..11a00074 100644 --- a/src/app/organisms/room/Room.scss +++ b/src/app/organisms/room/Room.scss @@ -1,4 +1,5 @@ @use '../../partials/flex'; +@use '../../partials/screen'; .room { @extend .cp-fx__row; @@ -9,4 +10,10 @@ position: relative; overflow: hidden; } -} \ No newline at end of file +} + +.room .people-drawer { + @include screen.smallerThan(tabletBreakpoint) { + display: none; + } +} diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 8d14c18d..b75ca7fc 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -7,7 +7,7 @@ import { blurOnBubbling } from '../../atoms/button/script'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { openInviteUser, toggleRoomSettings } from '../../../client/action/navigation'; +import { openInviteUser, toggleRoomSettings, openNavigation } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; @@ -88,6 +88,7 @@ function GeneralSettings({ roomId }) { onClick={() => { if (confirm('Are you sure that you want to leave this room?')) { roomActions.leave(roomId); + openNavigation(); } }} iconSrc={LeaveArrowIC} diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index 4ccb20a4..a20afdb7 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -14,6 +14,7 @@ import { openCreateRoom, openPublicRooms, openInviteUser, + openNavigation, } from '../../../client/action/navigation'; import { getEmojiForCompletion } from '../emoji-board/custom-emoji'; import AsyncSearch from '../../../util/AsyncSearch'; @@ -44,7 +45,10 @@ const commands = [{ }, { name: 'leave', description: 'Leave current room', - exe: (roomId) => roomActions.leave(roomId), + exe: (roomId) => { + roomActions.leave(roomId); + openNavigation(); + }, }, { name: 'invite', isOptions: true, diff --git a/src/app/organisms/room/RoomViewHeader.jsx b/src/app/organisms/room/RoomViewHeader.jsx index 669464ae..db1df9d8 100644 --- a/src/app/organisms/room/RoomViewHeader.jsx +++ b/src/app/organisms/room/RoomViewHeader.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import './RoomViewHeader.scss'; @@ -25,6 +25,7 @@ import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.s import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; +import BackArrowIC from '../../../../public/res/ic/outlined/chevron-left.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; @@ -73,6 +74,12 @@ function RoomViewHeader({ roomId }) { return (
    + navigation.emit(cons.events.navigation.NAVIGATION_OPENED)} + /> toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} /> - + } + */ + const navWrapperRef = useRef(null); + /** + * @type {React.MutableRefObject} + */ + const roomWrapperRef = useRef(null); + + // #region Liston on events for compact screen sizes + function onRoomSelected() { + // setActiveView(viewPossibilities.room); + navWrapperRef.current.classList.add(classNameHidden); + roomWrapperRef.current.classList.remove(classNameHidden); + } + function onNavigationSelected() { + // setActiveView(viewPossibilities.nav); + navWrapperRef.current.classList.remove(classNameHidden); + roomWrapperRef.current.classList.add(classNameHidden); + } + + useEffect(() => { + navigation.on(cons.events.navigation.ROOM_SELECTED, onRoomSelected); + navigation.on(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); + + return (() => { + navigation.removeListener(cons.events.navigation.ROOM_SELECTED, onRoomSelected); + navigation.removeListener(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); + }); + }, []); + // #endregion + useEffect(() => { let counter = 0; const iId = setInterval(() => { @@ -64,6 +98,7 @@ function Client() { ); } + // #region drag and drop function dragContainsFiles(e) { if (!e.dataTransfer.types) return false; @@ -119,6 +154,7 @@ function Client() { initMatrix.roomsInput.setAttachment(roomId, file); initMatrix.roomsInput.emit(cons.events.roomsInput.ATTACHMENT_SET, file); } + // #endregion return (
    -
    +
    -
    +
    diff --git a/src/app/templates/client/Client.scss b/src/app/templates/client/Client.scss index 45a50527..67d5dfd5 100644 --- a/src/app/templates/client/Client.scss +++ b/src/app/templates/client/Client.scss @@ -1,3 +1,5 @@ +@use '../../partials/screen'; + .client-container { display: flex; height: 100%; @@ -5,12 +7,22 @@ .navigation__wrapper { width: var(--navigation-width); + + @include screen.smallerThan(mobileBreakpoint) { + width: 100%; + } } + .room__wrapper { flex: 1; min-width: 0; } +@include screen.smallerThan(mobileBreakpoint) { + .client__item-hidden { + display: none; + } +} .loading-display { position: absolute; @@ -41,4 +53,4 @@ .text { color: var(--tc-link); } -} \ No newline at end of file +} diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index e16d25d2..8876732e 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -23,6 +23,15 @@ export function selectRoom(roomId, eventId) { }); } +/** + * Open navigation on compact screen sizes + */ +export function openNavigation() { + appDispatcher.dispatch({ + type: cons.actions.navigation.OPEN_NAVIGATION, + }); +} + export function openSpaceSettings(roomId, tabText) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SPACE_SETTINGS, diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 4e258ac3..34a3a928 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -47,6 +47,7 @@ const cons = { CLICK_REPLY_TO: 'CLICK_REPLY_TO', OPEN_SEARCH: 'OPEN_SEARCH', OPEN_REUSABLE_CONTEXT_MENU: 'OPEN_REUSABLE_CONTEXT_MENU', + OPEN_NAVIGATION: 'OPEN_NAVIGATION', OPEN_REUSABLE_DIALOG: 'OPEN_REUSABLE_DIALOG', }, room: { @@ -93,6 +94,7 @@ const cons = { REPLY_TO_CLICKED: 'REPLY_TO_CLICKED', SEARCH_OPENED: 'SEARCH_OPENED', REUSABLE_CONTEXT_MENU_OPENED: 'REUSABLE_CONTEXT_MENU_OPENED', + NAVIGATION_OPENED: 'NAVIGATION_OPENED', REUSABLE_DIALOG_OPENED: 'REUSABLE_DIALOG_OPENED', }, roomList: { diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index eb59e7a2..bbecb2e1 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -131,6 +131,9 @@ class Navigation extends EventEmitter { [cons.actions.navigation.OPEN_SETTINGS]: () => { this.emit(cons.events.navigation.SETTINGS_OPENED, action.tabText); }, + [cons.actions.navigation.OPEN_NAVIGATION]: () => { + this.emit(cons.events.navigation.NAVIGATION_OPENED); + }, [cons.actions.navigation.OPEN_EMOJIBOARD]: () => { this.emit( cons.events.navigation.EMOJIBOARD_OPENED, From ed8eca0c1ddbcf1ad89ca8e0ae491801ae8a5543 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 24 Apr 2022 15:55:05 +0530 Subject: [PATCH 062/824] Remove unwanted css --- src/app/organisms/settings/Settings.scss | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/app/organisms/settings/Settings.scss b/src/app/organisms/settings/Settings.scss index ad480321..dac53d7a 100644 --- a/src/app/organisms/settings/Settings.scss +++ b/src/app/organisms/settings/Settings.scss @@ -88,16 +88,3 @@ } } } - -.settings-window { - @include screen.smallerThan(mobileBreakpoint) { - .pw__drawer p, .pw__drawer .header h4 { - display: none; - width: 0; - } - - .pw__drawer { - width: fit-content; - } - } -} From 74216f75e2b47d517b50fa951a608f525dfd1f7b Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 24 Apr 2022 16:17:26 +0530 Subject: [PATCH 063/824] Fix padding in room header --- src/app/atoms/header/Header.scss | 5 ----- src/app/organisms/room/RoomView.scss | 8 ++++++++ src/app/organisms/room/RoomViewHeader.scss | 6 +++--- src/app/partials/{screen.scss => _screen.scss} | 0 4 files changed, 11 insertions(+), 8 deletions(-) rename src/app/partials/{screen.scss => _screen.scss} (100%) diff --git a/src/app/atoms/header/Header.scss b/src/app/atoms/header/Header.scss index 081b61e2..9e45f824 100644 --- a/src/app/atoms/header/Header.scss +++ b/src/app/atoms/header/Header.scss @@ -1,6 +1,5 @@ @use '../../partials/text'; @use '../../partials/dir'; -@use '../../partials/screen'; .header { @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); @@ -41,8 +40,4 @@ display: -webkit-box; } } - - @include screen.smallerThan(mobileBreakpoint) { - @include dir.side(padding, calc(var(--sp-normal) - 10px), var(--sp-extra-tight)); - } } \ No newline at end of file diff --git a/src/app/organisms/room/RoomView.scss b/src/app/organisms/room/RoomView.scss index 2eda3ea7..4f06bf26 100644 --- a/src/app/organisms/room/RoomView.scss +++ b/src/app/organisms/room/RoomView.scss @@ -1,4 +1,6 @@ @use '../../partials/flex'; +@use '../../partials/screen'; +@use '../../partials/dir'; .room-view { @extend .cp-fx__column; @@ -18,6 +20,12 @@ box-shadow: var(--bs-popup); } + & .header { + @include screen.smallerThan(mobileBreakpoint) { + padding: 0 var(--sp-tight); + } + } + &__content-wrapper { @extend .cp-fx__item-one; @extend .cp-fx__column; diff --git a/src/app/organisms/room/RoomViewHeader.scss b/src/app/organisms/room/RoomViewHeader.scss index 79bb8dd2..267cd116 100644 --- a/src/app/organisms/room/RoomViewHeader.scss +++ b/src/app/organisms/room/RoomViewHeader.scss @@ -27,14 +27,14 @@ } } -.header .room-header__drawer-btn { +.room-header__drawer-btn { @include screen.smallerThan(tabletBreakpoint) { display: none; } } -.header .room-header__back-btn { - @include dir.side(margin, 0, 5px); +.room-header__back-btn { + @include dir.side(margin, 0, var(--sp-tight)); @include screen.biggerThan(mobileBreakpoint) { display: none; diff --git a/src/app/partials/screen.scss b/src/app/partials/_screen.scss similarity index 100% rename from src/app/partials/screen.scss rename to src/app/partials/_screen.scss From 53f1129242ee6fee6cbf6add12daed39965a7478 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 24 Apr 2022 16:35:42 +0530 Subject: [PATCH 064/824] Fix app stuck on welcome screen in small device --- src/app/organisms/invite-list/InviteList.jsx | 3 +-- src/app/organisms/room/Room.jsx | 6 ++++- src/app/organisms/room/RoomSettings.jsx | 3 +-- src/app/organisms/room/RoomViewCmdBar.jsx | 2 -- src/app/organisms/room/RoomViewHeader.jsx | 6 ++--- src/app/templates/client/Client.jsx | 23 +++++--------------- src/client/action/navigation.js | 4 +--- 7 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/app/organisms/invite-list/InviteList.jsx b/src/app/organisms/invite-list/InviteList.jsx index 03a94d69..65920704 100644 --- a/src/app/organisms/invite-list/InviteList.jsx +++ b/src/app/organisms/invite-list/InviteList.jsx @@ -5,7 +5,7 @@ import './InviteList.scss'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import * as roomActions from '../../../client/action/room'; -import { selectRoom, selectTab, openNavigation } from '../../../client/action/navigation'; +import { selectRoom, selectTab } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -28,7 +28,6 @@ function InviteList({ isOpen, onRequestClose }) { procInvite.add(roomId); changeProcInvite(new Set(Array.from(procInvite))); roomActions.leave(roomId, isDM); - openNavigation(); } function updateInviteList(roomId) { if (procInvite.has(roomId)) procInvite.delete(roomId); diff --git a/src/app/organisms/room/Room.jsx b/src/app/organisms/room/Room.jsx index 4a1a969d..447686af 100644 --- a/src/app/organisms/room/Room.jsx +++ b/src/app/organisms/room/Room.jsx @@ -6,6 +6,7 @@ import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; import RoomTimeline from '../../../client/state/RoomTimeline'; import navigation from '../../../client/state/navigation'; +import { openNavigation } from '../../../client/action/navigation'; import Welcome from '../welcome/Welcome'; import RoomView from './RoomView'; @@ -53,7 +54,10 @@ function Room() { }, []); const { roomTimeline, eventId } = roomInfo; - if (roomTimeline === null) return ; + if (roomTimeline === null) { + setTimeout(() => openNavigation()); + return ; + } return (
    diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index b75ca7fc..8d14c18d 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -7,7 +7,7 @@ import { blurOnBubbling } from '../../atoms/button/script'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { openInviteUser, toggleRoomSettings, openNavigation } from '../../../client/action/navigation'; +import { openInviteUser, toggleRoomSettings } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; @@ -88,7 +88,6 @@ function GeneralSettings({ roomId }) { onClick={() => { if (confirm('Are you sure that you want to leave this room?')) { roomActions.leave(roomId); - openNavigation(); } }} iconSrc={LeaveArrowIC} diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index a20afdb7..5bbc0aae 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -14,7 +14,6 @@ import { openCreateRoom, openPublicRooms, openInviteUser, - openNavigation, } from '../../../client/action/navigation'; import { getEmojiForCompletion } from '../emoji-board/custom-emoji'; import AsyncSearch from '../../../util/AsyncSearch'; @@ -47,7 +46,6 @@ const commands = [{ description: 'Leave current room', exe: (roomId) => { roomActions.leave(roomId); - openNavigation(); }, }, { name: 'invite', diff --git a/src/app/organisms/room/RoomViewHeader.jsx b/src/app/organisms/room/RoomViewHeader.jsx index db1df9d8..a4915ad5 100644 --- a/src/app/organisms/room/RoomViewHeader.jsx +++ b/src/app/organisms/room/RoomViewHeader.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './RoomViewHeader.scss'; @@ -8,7 +8,7 @@ import { blurOnBubbling } from '../../atoms/button/script'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { toggleRoomSettings, openReusableContextMenu } from '../../../client/action/navigation'; +import { toggleRoomSettings, openReusableContextMenu, openNavigation } from '../../../client/action/navigation'; import { togglePeopleDrawer } from '../../../client/action/settings'; import colorMXID from '../../../util/colorMXID'; import { getEventCords } from '../../../util/common'; @@ -78,7 +78,7 @@ function RoomViewHeader({ roomId }) { src={BackArrowIC} className="room-header__back-btn" tooltip="Return to navigation" - onClick={() => navigation.emit(cons.events.navigation.NAVIGATION_OPENED)} + onClick={() => openNavigation()} /> toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} /> + toggleRoomSettings(tabText.MEMBERS)} tooltip="Members" src={UserIC} /> Date: Sun, 24 Apr 2022 17:10:18 +0530 Subject: [PATCH 066/824] Fix crash on invite from dendrite hs (#453) --- src/app/organisms/invite-list/InviteList.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/organisms/invite-list/InviteList.jsx b/src/app/organisms/invite-list/InviteList.jsx index 65920704..e9a5adef 100644 --- a/src/app/organisms/invite-list/InviteList.jsx +++ b/src/app/organisms/invite-list/InviteList.jsx @@ -54,17 +54,19 @@ function InviteList({ isOpen, onRequestClose }) { }, [procInvite]); function renderRoomTile(roomId) { - const myRoom = initMatrix.matrixClient.getRoom(roomId); + const mx = initMatrix.matrixClient; + const myRoom = mx.getRoom(roomId); const roomName = myRoom.name; let roomAlias = myRoom.getCanonicalAlias(); if (roomAlias === null) roomAlias = myRoom.roomId; + const inviterName = myRoom.getMember(mx.getUserId())?.events?.member?.getSender?.() ?? ''; return ( ) From 9a22b255645287bad642d3e320a23d584121990e Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 24 Apr 2022 17:29:49 +0530 Subject: [PATCH 067/824] Show popup window in full screen at mobile devices --- src/app/molecules/dialog/Dialog.jsx | 2 +- src/app/molecules/dialog/Dialog.scss | 2 +- src/app/molecules/popup-window/PopupWindow.jsx | 3 ++- src/app/molecules/popup-window/PopupWindow.scss | 11 ++++++++++- src/app/molecules/room-tile/RoomTile.jsx | 1 - src/app/organisms/drag-drop/DragDrop.jsx | 2 +- src/app/organisms/drag-drop/DragDrop.scss | 2 +- src/app/organisms/search/Search.jsx | 2 +- src/app/organisms/search/Search.scss | 2 +- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/app/molecules/dialog/Dialog.jsx b/src/app/molecules/dialog/Dialog.jsx index a59520f6..2f29971d 100644 --- a/src/app/molecules/dialog/Dialog.jsx +++ b/src/app/molecules/dialog/Dialog.jsx @@ -16,7 +16,7 @@ function Dialog({ }) { return ( diff --git a/src/app/organisms/drag-drop/DragDrop.scss b/src/app/organisms/drag-drop/DragDrop.scss index 6361553f..2e5b4f51 100644 --- a/src/app/organisms/drag-drop/DragDrop.scss +++ b/src/app/organisms/drag-drop/DragDrop.scss @@ -1,4 +1,4 @@ -.drag-drop__model { +.drag-drop__modal { box-shadow: none; text-align: center; diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index 1eddbf67..d40d8615 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -199,7 +199,7 @@ function Search() { return ( Date: Sun, 24 Apr 2022 17:48:35 +0200 Subject: [PATCH 068/824] Add LaTeX / math input and rendering support (#345) * Initial display support * Use better colors for error in math parsing * Parse math markdown * Use proper jsx * Better copy support * use css var directly * Remove console.debug call * Lazy load math module * Show fallback while katex is loading --- package-lock.json | 116 +++++++++++++++++++++-- package.json | 2 + src/app/atoms/math/Math.jsx | 33 +++++++ src/app/molecules/message/Message.jsx | 2 +- src/client/state/RoomsInput.js | 7 +- src/util/markdown.js | 57 ++++++++++- src/util/sanitize.js | 3 +- src/util/{twemojify.js => twemojify.jsx} | 28 +++++- 8 files changed, 230 insertions(+), 18 deletions(-) create mode 100644 src/app/atoms/math/Math.jsx rename src/util/{twemojify.js => twemojify.jsx} (56%) diff --git a/package-lock.json b/package-lock.json index c028f047..14063ed5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,10 +21,12 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.11", + "katex": "^0.15.2", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", + "micromark-extension-math": "^2.0.2", "micromark-util-chunked": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.1", @@ -2585,6 +2587,11 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/katex": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.11.1.tgz", + "integrity": "sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -2945,6 +2952,8 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2960,7 +2969,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -4170,7 +4181,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, "engines": { "node": ">= 12" } @@ -8359,6 +8369,21 @@ "node": ">=4.0" } }, + "node_modules/katex": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.2.tgz", + "integrity": "sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.0.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9095,6 +9120,40 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz", + "integrity": "sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==", + "license": "MIT", + "dependencies": { + "@types/katex": "^0.11.0", + "katex": "^0.13.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/katex": { + "version": "0.13.24", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz", + "integrity": "sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.0.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/micromark-factory-destination": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", @@ -15793,6 +15852,11 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/katex": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.11.1.tgz", + "integrity": "sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -16107,15 +16171,14 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": { - "ajv": "^8.0.0" - }, + "requires": {}, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "version": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16127,7 +16190,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -17121,8 +17186,7 @@ "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "commondir": { "version": "1.0.1", @@ -20305,6 +20369,14 @@ "object.assign": "^4.1.2" } }, + "katex": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.2.tgz", + "integrity": "sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==", + "requires": { + "commander": "^8.0.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -20922,6 +20994,30 @@ "uvu": "^0.5.0" } }, + "micromark-extension-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz", + "integrity": "sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==", + "requires": { + "@types/katex": "^0.11.0", + "katex": "^0.13.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "dependencies": { + "katex": { + "version": "0.13.24", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz", + "integrity": "sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==", + "requires": { + "commander": "^8.0.0" + } + } + } + }, "micromark-factory-destination": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", diff --git a/package.json b/package.json index eb783b91..f790a3e2 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,12 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.11", + "katex": "^0.15.2", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", + "micromark-extension-math": "^2.0.2", "micromark-util-chunked": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.1", diff --git a/src/app/atoms/math/Math.jsx b/src/app/atoms/math/Math.jsx new file mode 100644 index 00000000..dcfd0212 --- /dev/null +++ b/src/app/atoms/math/Math.jsx @@ -0,0 +1,33 @@ +import React, { useEffect, useRef } from 'react'; +import PropTypes from 'prop-types'; + +import katex from 'katex'; +import 'katex/dist/katex.min.css'; + +import 'katex/dist/contrib/copy-tex'; +import 'katex/dist/contrib/copy-tex.css'; + +const Math = React.memo(({ + content, throwOnError, errorColor, displayMode, +}) => { + const ref = useRef(null); + + useEffect(() => { + katex.render(content, ref.current, { throwOnError, errorColor, displayMode }); + }, [content, throwOnError, errorColor, displayMode]); + + return ; +}); +Math.defaultProps = { + throwOnError: null, + errorColor: null, + displayMode: null, +}; +Math.propTypes = { + content: PropTypes.string.isRequired, + throwOnError: PropTypes.bool, + errorColor: PropTypes.string, + displayMode: PropTypes.bool, +}; + +export default Math; diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 07499977..70ca87e3 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -189,7 +189,7 @@ const MessageBody = React.memo(({ let content = null; if (isCustomHTML) { try { - content = twemojify(sanitizeCustomHtml(body), undefined, true, false); + content = twemojify(sanitizeCustomHtml(body), undefined, true, false, true); } catch { console.error('Malformed custom html: ', body); content = twemojify(body, undefined); diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 1e2fa192..4bbd3d88 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -2,8 +2,9 @@ import EventEmitter from 'events'; import { micromark } from 'micromark'; import { gfm, gfmHtml } from 'micromark-extension-gfm'; import encrypt from 'browser-encrypt-attachment'; +import { math } from 'micromark-extension-math'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; -import { spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; +import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; import cons from './cons'; import settings from './settings'; @@ -85,8 +86,8 @@ function getVideoThumbnail(video, width, height, mimeType) { function getFormattedBody(markdown) { const result = micromark(markdown, { - extensions: [gfm(), spoilerExtension()], - htmlExtensions: [gfmHtml(), spoilerExtensionHtml], + extensions: [gfm(), spoilerExtension(), math()], + htmlExtensions: [gfmHtml(), spoilerExtensionHtml, mathExtensionHtml], }); const bodyParts = result.match(/^(

    )(.*)(<\/p>)$/); if (bodyParts === null) return result; diff --git a/src/util/markdown.js b/src/util/markdown.js index 0a6472e9..2ce613b0 100644 --- a/src/util/markdown.js +++ b/src/util/markdown.js @@ -140,4 +140,59 @@ const spoilerExtensionHtml = { }, }; -export { inlineExtension, spoilerExtension, spoilerExtensionHtml }; +const mathExtensionHtml = { + enter: { + mathFlow() { + this.lineEndingIfNeeded(); + }, + mathFlowFenceMeta() { + this.buffer(); + }, + mathText() { + this.buffer(); + }, + }, + exit: { + mathFlow() { + const value = this.encode(this.resume().replace(/(?:\r?\n|\r)$/, '')); + this.tag('

    '); + this.raw(value); + this.tag('
    '); + this.setData('mathFlowOpen'); + this.setData('slurpOneLineEnding'); + }, + mathFlowFence() { + // After the first fence. + if (!this.getData('mathFlowOpen')) { + this.setData('mathFlowOpen', true); + this.setData('slurpOneLineEnding', true); + this.buffer(); + } + }, + mathFlowFenceMeta() { + this.resume(); + }, + mathFlowValue(token) { + this.raw(this.sliceSerialize(token)); + }, + mathText() { + const value = this.encode(this.resume()); + this.tag(''); + this.raw(value); + this.tag(''); + }, + mathTextData(token) { + this.raw(this.sliceSerialize(token)); + }, + }, +}; + +export { + inlineExtension, + spoilerExtension, spoilerExtensionHtml, + mathExtensionHtml, +}; diff --git a/src/util/sanitize.js b/src/util/sanitize.js index 1f1fbfbe..3b230523 100644 --- a/src/util/sanitize.js +++ b/src/util/sanitize.js @@ -15,7 +15,8 @@ const urlSchemes = ['https', 'http', 'ftp', 'mailto', 'magnet']; const permittedTagToAttributes = { font: ['style', 'data-mx-bg-color', 'data-mx-color', 'color'], - span: ['style', 'data-mx-bg-color', 'data-mx-color', 'data-mx-spoiler', 'data-mx-pill', 'data-mx-ping'], + span: ['style', 'data-mx-bg-color', 'data-mx-color', 'data-mx-spoiler', 'data-mx-maths', 'data-mx-pill', 'data-mx-ping'], + div: ['data-mx-maths'], a: ['name', 'target', 'href', 'rel'], img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], o: ['start'], diff --git a/src/util/twemojify.js b/src/util/twemojify.jsx similarity index 56% rename from src/util/twemojify.js rename to src/util/twemojify.jsx index bcef5869..aed8b09d 100644 --- a/src/util/twemojify.js +++ b/src/util/twemojify.jsx @@ -1,17 +1,41 @@ /* eslint-disable import/prefer-default-export */ +import React, { lazy, Suspense } from 'react'; + import linkifyHtml from 'linkifyjs/html'; import parse from 'html-react-parser'; import twemoji from 'twemoji'; import { sanitizeText } from './sanitize'; +const Math = lazy(() => import('../app/atoms/math/Math')); + +const mathOptions = { + replace: (node) => { + const maths = node.attribs?.['data-mx-maths']; + if (maths) { + return ( + {maths}}> + + + ); + } + return null; + }, +}; + /** * @param {string} text - text to twemojify * @param {object|undefined} opts - options for tweomoji.parse * @param {boolean} [linkify=false] - convert links to html tags (default: false) * @param {boolean} [sanitize=true] - sanitize html text (default: true) + * @param {boolean} [maths=false] - render maths (default: false) * @returns React component */ -export function twemojify(text, opts, linkify = false, sanitize = true) { +export function twemojify(text, opts, linkify = false, sanitize = true, maths = false) { if (typeof text !== 'string') return text; let content = text; @@ -25,5 +49,5 @@ export function twemojify(text, opts, linkify = false, sanitize = true) { rel: 'noreferrer noopener', }); } - return parse(content); + return parse(content, maths ? mathOptions : null); } From 3da9b706329806cee114383760c5e6a9d1473f45 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 24 Apr 2022 18:29:50 +0200 Subject: [PATCH 069/824] Show devices without encryption support separately from unverified session (#499) * Show devices without encryption support separately * Fix typo * Don't show sessions without encryption support in red --- src/app/organisms/navigation/SideBar.jsx | 2 +- src/app/organisms/settings/DeviceManage.jsx | 19 ++++++++++++++++--- src/util/matrixUtil.js | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/app/organisms/navigation/SideBar.jsx b/src/app/organisms/navigation/SideBar.jsx index eb20b72c..53186965 100644 --- a/src/app/organisms/navigation/SideBar.jsx +++ b/src/app/organisms/navigation/SideBar.jsx @@ -92,7 +92,7 @@ function ProfileAvatarMenu() { function CrossSigninAlert() { const deviceList = useDeviceList(); - const unverified = deviceList?.filter((device) => !isCrossVerified(device.device_id)); + const unverified = deviceList?.filter((device) => isCrossVerified(device.device_id) === false); if (!unverified?.length) return null; diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 5c60bf0a..d7efd362 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -124,9 +124,16 @@ function DeviceManage() { const unverified = []; const verified = []; + const noEncryption = []; deviceList.sort((a, b) => b.last_seen_ts - a.last_seen_ts).forEach((device) => { - if (isCrossVerified(device.device_id)) verified.push(device); - else unverified.push(device); + const isVerified = isCrossVerified(device.device_id); + if (isVerified === true) { + verified.push(device); + } else if (isVerified === false) { + unverified.push(device); + } else { + noEncryption.push(device); + } }); return (
    @@ -145,9 +152,15 @@ function DeviceManage() { { unverified.length > 0 ? unverified.map((device) => renderDevice(device, false)) - : No unverified session + : No unverified sessions }
    + {noEncryption.length > 0 && ( +
    + Sessions without encryption support + {noEncryption.map((device) => renderDevice(device, true))} +
    + )}
    Verified sessions { diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index 1b67f7e6..16be1175 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -171,7 +171,8 @@ export function isCrossVerified(deviceId) { const deviceTrust = crossSignInfo.checkDeviceTrust(crossSignInfo, deviceInfo, false, true); return deviceTrust.isCrossSigningVerified(); } catch { - return false; + // device does not support encryption + return null; } } From d760be58c3b64629e6fc6483dc6c5a2b343ab55b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 25 Apr 2022 20:21:21 +0530 Subject: [PATCH 070/824] Replace confirm and prompt with custom dialogs (#500) --- .../confirm-dialog/ConfirmDialog.jsx | 58 ++++++++++++++++++ .../confirm-dialog/ConfirmDialog.scss | 11 ++++ src/app/molecules/message/Message.jsx | 15 +++-- .../room-encryption/RoomEncryption.jsx | 21 ++++--- .../molecules/room-options/RoomOptions.jsx | 20 ++++--- .../molecules/room-profile/RoomProfile.jsx | 9 ++- .../molecules/space-options/SpaceOptions.jsx | 17 ++++-- .../profile-editor/ProfileEditor.jsx | 11 +++- .../profile-viewer/ProfileViewer.jsx | 14 +++-- src/app/organisms/room/RoomSettings.jsx | 14 +++-- src/app/organisms/settings/DeviceManage.jsx | 60 ++++++++++++++++--- src/app/organisms/settings/DeviceManage.scss | 11 ++++ src/app/organisms/settings/Settings.jsx | 7 ++- .../space-settings/SpaceSettings.jsx | 14 +++-- 14 files changed, 232 insertions(+), 50 deletions(-) create mode 100644 src/app/molecules/confirm-dialog/ConfirmDialog.jsx create mode 100644 src/app/molecules/confirm-dialog/ConfirmDialog.scss diff --git a/src/app/molecules/confirm-dialog/ConfirmDialog.jsx b/src/app/molecules/confirm-dialog/ConfirmDialog.jsx new file mode 100644 index 00000000..5771f2c1 --- /dev/null +++ b/src/app/molecules/confirm-dialog/ConfirmDialog.jsx @@ -0,0 +1,58 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './ConfirmDialog.scss'; + +import { openReusableDialog } from '../../../client/action/navigation'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; + +function ConfirmDialog({ + desc, actionTitle, actionType, onComplete, +}) { + return ( +
    + {desc} +
    + + +
    +
    + ); +} +ConfirmDialog.propTypes = { + desc: PropTypes.string.isRequired, + actionTitle: PropTypes.string.isRequired, + actionType: PropTypes.oneOf(['primary', 'positive', 'danger', 'caution']).isRequired, + onComplete: PropTypes.func.isRequired, +}; + +/** + * @param {string} title title of confirm dialog + * @param {string} desc description of confirm dialog + * @param {string} actionTitle title of main action to take + * @param {'primary' | 'positive' | 'danger' | 'caution'} actionType type of action. default=primary + * @return {Promise} does it get's confirmed or not + */ +// eslint-disable-next-line import/prefer-default-export +export const confirmDialog = (title, desc, actionTitle, actionType = 'primary') => new Promise((resolve) => { + let isCompleted = false; + openReusableDialog( + {title}, + (requestClose) => ( + { + isCompleted = true; + resolve(isConfirmed); + requestClose(); + }} + /> + ), + () => { + if (!isCompleted) resolve(false); + }, + ); +}); diff --git a/src/app/molecules/confirm-dialog/ConfirmDialog.scss b/src/app/molecules/confirm-dialog/ConfirmDialog.scss new file mode 100644 index 00000000..05f88be1 --- /dev/null +++ b/src/app/molecules/confirm-dialog/ConfirmDialog.scss @@ -0,0 +1,11 @@ +.confirm-dialog { + padding: var(--sp-normal); + + & > .text { + padding-bottom: var(--sp-normal); + } + &__btn { + display: flex; + gap: var(--sp-normal); + } +} \ No newline at end of file diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 70ca87e3..be4dea55 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -36,6 +36,8 @@ import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; import CmdIC from '../../../../public/res/ic/outlined/cmd.svg'; import BinIC from '../../../../public/res/ic/outlined/bin.svg'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; + function PlaceholderMessage() { return (
    @@ -546,10 +548,15 @@ const MessageOptions = React.memo(({ { - if (window.confirm('Are you sure that you want to delete this event?')) { - redactEvent(roomId, mEvent.getId()); - } + onClick={async () => { + const isConfirmed = await confirmDialog( + 'Delete message', + 'Are you sure that you want to delete this message?', + 'Delete', + 'danger', + ); + if (!isConfirmed) return; + redactEvent(roomId, mEvent.getId()); }} > Delete diff --git a/src/app/molecules/room-encryption/RoomEncryption.jsx b/src/app/molecules/room-encryption/RoomEncryption.jsx index b9ba706b..1657f363 100644 --- a/src/app/molecules/room-encryption/RoomEncryption.jsx +++ b/src/app/molecules/room-encryption/RoomEncryption.jsx @@ -8,6 +8,8 @@ import Text from '../../atoms/text/Text'; import Toggle from '../../atoms/button/Toggle'; import SettingTile from '../setting-tile/SettingTile'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; + function RoomEncryption({ roomId }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); @@ -15,17 +17,20 @@ function RoomEncryption({ roomId }) { const [isEncrypted, setIsEncrypted] = useState(encryptionEvents.length > 0); const canEnableEncryption = room.currentState.maySendStateEvent('m.room.encryption', mx.getUserId()); - const handleEncryptionEnable = () => { + const handleEncryptionEnable = async () => { const joinRule = room.getJoinRule(); const confirmMsg1 = 'It is not recommended to add encryption in public room. Anyone can find and join public rooms, so anyone can read messages in them.'; const confirmMsg2 = 'Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly'; - if (joinRule === 'public' ? confirm(confirmMsg1) : true) { - if (confirm(confirmMsg2)) { - setIsEncrypted(true); - mx.sendStateEvent(roomId, 'm.room.encryption', { - algorithm: 'm.megolm.v1.aes-sha2', - }); - } + + const isConfirmed1 = (joinRule === 'public') + ? await confirmDialog('Enable encryption', confirmMsg1, 'Continue', 'caution') + : true; + if (!isConfirmed1) return; + if (await confirmDialog('Enable encryption', confirmMsg2, 'Enable', 'caution')) { + setIsEncrypted(true); + mx.sendStateEvent(roomId, 'm.room.encryption', { + algorithm: 'm.megolm.v1.aes-sha2', + }); } }; diff --git a/src/app/molecules/room-options/RoomOptions.jsx b/src/app/molecules/room-options/RoomOptions.jsx index ef824785..af18d712 100644 --- a/src/app/molecules/room-options/RoomOptions.jsx +++ b/src/app/molecules/room-options/RoomOptions.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; -import { openInviteUser, openNavigation } from '../../../client/action/navigation'; +import { openInviteUser } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import { markAsRead } from '../../../client/action/notifications'; @@ -15,6 +15,8 @@ import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; + function RoomOptions({ roomId, afterOptionSelect }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); @@ -29,12 +31,16 @@ function RoomOptions({ roomId, afterOptionSelect }) { openInviteUser(roomId); afterOptionSelect(); }; - const handleLeaveClick = () => { - if (confirm('Are you sure that you want to leave this room?')) { - roomActions.leave(roomId); - afterOptionSelect(); - openNavigation(); - } + const handleLeaveClick = async () => { + afterOptionSelect(); + const isConfirmed = await confirmDialog( + 'Leave room', + `Are you sure that you want to leave "${room.name}" room?`, + 'Leave', + 'danger', + ); + if (!isConfirmed) return; + roomActions.leave(roomId); }; return ( diff --git a/src/app/molecules/room-profile/RoomProfile.jsx b/src/app/molecules/room-profile/RoomProfile.jsx index 4043cbf8..96e84076 100644 --- a/src/app/molecules/room-profile/RoomProfile.jsx +++ b/src/app/molecules/room-profile/RoomProfile.jsx @@ -19,6 +19,7 @@ import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; import { useStore } from '../../hooks/useStore'; import { useForceUpdate } from '../../hooks/useForceUpdate'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; function RoomProfile({ roomId }) { const isMountStore = useStore(); @@ -117,7 +118,13 @@ function RoomProfile({ roomId }) { const handleAvatarUpload = async (url) => { if (url === null) { - if (confirm('Are you sure that you want to remove room avatar?')) { + const isConfirmed = await confirmDialog( + 'Remove avatar', + 'Are you sure that you want to remove room avatar?', + 'Remove', + 'caution', + ); + if (isConfirmed) { await mx.sendStateEvent(roomId, 'm.room.avatar', { url }, ''); } } else await mx.sendStateEvent(roomId, 'm.room.avatar', { url }, ''); diff --git a/src/app/molecules/space-options/SpaceOptions.jsx b/src/app/molecules/space-options/SpaceOptions.jsx index e9b72cb6..e6b78d4c 100644 --- a/src/app/molecules/space-options/SpaceOptions.jsx +++ b/src/app/molecules/space-options/SpaceOptions.jsx @@ -24,6 +24,8 @@ import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; import PinIC from '../../../../public/res/ic/outlined/pin.svg'; import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; + function SpaceOptions({ roomId, afterOptionSelect }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); @@ -54,11 +56,16 @@ function SpaceOptions({ roomId, afterOptionSelect }) { afterOptionSelect(); }; - const handleLeaveClick = () => { - if (confirm('Are you sure that you want to leave this space?')) { - leave(roomId); - afterOptionSelect(); - } + const handleLeaveClick = async () => { + afterOptionSelect(); + const isConfirmed = await confirmDialog( + 'Leave space', + `Are you sure that you want to leave "${room.name}" space?`, + 'Leave', + 'danger', + ); + if (!isConfirmed) return; + leave(roomId); }; return ( diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index 677985f4..972192ef 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -12,6 +12,7 @@ import ImageUpload from '../../molecules/image-upload/ImageUpload'; import Input from '../../atoms/input/Input'; import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import './ProfileEditor.scss'; @@ -38,9 +39,15 @@ function ProfileEditor({ userId }) { }; }, [userId]); - const handleAvatarUpload = (url) => { + const handleAvatarUpload = async (url) => { if (url === null) { - if (confirm('Are you sure that you want to remove avatar?')) { + const isConfirmed = await confirmDialog( + 'Remove avatar', + 'Are you sure that you want to remove avatar?', + 'Remove', + 'caution', + ); + if (isConfirmed) { mx.setAvatarUrl(''); setAvatarSrc(null); } diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index 343d813c..d74629f2 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -32,6 +32,7 @@ import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.s import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; function ModerationTools({ roomId, userId, @@ -362,7 +363,7 @@ function ProfileViewer() { && (powerLevel < myPowerLevel || userId === mx.getUserId()) ); - const handleChangePowerLevel = (newPowerLevel) => { + const handleChangePowerLevel = async (newPowerLevel) => { if (newPowerLevel === powerLevel) return; const SHARED_POWER_MSG = 'You will not be able to undo this change as you are promoting the user to have the same power level as yourself. Are you sure?'; const DEMOTING_MYSELF_MSG = 'You will not be able to undo this change as you are demoting yourself. Are you sure?'; @@ -370,9 +371,14 @@ function ProfileViewer() { const isSharedPower = newPowerLevel === myPowerLevel; const isDemotingMyself = userId === mx.getUserId(); if (isSharedPower || isDemotingMyself) { - if (confirm(isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG)) { - roomActions.setPowerLevel(roomId, userId, newPowerLevel); - } + const isConfirmed = await confirmDialog( + 'Change power level', + isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG, + 'Change', + 'caution', + ); + if (!isConfirmed) return; + roomActions.setPowerLevel(roomId, userId, newPowerLevel); } else { roomActions.setPowerLevel(roomId, userId, newPowerLevel); } diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 8d14c18d..50c5e512 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -36,6 +36,7 @@ import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; import ChevronTopIC from '../../../../public/res/ic/outlined/chevron-top.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; const tabText = { GENERAL: 'General', @@ -85,10 +86,15 @@ function GeneralSettings({ roomId }) { { - if (confirm('Are you sure that you want to leave this room?')) { - roomActions.leave(roomId); - } + onClick={async () => { + const isConfirmed = await confirmDialog( + 'Leave room', + `Are you sure that you want to leave "${room.name}" room?`, + 'Leave', + 'danger', + ); + if (!isConfirmed) return; + roomActions.leave(roomId); }} iconSrc={LeaveArrowIC} > diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index d7efd362..b6ce307b 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -4,10 +4,12 @@ import dateFormat from 'dateformat'; import initMatrix from '../../../client/initMatrix'; import { isCrossVerified } from '../../../util/matrixUtil'; +import { openReusableDialog } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; import IconButton from '../../atoms/button/IconButton'; +import Input from '../../atoms/input/Input'; import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; import InfoCard from '../../atoms/card/InfoCard'; import Spinner from '../../atoms/spinner/Spinner'; @@ -18,11 +20,46 @@ import BinIC from '../../../../public/res/ic/outlined/bin.svg'; import InfoIC from '../../../../public/res/ic/outlined/info.svg'; import { authRequest } from './AuthRequest'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useStore } from '../../hooks/useStore'; import { useDeviceList } from '../../hooks/useDeviceList'; import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; +const promptDeviceName = async (deviceName) => new Promise((resolve) => { + let isCompleted = false; + + const renderContent = (onComplete) => { + const handleSubmit = (e) => { + e.preventDefault(); + const name = e.target.session.value; + if (typeof name !== 'string') onComplete(null); + onComplete(name); + }; + return ( +
    + +
    + + +
    +
    + ); + }; + + openReusableDialog( + Edit session name, + (requestClose) => renderContent((name) => { + isCompleted = true; + resolve(name); + requestClose(); + }), + () => { + if (!isCompleted) resolve(null); + }, + ); +}); + function DeviceManage() { const TRUNCATED_COUNT = 4; const mx = initMatrix.matrixClient; @@ -59,7 +96,7 @@ function DeviceManage() { } const handleRename = async (device) => { - const newName = window.prompt('Edit session name', device.display_name); + const newName = await promptDeviceName(device.display_name); if (newName === null || newName.trim() === '') return; if (newName.trim() === device.display_name) return; addToProcessing(device); @@ -74,15 +111,20 @@ function DeviceManage() { }; const handleRemove = async (device) => { - if (window.confirm(`You are about to logout "${device.display_name}" session.`)) { - addToProcessing(device); - await authRequest(`Logout "${device.display_name}"`, async (auth) => { - await mx.deleteDevice(device.device_id, auth); - }); + const isConfirmed = await confirmDialog( + `Logout ${device.display_name}`, + `You are about to logout "${device.display_name}" session.`, + 'Logout', + 'danger', + ); + if (!isConfirmed) return; + addToProcessing(device); + await authRequest(`Logout "${device.display_name}"`, async (auth) => { + await mx.deleteDevice(device.device_id, auth); + }); - if (!mountStore.getItem()) return; - removeFromProcessing(device); - } + if (!mountStore.getItem()) return; + removeFromProcessing(device); }; const renderDevice = (device, isVerified) => { diff --git a/src/app/organisms/settings/DeviceManage.scss b/src/app/organisms/settings/DeviceManage.scss index 0daf2e61..0a8fc4a9 100644 --- a/src/app/organisms/settings/DeviceManage.scss +++ b/src/app/organisms/settings/DeviceManage.scss @@ -15,4 +15,15 @@ & .setting-tile:last-of-type { border-bottom: none; } + + &__rename { + padding: var(--sp-normal); + & > *:not(:last-child) { + margin-bottom: var(--sp-normal); + } + &-btn { + display: flex; + gap: var(--sp-normal); + } + } } \ No newline at end of file diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 6dbbffb2..82b948ad 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -38,6 +38,7 @@ import PowerIC from '../../../../public/res/ic/outlined/power.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import CinnySVG from '../../../../public/res/svg/cinny.svg'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; function AppearanceSection() { const [, updateState] = useState({}); @@ -297,8 +298,10 @@ function Settings() { const [isOpen, requestClose] = useWindowToggle(setSelectedTab); const handleTabChange = (tabItem) => setSelectedTab(tabItem); - const handleLogout = () => { - if (confirm('Confirm logout')) logout(); + const handleLogout = async () => { + if (await confirmDialog('Logout', 'Are you sure that you want to logout your session?', 'Logout', 'danger')) { + logout(); + } }; return ( diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index 18e21cf3..43735993 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -36,6 +36,7 @@ import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; import CategoryIC from '../../../../public/res/ic/outlined/category.svg'; import CategoryFilledIC from '../../../../public/res/ic/filled/category.svg'; +import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useForceUpdate } from '../../hooks/useForceUpdate'; const tabText = { @@ -61,6 +62,7 @@ const tabItems = [{ function GeneralSettings({ roomId }) { const isPinned = initMatrix.accountData.spaceShortcut.has(roomId); const isCategorized = initMatrix.accountData.categorizedSpaces.has(roomId); + const roomName = initMatrix.matrixClient.getRoom(roomId)?.name; const [, forceUpdate] = useForceUpdate(); return ( @@ -89,10 +91,14 @@ function GeneralSettings({ roomId }) {
    { - if (confirm('Are you sure that you want to leave this space?')) { - leave(roomId); - } + onClick={async () => { + const isConfirmed = await confirmDialog( + 'Leave space', + `Are you sure that you want to leave "${roomName}" space?`, + 'Leave', + 'danger', + ); + if (isConfirmed) leave(roomId); }} iconSrc={LeaveArrowIC} > From bafe1c578147f1cd419c886edaee353cf2714941 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:17:05 +0530 Subject: [PATCH 071/824] Bump katex from 0.15.2 to 0.15.3 (#501) Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.15.2 to 0.15.3. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.15.2...v0.15.3) --- updated-dependencies: - dependency-name: katex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 33 ++++++++++++++------------------- package.json | 2 +- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14063ed5..bb380b20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.11", - "katex": "^0.15.2", + "katex": "^0.15.3", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", @@ -2952,8 +2952,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2969,9 +2967,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -8370,9 +8366,9 @@ } }, "node_modules/katex": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.2.tgz", - "integrity": "sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.3.tgz", + "integrity": "sha512-Al6V7RJsmjklT9QItyHWGaQCt+NYTle1bZwB1e9MR/tLoIT1MXaHy9UpfGSB7eaqDgjjqqRxQOaQGrALCrEyBQ==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -16171,14 +16167,15 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": {}, + "requires": { + "ajv": "^8.0.0" + }, "dependencies": { "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16190,9 +16187,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true + "dev": true } } }, @@ -20370,9 +20365,9 @@ } }, "katex": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.2.tgz", - "integrity": "sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.3.tgz", + "integrity": "sha512-Al6V7RJsmjklT9QItyHWGaQCt+NYTle1bZwB1e9MR/tLoIT1MXaHy9UpfGSB7eaqDgjjqqRxQOaQGrALCrEyBQ==", "requires": { "commander": "^8.0.0" } diff --git a/package.json b/package.json index f790a3e2..cee4ff5a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.11", - "katex": "^0.15.2", + "katex": "^0.15.3", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", "micromark": "^3.0.10", From 5b7880f817e4dbc07c04842aa2651581baea18d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:19:12 +0530 Subject: [PATCH 072/824] Bump eslint from 8.13.0 to 8.14.0 (#504) Bumps [eslint](https://github.com/eslint/eslint) from 8.13.0 to 8.14.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.13.0...v8.14.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 42 +++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb380b20..3f0670bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.13.0", + "eslint": "^8.14.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -1771,9 +1771,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1791,9 +1791,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5593,12 +5593,12 @@ } }, "node_modules/eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.1", + "@eslint/eslintrc": "^1.2.2", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -15180,9 +15180,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -15197,9 +15197,9 @@ }, "dependencies": { "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -18268,12 +18268,12 @@ "dev": true }, "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.1", + "@eslint/eslintrc": "^1.2.2", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", diff --git a/package.json b/package.json index cee4ff5a..7416d431 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.13.0", + "eslint": "^8.14.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From 5dd2194eba3f546d0ddd705fa6d399c4dcdc8f4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:20:12 +0530 Subject: [PATCH 073/824] Bump babel-loader from 8.2.4 to 8.2.5 (#505) Bumps [babel-loader](https://github.com/babel/babel-loader) from 8.2.4 to 8.2.5. - [Release notes](https://github.com/babel/babel-loader/releases) - [Changelog](https://github.com/babel/babel-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel-loader/compare/v8.2.4...v8.2.5) --- updated-dependencies: - dependency-name: babel-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f0670bc..5670ea5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", - "babel-loader": "^8.2.4", + "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", @@ -3303,9 +3303,9 @@ "dev": true }, "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", @@ -16467,9 +16467,9 @@ "dev": true }, "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", diff --git a/package.json b/package.json index 7416d431..358f5eb9 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", - "babel-loader": "^8.2.4", + "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", From 3b14543e66b1d59178d91327cb26ecadda1daec8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:20:49 +0530 Subject: [PATCH 074/824] Bump sass from 1.50.0 to 1.50.1 (#506) Bumps [sass](https://github.com/sass/dart-sass) from 1.50.0 to 1.50.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.50.0...1.50.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5670ea5c..005d661f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.50.0", + "sass": "^1.50.1", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11931,9 +11931,9 @@ } }, "node_modules/sass": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz", - "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==", + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", + "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -22997,9 +22997,9 @@ } }, "sass": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz", - "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==", + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", + "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 358f5eb9..5b121763 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.50.0", + "sass": "^1.50.1", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 581963cfb411c606fe9f600974867bfcf61036ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:22:35 +0530 Subject: [PATCH 075/824] Bump html-react-parser from 1.4.11 to 1.4.12 (#507) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 1.4.11 to 1.4.12. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v1.4.11...v1.4.12) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 005d661f..96dafa40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.11", + "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", @@ -7290,9 +7290,9 @@ } }, "node_modules/html-react-parser": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.11.tgz", - "integrity": "sha512-NDSz8MS89I286N7FzNScBtCRBs6MU7w72k+jWk4dBqcTgTrCQHHrIUlryJB9U5MJuKhq5/CFGz0JPPYS6OnjZw==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.12.tgz", + "integrity": "sha512-nqYQzr4uXh67G9ejAG7djupTHmQvSTgjY83zbXLRfKHJ0F06751jXx6WKSFARDdXxCngo2/7H4Rwtfeowql4gQ==", "dependencies": { "domhandler": "4.3.1", "html-dom-parser": "1.2.0", @@ -19601,9 +19601,9 @@ } }, "html-react-parser": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.11.tgz", - "integrity": "sha512-NDSz8MS89I286N7FzNScBtCRBs6MU7w72k+jWk4dBqcTgTrCQHHrIUlryJB9U5MJuKhq5/CFGz0JPPYS6OnjZw==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.12.tgz", + "integrity": "sha512-nqYQzr4uXh67G9ejAG7djupTHmQvSTgjY83zbXLRfKHJ0F06751jXx6WKSFARDdXxCngo2/7H4Rwtfeowql4gQ==", "requires": { "domhandler": "4.3.1", "html-dom-parser": "1.2.0", diff --git a/package.json b/package.json index 5b121763..702106bf 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.11", + "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.0.0", From 416fd02069b59d0261115bed2c3737cef7cef416 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:23:22 +0530 Subject: [PATCH 076/824] Bump actions/checkout from 3.0.1 to 3.0.2 (#508) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index b2bf558d..1c1ddfa0 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -11,7 +11,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.0.1 + uses: actions/checkout@v3.0.2 - name: Build app run: npm ci && npm run build - name: Upload artifact diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index b5f011f3..87df19dc 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.0.1 + uses: actions/checkout@v3.0.2 - name: Build Docker image uses: docker/build-push-action@v2.10.0 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 1445e815..59666cc7 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.0.1 + uses: actions/checkout@v3.0.2 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@v1.7.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index eee20115..75b09908 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.1 + uses: actions/checkout@v3.0.2 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@v1.7.2 with: @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.1 + uses: actions/checkout@v3.0.2 - name: Login to Docker Hub uses: docker/login-action@v1.14.1 with: From 2867bb3bc3253957ab3e5613cf0b2b2791cb84e4 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 1 May 2022 13:22:55 +0530 Subject: [PATCH 077/824] Session verification by emojis (#513) * Add option to verify with security key/phrase * Manually merge #311 by @ginnyTheCat --- .../emoji-verification/EmojiVerification.jsx | 153 ++++++++++++++++++ .../emoji-verification/EmojiVerification.scss | 35 ++++ src/app/organisms/pw/Dialogs.jsx | 2 + src/app/organisms/settings/DeviceManage.jsx | 57 +++++-- src/app/organisms/settings/DeviceManage.scss | 17 ++ src/client/action/navigation.js | 7 + src/client/initMatrix.js | 3 + src/client/state/cons.js | 2 + src/client/state/navigation.js | 6 + 9 files changed, 270 insertions(+), 12 deletions(-) create mode 100644 src/app/organisms/emoji-verification/EmojiVerification.jsx create mode 100644 src/app/organisms/emoji-verification/EmojiVerification.scss diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx new file mode 100644 index 00000000..f56a4672 --- /dev/null +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -0,0 +1,153 @@ +/* eslint-disable react/prop-types */ +import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import './EmojiVerification.scss'; +import { twemojify } from '../../../util/twemojify'; + +import initMatrix from '../../../client/initMatrix'; +import cons from '../../../client/state/cons'; +import navigation from '../../../client/state/navigation'; + +import Text from '../../atoms/text/Text'; +import IconButton from '../../atoms/button/IconButton'; +import Button from '../../atoms/button/Button'; +import Spinner from '../../atoms/spinner/Spinner'; +import Dialog from '../../molecules/dialog/Dialog'; + +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; +import { useStore } from '../../hooks/useStore'; + +function EmojiVerificationContent({ request, requestClose }) { + const [sas, setSas] = useState(null); + const [process, setProcess] = useState(false); + const mountStore = useStore(); + mountStore.setItem(true); + + const handleChange = () => { + if (request.done || request.cancelled) requestClose(); + }; + + useEffect(() => { + mountStore.setItem(true); + if (request === null) return null; + const req = request; + req.on('change', handleChange); + return () => req.off('change', handleChange); + }, [request]); + + const acceptRequest = async () => { + setProcess(true); + await request.accept(); + + const verifier = request.beginKeyVerification('m.sas.v1'); + verifier.on('show_sas', (data) => { + if (!mountStore.getItem()) return; + setSas(data); + setProcess(false); + }); + await verifier.verify(); + }; + + const sasMismatch = () => { + sas.mismatch(); + setProcess(true); + }; + + const sasConfirm = () => { + sas.confirm(); + setProcess(true); + }; + + const renderWait = () => ( + <> + + Waiting for response from other device... + + ); + + if (sas !== null) { + return ( +
    + Confirm the emoji below are displayed on both devices, in the same order: +
    + {sas.sas.emoji.map((emoji) => ( +
    + {twemojify(emoji[0])} + {emoji[1]} +
    + ))} +
    +
    + {process ? renderWait() : ( + <> + + + + )} +
    +
    + ); + } + + return ( +
    + Click accept to start the verification process +
    + { + process + ? renderWait() + : + } +
    +
    + ); +} +EmojiVerificationContent.propTypes = { + request: PropTypes.shape({}).isRequired, + requestClose: PropTypes.func.isRequired, +}; + +function useVisibilityToggle() { + const [request, setRequest] = useState(null); + const mx = initMatrix.matrixClient; + + useEffect(() => { + const handleOpen = (req) => setRequest(req); + navigation.on(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); + mx.on('crypto.verification.request', handleOpen); + return () => { + navigation.removeListener(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); + mx.removeListener('crypto.verification.request', handleOpen); + }; + }, []); + + const requestClose = () => setRequest(null); + + return [request, requestClose]; +} + +function EmojiVerification() { + const [request, requestClose] = useVisibilityToggle(); + + return ( + + Emoji verification + + )} + contentOptions={} + onRequestClose={requestClose} + > + { + request !== null + ? + :
    + } +
    + ); +} + +export default EmojiVerification; diff --git a/src/app/organisms/emoji-verification/EmojiVerification.scss b/src/app/organisms/emoji-verification/EmojiVerification.scss new file mode 100644 index 00000000..4e6dc112 --- /dev/null +++ b/src/app/organisms/emoji-verification/EmojiVerification.scss @@ -0,0 +1,35 @@ +@use '../../partials/flex'; +@use '../../partials/dir'; + +.emoji-verification { + &__content { + padding: var(--sp-normal); + @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); + display: flex; + flex-direction: column; + gap: var(--sp-normal); + } + + &__emojis { + margin: var(--sp-loose) 0; + display: flex; + align-items: center; + justify-content: space-around; + gap: var(--sp-extra-tight); + flex-wrap: wrap; + } + + &__emoji-block { + @extend .cp-fx__column; + flex: 1; + align-items: center; + gap: var(--sp-extra-tight); + white-space: nowrap; + text-transform: capitalize; + } + + &__buttons { + display: flex; + gap: var(--sp-normal); + } +} diff --git a/src/app/organisms/pw/Dialogs.jsx b/src/app/organisms/pw/Dialogs.jsx index f29a8192..28cb47ad 100644 --- a/src/app/organisms/pw/Dialogs.jsx +++ b/src/app/organisms/pw/Dialogs.jsx @@ -7,6 +7,7 @@ import SpaceAddExisting from '../../molecules/space-add-existing/SpaceAddExistin import Search from '../search/Search'; import ViewSource from '../view-source/ViewSource'; import CreateRoom from '../create-room/CreateRoom'; +import EmojiVerification from '../emoji-verification/EmojiVerification'; import ReusableDialog from '../../molecules/dialog/ReusableDialog'; @@ -20,6 +21,7 @@ function Dialogs() { + diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index b6ce307b..a7409aa2 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -4,7 +4,7 @@ import dateFormat from 'dateformat'; import initMatrix from '../../../client/initMatrix'; import { isCrossVerified } from '../../../util/matrixUtil'; -import { openReusableDialog } from '../../../client/action/navigation'; +import { openReusableDialog, openEmojiVerification } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -25,6 +25,7 @@ import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useStore } from '../../hooks/useStore'; import { useDeviceList } from '../../hooks/useDeviceList'; import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; +import { accessSecretStorage } from './SecretStorageAccess'; const promptDeviceName = async (deviceName) => new Promise((resolve) => { let isCompleted = false; @@ -69,6 +70,7 @@ function DeviceManage() { const [truncated, setTruncated] = useState(true); const mountStore = useStore(); mountStore.setItem(true); + const isMeVerified = isCrossVerified(mx.deviceId); useEffect(() => { setProcessing([]); @@ -127,18 +129,41 @@ function DeviceManage() { removeFromProcessing(device); }; + const verifyWithKey = async (device) => { + const keyData = await accessSecretStorage('Session verification'); + if (!keyData) return; + addToProcessing(device); + await mx.checkOwnCrossSigningTrust(); + }; + + const verifyWithEmojis = async (deviceId) => { + const req = await mx.requestVerification(mx.getUserId(), [deviceId]); + openEmojiVerification(req); + }; + + const verify = (deviceId, isCurrentDevice) => { + if (isCurrentDevice) { + verifyWithKey(deviceId); + return; + } + verifyWithEmojis(deviceId); + }; + const renderDevice = (device, isVerified) => { const deviceId = device.device_id; const displayName = device.display_name; const lastIP = device.last_seen_ip; const lastTS = device.last_seen_ts; + const isCurrentDevice = mx.deviceId === deviceId; + return ( + {displayName} - {` — ${deviceId}${mx.deviceId === deviceId ? ' (current)' : ''}`} + {`${displayName ? ' — ' : ''}${deviceId}`} + {isCurrentDevice && Current} )} options={ @@ -146,19 +171,27 @@ function DeviceManage() { ? : ( <> + {((isMeVerified && isVerified === false) || (isCurrentDevice && isVerified === false)) && } handleRename(device)} src={PencilIC} tooltip="Rename" /> handleRemove(device)} src={BinIC} tooltip="Remove session" /> ) } content={( - - Last activity - - {dateFormat(new Date(lastTS), ' hh:MM TT, dd/mm/yyyy')} - - {lastIP ? ` at ${lastIP}` : ''} - + <> + + Last activity + + {dateFormat(new Date(lastTS), ' hh:MM TT, dd/mm/yyyy')} + + {lastIP ? ` at ${lastIP}` : ''} + + {isCurrentDevice && ( + + {`Session Key: ${initMatrix.matrixClient.getDeviceEd25519Key().match(/.{1,4}/g).join(' ')}`} + + )} + )} /> ); @@ -200,7 +233,7 @@ function DeviceManage() { {noEncryption.length > 0 && (
    Sessions without encryption support - {noEncryption.map((device) => renderDevice(device, true))} + {noEncryption.map((device) => renderDevice(device, null))}
    )}
    @@ -211,7 +244,7 @@ function DeviceManage() { if (truncated && index >= TRUNCATED_COUNT) return null; return renderDevice(device, true); }) - : No verified session + : No verified sessions } { verified.length > TRUNCATED_COUNT && ( + : }
    ); } EmojiVerificationContent.propTypes = { - request: PropTypes.shape({}).isRequired, + data: PropTypes.shape({}).isRequired, requestClose: PropTypes.func.isRequired, }; function useVisibilityToggle() { - const [request, setRequest] = useState(null); + const [data, setData] = useState(null); const mx = initMatrix.matrixClient; useEffect(() => { - const handleOpen = (req) => setRequest(req); + const handleOpen = (request, targetDevice) => { + setData({ request, targetDevice }); + }; navigation.on(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); mx.on('crypto.verification.request', handleOpen); return () => { @@ -150,17 +157,17 @@ function useVisibilityToggle() { }; }, []); - const requestClose = () => setRequest(null); + const requestClose = () => setData(null); - return [request, requestClose]; + return [data, requestClose]; } function EmojiVerification() { - const [request, requestClose] = useVisibilityToggle(); + const [data, requestClose] = useVisibilityToggle(); return ( @@ -171,8 +178,8 @@ function EmojiVerification() { onRequestClose={requestClose} > { - request !== null - ? + data !== null + ? :
    }
    diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index a7409aa2..dad5b96d 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -138,7 +138,7 @@ function DeviceManage() { const verifyWithEmojis = async (deviceId) => { const req = await mx.requestVerification(mx.getUserId(), [deviceId]); - openEmojiVerification(req); + openEmojiVerification(req, { userId: mx.getUserId(), deviceId }); }; const verify = (deviceId, isCurrentDevice) => { diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index 9e859494..70f270b6 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -167,9 +167,10 @@ export function openReusableDialog(title, render, afterClose) { }); } -export function openEmojiVerification(request) { +export function openEmojiVerification(request, targetDevice) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_EMOJI_VERIFICATION, request, + targetDevice, }); } diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 42ab0199..7e7ab695 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -189,6 +189,7 @@ class Navigation extends EventEmitter { this.emit( cons.events.navigation.EMOJI_VERIFICATION_OPENED, action.request, + action.targetDevice, ); }, }; From 766b4c13c3933c0c2d8a319e57a097bba5c46fff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 12:54:22 +0530 Subject: [PATCH 086/824] Bump eslint-plugin-react-hooks from 4.4.0 to 4.5.0 (#516) Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 4.4.0 to 4.5.0. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks) --- updated-dependencies: - dependency-name: eslint-plugin-react-hooks dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96dafa40..9118de72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,7 +60,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.4.0", + "eslint-plugin-react-hooks": "^4.5.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", @@ -5834,9 +5834,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", "dev": true, "engines": { "node": ">=10" @@ -18564,9 +18564,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 702106bf..b81af7c0 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.4.0", + "eslint-plugin-react-hooks": "^4.5.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", From ef149b9fcfee9eecdcf0587ded87a8213b5c0b0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 12:56:42 +0530 Subject: [PATCH 087/824] Bump matrix-js-sdk from 17.0.0 to 17.1.0 (#517) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 17.0.0 to 17.1.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v17.0.0...v17.1.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9118de72..0823965c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.0.0", + "matrix-js-sdk": "^17.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", @@ -8850,9 +8850,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz", - "integrity": "sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.1.0.tgz", + "integrity": "sha512-1MZYo+B4FnZMII1/Mw0E7WX4erCxnPpeA8fankY5Ql82LQQVSnceOpX2XAsRlDHcxcdExB929KKqVrk/eqDM/A==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -20783,9 +20783,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz", - "integrity": "sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.1.0.tgz", + "integrity": "sha512-1MZYo+B4FnZMII1/Mw0E7WX4erCxnPpeA8fankY5Ql82LQQVSnceOpX2XAsRlDHcxcdExB929KKqVrk/eqDM/A==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index b81af7c0..b503e10d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.0.0", + "matrix-js-sdk": "^17.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", From 336e8921ee2dc549658f002290d07b5cd7bc33c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 12:58:25 +0530 Subject: [PATCH 088/824] Bump react-modal from 3.14.4 to 3.15.1 (#518) Bumps [react-modal](https://github.com/reactjs/react-modal) from 3.14.4 to 3.15.1. - [Release notes](https://github.com/reactjs/react-modal/releases) - [Changelog](https://github.com/reactjs/react-modal/blob/master/CHANGELOG.md) - [Commits](https://github.com/reactjs/react-modal/compare/v3.14.4...v3.15.1) --- updated-dependencies: - dependency-name: react-modal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0823965c..849ca406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", - "react-modal": "^3.14.4", + "react-modal": "^3.15.1", "sanitize-html": "^2.7.0", "tippy.js": "^6.3.7", "twemoji": "^14.0.2" @@ -11382,9 +11382,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-modal": { - "version": "3.14.4", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.14.4.tgz", - "integrity": "sha512-8surmulejafYCH9wfUmFyj4UfbSJwjcgbS9gf3oOItu4Hwd6ivJyVBETI0yHRhpJKCLZMUtnhzk76wXTsNL6Qg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.15.1.tgz", + "integrity": "sha512-duB9bxOaYg7Zt6TMFldIFxQRtSP+Dg3F1ZX3FXxSUn+3tZZ/9JCgeAQKDg7rhZSAqopq8TFRw3yIbnx77gyFTw==", "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -11395,8 +11395,8 @@ "node": ">=8" }, "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17" + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" } }, "node_modules/react-property": { @@ -22565,9 +22565,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-modal": { - "version": "3.14.4", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.14.4.tgz", - "integrity": "sha512-8surmulejafYCH9wfUmFyj4UfbSJwjcgbS9gf3oOItu4Hwd6ivJyVBETI0yHRhpJKCLZMUtnhzk76wXTsNL6Qg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.15.1.tgz", + "integrity": "sha512-duB9bxOaYg7Zt6TMFldIFxQRtSP+Dg3F1ZX3FXxSUn+3tZZ/9JCgeAQKDg7rhZSAqopq8TFRw3yIbnx77gyFTw==", "requires": { "exenv": "^1.2.0", "prop-types": "^15.7.2", diff --git a/package.json b/package.json index b503e10d..ec5f2778 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", - "react-modal": "^3.14.4", + "react-modal": "^3.15.1", "sanitize-html": "^2.7.0", "tippy.js": "^6.3.7", "twemoji": "^14.0.2" From 205fcf8487ece7dda2a7be3370c2c200973829f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 13:00:30 +0530 Subject: [PATCH 089/824] Bump @fontsource/inter from 4.5.7 to 4.5.10 (#519) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.7 to 4.5.10. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 849ca406..0bc3811f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.8.2", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.7", + "@fontsource/inter": "^4.5.10", "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", @@ -1806,9 +1806,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.7.tgz", - "integrity": "sha512-25k3thupaOEBexuU+jAkGqieKPbuhSuA+sinDwp1iBNhqQPiJ9QHDvsXgoCgCbZ4sGlE8aCwZmSlDJrPdJHNkw==" + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.10.tgz", + "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" }, "node_modules/@fontsource/roboto": { "version": "4.5.5", @@ -15208,9 +15208,9 @@ } }, "@fontsource/inter": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.7.tgz", - "integrity": "sha512-25k3thupaOEBexuU+jAkGqieKPbuhSuA+sinDwp1iBNhqQPiJ9QHDvsXgoCgCbZ4sGlE8aCwZmSlDJrPdJHNkw==" + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.10.tgz", + "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" }, "@fontsource/roboto": { "version": "4.5.5", diff --git a/package.json b/package.json index ec5f2778..c0c67caa 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.7", + "@fontsource/inter": "^4.5.10", "@fontsource/roboto": "^4.5.5", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", From 95228c6dd97f0aa18c67f01c23e499011dfba277 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 13:02:49 +0530 Subject: [PATCH 090/824] Bump @babel/preset-env from 7.16.11 to 7.17.10 (#520) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.11 to 7.17.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.17.10/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 366 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 190 insertions(+), 178 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0bc3811f..b3c09394 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@babel/core": "^7.17.9", - "@babel/preset-env": "^7.16.11", + "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -108,9 +108,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -186,14 +186,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", + "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -204,15 +204,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.0.tgz", - "integrity": "sha512-S3+IHG72pJFb0RmJgeXg/TjVKt641ZsLla028haXJjdqCf9eccE5r1JsdO//L7nzTDzXjtC+hwV/lrkEb2+t0Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" @@ -309,12 +309,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -577,12 +577,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", - "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -690,12 +690,12 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", - "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -1083,9 +1083,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", - "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" @@ -1224,14 +1224,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1242,13 +1242,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -1277,12 +1277,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", + "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -1418,12 +1418,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "dependencies": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" }, "engines": { "node": ">=6.9.0" @@ -1555,27 +1555,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", + "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", "@babel/plugin-proposal-async-generator-functions": "^7.16.8", "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", "@babel/plugin-proposal-dynamic-import": "^7.16.7", "@babel/plugin-proposal-export-namespace-from": "^7.16.7", "@babel/plugin-proposal-json-strings": "^7.16.7", "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", "@babel/plugin-proposal-private-methods": "^7.16.11", @@ -1601,7 +1601,7 @@ "@babel/plugin-transform-block-scoping": "^7.16.7", "@babel/plugin-transform-classes": "^7.16.7", "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.16.7", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", @@ -1610,15 +1610,15 @@ "@babel/plugin-transform-literals": "^7.16.7", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", "@babel/plugin-transform-new-target": "^7.16.7", "@babel/plugin-transform-object-super": "^7.16.7", "@babel/plugin-transform-parameters": "^7.16.7", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", "@babel/plugin-transform-reserved-words": "^7.16.7", "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.16.7", @@ -1628,11 +1628,11 @@ "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.10", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "engines": { @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", + "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -3719,15 +3719,25 @@ ] }, "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==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -3735,10 +3745,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bs58": { @@ -3869,14 +3875,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001306", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001306.tgz", - "integrity": "sha512-Wd1OuggRzg1rbnM5hv1wXs2VkxJH/AA+LuudlIqvZiCvivF+wJJe2mgBZC8gPMgI7D76PP5CTx8Luvaqc1V6OQ==", + "version": "1.0.30001335", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", + "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/caseless": { "version": "0.12.0", @@ -4502,12 +4514,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz", - "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==", + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", + "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "funding": { @@ -5373,9 +5385,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.63", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.63.tgz", - "integrity": "sha512-e0PX/LRJPFRU4kzJKLvTobxyFdnANCvcoDCe8XcyTqP58nTWIwdsHvXLIl1RkB39X5yaosLaroMASWB0oIsgCA==", + "version": "1.4.129", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", + "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==", "dev": true }, "node_modules/elliptic": { @@ -9802,9 +9814,9 @@ } }, "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", "dev": true }, "node_modules/normalize-path": { @@ -11483,9 +11495,9 @@ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -14024,9 +14036,9 @@ } }, "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", "dev": true }, "@babel/core": { @@ -14083,27 +14095,27 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", + "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "browserslist": "^4.20.2", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.0.tgz", - "integrity": "sha512-S3+IHG72pJFb0RmJgeXg/TjVKt641ZsLla028haXJjdqCf9eccE5r1JsdO//L7nzTDzXjtC+hwV/lrkEb2+t0Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" @@ -14173,12 +14185,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { @@ -14366,12 +14378,12 @@ } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", - "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } @@ -14437,12 +14449,12 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", - "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -14701,9 +14713,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", - "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" @@ -14788,25 +14800,25 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -14823,12 +14835,12 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", + "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.0" } }, "@babel/plugin-transform-new-target": { @@ -14910,12 +14922,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { @@ -14993,27 +15005,27 @@ } }, "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", + "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", "@babel/plugin-proposal-async-generator-functions": "^7.16.8", "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", "@babel/plugin-proposal-dynamic-import": "^7.16.7", "@babel/plugin-proposal-export-namespace-from": "^7.16.7", "@babel/plugin-proposal-json-strings": "^7.16.7", "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", "@babel/plugin-proposal-private-methods": "^7.16.11", @@ -15039,7 +15051,7 @@ "@babel/plugin-transform-block-scoping": "^7.16.7", "@babel/plugin-transform-classes": "^7.16.7", "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.16.7", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", @@ -15048,15 +15060,15 @@ "@babel/plugin-transform-literals": "^7.16.7", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", "@babel/plugin-transform-new-target": "^7.16.7", "@babel/plugin-transform-object-super": "^7.16.7", "@babel/plugin-transform-parameters": "^7.16.7", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", "@babel/plugin-transform-reserved-words": "^7.16.7", "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.16.7", @@ -15066,11 +15078,11 @@ "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.10", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" } }, @@ -15164,9 +15176,9 @@ } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", + "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -16820,15 +16832,15 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, @@ -16934,9 +16946,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001306", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001306.tgz", - "integrity": "sha512-Wd1OuggRzg1rbnM5hv1wXs2VkxJH/AA+LuudlIqvZiCvivF+wJJe2mgBZC8gPMgI7D76PP5CTx8Luvaqc1V6OQ==", + "version": "1.0.30001335", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", + "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", "dev": true }, "caseless": { @@ -17433,12 +17445,12 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz", - "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==", + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", + "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", "dev": true, "requires": { - "browserslist": "^4.19.1", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "dependencies": { @@ -18095,9 +18107,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.63", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.63.tgz", - "integrity": "sha512-e0PX/LRJPFRU4kzJKLvTobxyFdnANCvcoDCe8XcyTqP58nTWIwdsHvXLIl1RkB39X5yaosLaroMASWB0oIsgCA==", + "version": "1.4.129", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", + "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==", "dev": true }, "elliptic": { @@ -21412,9 +21424,9 @@ "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", "dev": true }, "normalize-path": { @@ -22644,9 +22656,9 @@ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" diff --git a/package.json b/package.json index c0c67caa..4306ab7d 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@babel/core": "^7.17.9", - "@babel/preset-env": "^7.16.11", + "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", "babel-loader": "^8.2.5", From 43762df99804b95cfd99f07d08a185dce153ca58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 13:07:51 +0530 Subject: [PATCH 091/824] Bump @babel/core from 7.17.9 to 7.17.10 (#521) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.9 to 7.17.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.17.10/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 147 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 86 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3c09394..472ef53e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.9", + "@babel/core": "^7.17.10", "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", @@ -117,21 +117,21 @@ } }, "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", + "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", + "@babel/parser": "^7.17.10", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -147,14 +147,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", + "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.17.10", + "@jridgewell/gen-mapping": "^0.1.0", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -500,9 +500,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", + "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1728,19 +1728,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", + "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", + "@babel/generator": "^7.17.10", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/parser": "^7.17.10", + "@babel/types": "^7.17.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2329,6 +2329,19 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", @@ -2338,6 +2351,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -12363,15 +12385,6 @@ "websocket-driver": "^0.7.4" } }, - "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/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -14042,21 +14055,21 @@ "dev": true }, "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", + "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", + "@babel/parser": "^7.17.10", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14065,14 +14078,14 @@ } }, "@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", + "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", "dev": true, "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.17.10", + "@jridgewell/gen-mapping": "^0.1.0", + "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { @@ -14331,9 +14344,9 @@ } }, "@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", + "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15158,19 +15171,19 @@ } }, "@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", + "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", + "@babel/generator": "^7.17.10", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/parser": "^7.17.10", + "@babel/types": "^7.17.10", "debug": "^4.1.0", "globals": "^11.1.0" } @@ -15627,12 +15640,28 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", "dev": true }, + "@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "dev": true + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -23338,12 +23367,6 @@ "websocket-driver": "^0.7.4" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", diff --git a/package.json b/package.json index 4306ab7d..56b834cf 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.9", + "@babel/core": "^7.17.10", "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.16.7", "assert": "^2.0.0", From 5cdad44abf69742ddf4805ddfb5051ba4fb64497 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Tue, 3 May 2022 13:18:27 +0530 Subject: [PATCH 092/824] Load sound file on startup (#444) --- public/index.html | 6 ++++++ src/client/state/Notifications.js | 7 ++----- src/index.scss | 4 ++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/public/index.html b/public/index.html index a4a31196..aa6a95ec 100644 --- a/public/index.html +++ b/public/index.html @@ -18,5 +18,11 @@
    + + \ No newline at end of file diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 512b3e76..f0f7a8c2 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -6,9 +6,6 @@ import cons from './cons'; import navigation from './navigation'; import settings from './settings'; -import NotificationSound from '../../../public/sound/notification.ogg'; -import InviteSound from '../../../public/sound/invite.ogg'; - function isNotifEvent(mEvent) { const eType = mEvent.getType(); if (!cons.supportEventTypes.includes(eType)) return false; @@ -238,14 +235,14 @@ class Notifications extends EventEmitter { _playNotiSound() { if (!this._notiAudio) { - this._notiAudio = new Audio(NotificationSound); + this._notiAudio = document.getElementById('notificationSound'); } this._notiAudio.play(); } _playInviteSound() { if (!this._inviteAudio) { - this._inviteAudio = new Audio(InviteSound); + this._inviteAudio = document.getElementById('inviteSound'); } this._inviteAudio.play(); } diff --git a/src/index.scss b/src/index.scss index b8035346..3a4707ca 100644 --- a/src/index.scss +++ b/src/index.scss @@ -475,6 +475,10 @@ textarea { supported by Chrome, Edge, Opera and Firefox */ } +audio:not([controls]) { + display: none !important; +} + .flex--center { display: flex; justify-content: center; From 3afc068a02e1ea5aac276d1bc2934d26f07ab599 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Tue, 3 May 2022 14:05:56 +0530 Subject: [PATCH 093/824] Fixes #430, #434, #455 --- src/app/molecules/room-intro/RoomIntro.jsx | 11 ++-- src/app/organisms/room/RoomViewContent.jsx | 64 +++++++++++++++++----- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/app/molecules/room-intro/RoomIntro.jsx b/src/app/molecules/room-intro/RoomIntro.jsx index 2c6f944f..2ec46cb1 100644 --- a/src/app/molecules/room-intro/RoomIntro.jsx +++ b/src/app/molecules/room-intro/RoomIntro.jsx @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import './RoomIntro.scss'; -import { twemojify } from '../../../util/twemojify'; import colorMXID from '../../../util/colorMXID'; import Text from '../../atoms/text/Text'; @@ -15,8 +14,8 @@ function RoomIntro({
    - {twemojify(heading)} - {twemojify(desc, undefined, true)} + {heading} + {desc} { time !== null && {time}}
    @@ -35,9 +34,9 @@ RoomIntro.propTypes = { PropTypes.bool, ]), name: PropTypes.string.isRequired, - heading: PropTypes.string.isRequired, - desc: PropTypes.string.isRequired, - time: PropTypes.string, + heading: PropTypes.node.isRequired, + desc: PropTypes.node.isRequired, + time: PropTypes.node, }; export default RoomIntro; diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index 96839b24..ab1dfbab 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -8,6 +8,7 @@ import PropTypes from 'prop-types'; import './RoomViewContent.scss'; import dateFormat from 'dateformat'; +import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; @@ -50,21 +51,54 @@ function loadingMsgPlaceholders(key, count = 2) { ); } -function genRoomIntro(mEvent, roomTimeline) { +function RoomIntroContainer({ event, timeline }) { + const [, nameForceUpdate] = useForceUpdate(); const mx = initMatrix.matrixClient; - const roomTopic = roomTimeline.room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic; - const isDM = initMatrix.roomList.directs.has(roomTimeline.roomId); - let avatarSrc = roomTimeline.room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop'); - avatarSrc = isDM ? roomTimeline.room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc; + const { roomList } = initMatrix; + const { room } = timeline; + const roomTopic = room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic; + const isDM = roomList.directs.has(timeline.roomId); + let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop'); + avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc; + + const heading = isDM ? room.name : `Welcome to ${room.name}`; + const topic = twemojify(roomTopic || '', undefined, true); + const nameJsx = twemojify(room.name); + const desc = isDM + ? ( + <> + This is the beginning of your direct message history with @ + {nameJsx} + {'. '} + {topic} + + ) + : ( + <> + {'This is the beginning of the '} + {nameJsx} + {' room. '} + {topic} + + ); + + useEffect(() => { + const handleUpdate = () => nameForceUpdate(); + + roomList.on(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate); + return () => { + roomList.removeListener(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate); + }; + }, []); + return ( ); } @@ -199,7 +233,7 @@ function usePaginate( }; roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer); return () => { - roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer); + roomTimeline.removeListener(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer); }; }, [roomTimeline]); @@ -470,12 +504,14 @@ function RoomViewContent({ eventId, roomTimeline }) { if (i === 0 && !roomTimeline.canPaginateBackward()) { if (mEvent.getType() === 'm.room.create') { - tl.push(genRoomIntro(mEvent, roomTimeline)); + tl.push( + , + ); itemCountIndex += 1; // eslint-disable-next-line no-continue continue; } else { - tl.push(genRoomIntro(undefined, roomTimeline)); + tl.push(); itemCountIndex += 1; } } From e51fc5a58524079c2299a4a05a83b29cc96acaae Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Tue, 3 May 2022 16:01:50 +0530 Subject: [PATCH 094/824] Add join with address option (#420, #447) --- .../emoji-verification/EmojiVerification.jsx | 2 +- src/app/organisms/join-alias/JoinAlias.jsx | 155 ++++++++++++++++++ src/app/organisms/join-alias/JoinAlias.scss | 20 +++ src/app/organisms/navigation/DrawerHeader.jsx | 10 +- src/app/organisms/pw/Dialogs.jsx | 2 + src/client/action/navigation.js | 7 + src/client/state/cons.js | 2 + src/client/state/navigation.js | 6 + 8 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 src/app/organisms/join-alias/JoinAlias.jsx create mode 100644 src/app/organisms/join-alias/JoinAlias.scss diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 7d67e09a..3d63b3c3 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -125,7 +125,7 @@ function EmojiVerificationContent({ data, requestClose }) { return (
    - Click accept to start the verification process + Click accept to start the verification process.
    { process diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx new file mode 100644 index 00000000..0078d766 --- /dev/null +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -0,0 +1,155 @@ +import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import './JoinAlias.scss'; + +import initMatrix from '../../../client/initMatrix'; +import cons from '../../../client/state/cons'; +import navigation from '../../../client/state/navigation'; +import { join } from '../../../client/action/room'; +import { selectRoom, selectSpace } from '../../../client/action/navigation'; + +import Text from '../../atoms/text/Text'; +import IconButton from '../../atoms/button/IconButton'; +import Button from '../../atoms/button/Button'; +import Input from '../../atoms/input/Input'; +import Spinner from '../../atoms/spinner/Spinner'; +import Dialog from '../../molecules/dialog/Dialog'; + +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; + +import { useStore } from '../../hooks/useStore'; + +const ALIAS_OR_ID_REG = /^[#|!].+:.+\..+$/; + +function JoinAliasContent({ term, requestClose }) { + const [process, setProcess] = useState(false); + const [error, setError] = useState(undefined); + const [lastJoinId, setLastJoinId] = useState(undefined); + + const mx = initMatrix.matrixClient; + const mountStore = useStore(); + + const openRoom = (roomId) => { + const room = mx.getRoom(roomId); + if (!room) return; + if (room.isSpaceRoom()) selectSpace(roomId); + else selectRoom(roomId); + requestClose(); + }; + + useEffect(() => { + const handleJoin = (roomId) => { + if (lastJoinId !== roomId) return; + openRoom(roomId); + }; + initMatrix.roomList.on(cons.events.roomList.ROOM_JOINED, handleJoin); + return () => { + initMatrix.roomList.removeListener(cons.events.roomList.ROOM_JOINED, handleJoin); + }; + }, [lastJoinId]); + + const handleSubmit = async (e) => { + e.preventDefault(); + mountStore.setItem(true); + const alias = e.target.alias.value; + if (alias?.trim() === '') return; + if (alias.match(ALIAS_OR_ID_REG) === null) { + setError('Invalid address.'); + return; + } + setProcess('Looking for address...'); + setError(undefined); + let via; + if (alias.startsWith('#')) { + try { + const aliasData = await mx.resolveRoomAlias(alias); + via = aliasData?.servers || []; + if (mountStore.getItem()) { + setProcess(`Joining ${alias}...`); + } + } catch (err) { + if (!mountStore.getItem()) return; + setProcess(false); + setError(`Unable to find room/space with ${alias}. Either room/space is private or doesn't exist.`); + } + } + try { + const roomId = await join(alias, false, via); + if (!mountStore.getItem()) return; + setLastJoinId(roomId); + openRoom(roomId); + } catch { + if (!mountStore.getItem()) return; + setProcess(false); + setError(`Unable to join ${alias}. Either room/space is private or doesn't exist.`); + } + }; + + return ( +
    + + {error && {error}} +
    + { + process + ? ( + <> + + {process} + + ) + : + } +
    +
    + ); +} +JoinAliasContent.defaultProps = { + term: undefined, +}; +JoinAliasContent.propTypes = { + term: PropTypes.string, + requestClose: PropTypes.func.isRequired, +}; + +function useWindowToggle() { + const [data, setData] = useState(null); + + useEffect(() => { + const handleOpen = (term) => { + setData({ term }); + }; + navigation.on(cons.events.navigation.JOIN_ALIAS_OPENED, handleOpen); + return () => { + navigation.removeListener(cons.events.navigation.JOIN_ALIAS_OPENED, handleOpen); + }; + }, []); + + const onRequestClose = () => setData(null); + + return [data, onRequestClose]; +} + +function JoinAlias() { + const [data, requestClose] = useWindowToggle(); + + return ( + Join with address + )} + contentOptions={} + onRequestClose={requestClose} + > + { data ? :
    } +
    + ); +} + +export default JoinAlias; diff --git a/src/app/organisms/join-alias/JoinAlias.scss b/src/app/organisms/join-alias/JoinAlias.scss new file mode 100644 index 00000000..b3684b0b --- /dev/null +++ b/src/app/organisms/join-alias/JoinAlias.scss @@ -0,0 +1,20 @@ +@use '../../partials/dir'; + +.join-alias { + padding: var(--sp-normal); + @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); + + & > *:not(:first-child) { + margin-top: var(--sp-normal); + } + + &__error { + color: var(--tc-danger-high); + margin-top: var(--sp-extra-tight) !important; + } + + &__btn { + display: flex; + gap: var(--sp-normal); + } +} \ No newline at end of file diff --git a/src/app/organisms/navigation/DrawerHeader.jsx b/src/app/organisms/navigation/DrawerHeader.jsx index 3613c643..ba1882b7 100644 --- a/src/app/organisms/navigation/DrawerHeader.jsx +++ b/src/app/organisms/navigation/DrawerHeader.jsx @@ -7,7 +7,7 @@ import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import { - openPublicRooms, openCreateRoom, openSpaceManage, + openPublicRooms, openCreateRoom, openSpaceManage, openJoinAlias, openSpaceAddExisting, openInviteUser, openReusableContextMenu, } from '../../../client/action/navigation'; import { getEventCords } from '../../../util/common'; @@ -60,6 +60,14 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) { Join public room )} + { !spaceId && ( + { afterOptionSelect(); openJoinAlias(); }} + > + Join with address + + )} { spaceId && ( + diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index 70f270b6..1292d56d 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -86,6 +86,13 @@ export function openCreateRoom(isSpace = false, parentId = null) { }); } +export function openJoinAlias(term) { + appDispatcher.dispatch({ + type: cons.actions.navigation.OPEN_JOIN_ALIAS, + term, + }); +} + export function openInviteUser(roomId, searchTerm) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_INVITE_USER, diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 789ed587..ec8ba266 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -38,6 +38,7 @@ const cons = { OPEN_INVITE_LIST: 'OPEN_INVITE_LIST', OPEN_PUBLIC_ROOMS: 'OPEN_PUBLIC_ROOMS', OPEN_CREATE_ROOM: 'OPEN_CREATE_ROOM', + OPEN_JOIN_ALIAS: 'OPEN_JOIN_ALIAS', OPEN_INVITE_USER: 'OPEN_INVITE_USER', OPEN_PROFILE_VIEWER: 'OPEN_PROFILE_VIEWER', OPEN_SETTINGS: 'OPEN_SETTINGS', @@ -86,6 +87,7 @@ const cons = { INVITE_LIST_OPENED: 'INVITE_LIST_OPENED', PUBLIC_ROOMS_OPENED: 'PUBLIC_ROOMS_OPENED', CREATE_ROOM_OPENED: 'CREATE_ROOM_OPENED', + JOIN_ALIAS_OPENED: 'JOIN_ALIAS_OPENED', INVITE_USER_OPENED: 'INVITE_USER_OPENED', SETTINGS_OPENED: 'SETTINGS_OPENED', PROFILE_VIEWER_OPENED: 'PROFILE_VIEWER_OPENED', diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 7e7ab695..cc1e1731 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -122,6 +122,12 @@ class Navigation extends EventEmitter { action.parentId, ); }, + [cons.actions.navigation.OPEN_JOIN_ALIAS]: () => { + this.emit( + cons.events.navigation.JOIN_ALIAS_OPENED, + action.term, + ); + }, [cons.actions.navigation.OPEN_INVITE_USER]: () => { this.emit(cons.events.navigation.INVITE_USER_OPENED, action.roomId, action.searchTerm); }, From 0776a043621a6a5855c60c6f0d4ead7036828c9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 16:02:14 +0530 Subject: [PATCH 095/824] Bump sass from 1.50.1 to 1.51.0 (#522) Bumps [sass](https://github.com/sass/dart-sass) from 1.50.1 to 1.51.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.50.1...1.51.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 472ef53e..a741a64b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.50.1", + "sass": "^1.51.0", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11965,9 +11965,9 @@ } }, "node_modules/sass": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", - "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", + "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23038,9 +23038,9 @@ } }, "sass": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", - "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", + "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 56b834cf..7a53a997 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.50.1", + "sass": "^1.51.0", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From b7c322d47318439e5384c9492ebd3a7eb9fe5061 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Tue, 3 May 2022 16:43:16 +0530 Subject: [PATCH 096/824] Sign release tarball with PGP key (#392) --- .github/workflows/prod-deploy.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index a4d6d76a..107abbc4 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -25,11 +25,19 @@ jobs: run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} - name: Create tar.gz run: tar -czvf cinny-${{ steps.vars.outputs.tag }}.tar.gz dist + - name: Sign tar.gz + uses: actionhippie/gpgsign@4e28208b142cae93e1582401dcda1cf79e4f72c0 + with: + private_key: ${{ secrets.GNUPG_KEY }} + passphrase: ${{ secrets.GNUPG_PASSPHRASE }} + detach_sign: true + files: cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz + cinny-${{ steps.vars.outputs.tag }}.tar.gz.asc push_to_dockerhub: name: Push Docker image to Docker Hub From 65a0edc3a6fbb52b736a1d21c7c93c68b5732c71 Mon Sep 17 00:00:00 2001 From: Rubin Elezi Date: Wed, 4 May 2022 07:28:30 +0200 Subject: [PATCH 097/824] Don't enable e2ee for bridged platform (#476) * Don't enable e2ee for bridged platform * remove comments * Change function name Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- src/app/organisms/invite-user/InviteUser.jsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/app/organisms/invite-user/InviteUser.jsx b/src/app/organisms/invite-user/InviteUser.jsx index c03d3ad9..d0a8d9e1 100644 --- a/src/app/organisms/invite-user/InviteUser.jsx +++ b/src/app/organisms/invite-user/InviteUser.jsx @@ -103,6 +103,18 @@ function InviteUser({ updateIsSearching(false); } + async function hasDevices(userId) { + try { + const usersDeviceMap = await mx.downloadKeys([userId, mx.getUserId()]); + return Object.values(usersDeviceMap).every((userDevices) => + Object.keys(userDevices).length > 0, + ); + } catch (e) { + console.error("Error determining if it's possible to encrypt to all users: ", e); + return false; + } + } + async function createDM(userId) { if (mx.getUserId() === userId) return; const dmRoomId = hasDMWith(userId); @@ -117,7 +129,7 @@ function InviteUser({ procUserError.delete(userId); updateUserProcError(getMapCopy(procUserError)); - const result = await roomActions.createDM(userId); + const result = await roomActions.createDM(userId, await hasDevices(userId)); roomIdToUserId.set(result.room_id, userId); updateRoomIdToUserId(getMapCopy(roomIdToUserId)); } catch (e) { From 06bae231efc41acce26b6ddfd18444d27f502741 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Wed, 4 May 2022 14:22:16 +0530 Subject: [PATCH 098/824] Fix bugs in dm tab --- src/app/organisms/invite-list/InviteList.jsx | 6 +- src/app/organisms/navigation/Directs.jsx | 8 +- src/app/organisms/navigation/Drawer.jsx | 11 +- src/client/action/room.js | 21 +-- src/client/state/RoomList.js | 150 +++++++------------ 5 files changed, 86 insertions(+), 110 deletions(-) diff --git a/src/app/organisms/invite-list/InviteList.jsx b/src/app/organisms/invite-list/InviteList.jsx index e9a5adef..231928fe 100644 --- a/src/app/organisms/invite-list/InviteList.jsx +++ b/src/app/organisms/invite-list/InviteList.jsx @@ -56,9 +56,10 @@ function InviteList({ isOpen, onRequestClose }) { function renderRoomTile(roomId) { const mx = initMatrix.matrixClient; const myRoom = mx.getRoom(roomId); + if (!myRoom) return null; const roomName = myRoom.name; let roomAlias = myRoom.getCanonicalAlias(); - if (roomAlias === null) roomAlias = myRoom.roomId; + if (!roomAlias) roomAlias = myRoom.roomId; const inviterName = myRoom.getMember(mx.getUserId())?.events?.member?.getSender?.() ?? ''; return ( { const myRoom = initMatrix.matrixClient.getRoom(roomId); + if (myRoom === null) return null; const roomName = myRoom.name; return ( ) diff --git a/src/app/organisms/navigation/Directs.jsx b/src/app/organisms/navigation/Directs.jsx index c2a9798b..e65c8afc 100644 --- a/src/app/organisms/navigation/Directs.jsx +++ b/src/app/organisms/navigation/Directs.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; @@ -9,12 +10,12 @@ import { roomIdByActivity } from '../../../util/sort'; import RoomsCategory from './RoomsCategory'; const drawerPostie = new Postie(); -function Directs() { +function Directs({ size }) { const mx = initMatrix.matrixClient; const { roomList, notifications } = initMatrix; const [directIds, setDirectIds] = useState([]); - useEffect(() => setDirectIds([...roomList.directs].sort(roomIdByActivity)), []); + useEffect(() => setDirectIds([...roomList.directs].sort(roomIdByActivity)), [size]); useEffect(() => { const handleTimeline = (event, room, toStartOfTimeline, removed, data) => { @@ -63,5 +64,8 @@ function Directs() { return ; } +Directs.propTypes = { + size: PropTypes.number.isRequired, +}; export default Directs; diff --git a/src/app/organisms/navigation/Drawer.jsx b/src/app/organisms/navigation/Drawer.jsx index 8e3e4ea6..5e6badc7 100644 --- a/src/app/organisms/navigation/Drawer.jsx +++ b/src/app/organisms/navigation/Drawer.jsx @@ -42,12 +42,15 @@ function Drawer() { const [spaceId] = useSelectedSpace(); const [, forceUpdate] = useForceUpdate(); const scrollRef = useRef(null); + const { roomList } = initMatrix; useEffect(() => { - const { roomList } = initMatrix; - roomList.on(cons.events.roomList.ROOMLIST_UPDATED, forceUpdate); + const handleUpdate = () => { + forceUpdate(); + }; + roomList.on(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate); return () => { - roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, forceUpdate); + roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate); }; }, []); @@ -68,7 +71,7 @@ function Drawer() { { selectedTab !== cons.tabs.DIRECTS ? - : + : }
    diff --git a/src/client/action/room.js b/src/client/action/room.js index 5bc9bf17..bb96f99c 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -113,17 +113,20 @@ async function join(roomIdOrAlias, isDM, via) { * @param {string} roomId * @param {boolean} isDM */ -function leave(roomId) { +async function leave(roomId) { const mx = initMatrix.matrixClient; const isDM = initMatrix.roomList.directs.has(roomId); - mx.leave(roomId) - .then(() => { - appDispatcher.dispatch({ - type: cons.actions.room.LEAVE, - roomId, - isDM, - }); - }).catch(); + try { + await mx.leave(roomId); + await mx.forget(roomId); + appDispatcher.dispatch({ + type: cons.actions.room.LEAVE, + roomId, + isDM, + }); + } catch { + console.error('Unable to leave room.'); + } } async function create(options, isDM = false) { diff --git a/src/client/state/RoomList.js b/src/client/state/RoomList.js index 8b7cdc19..6ea4dad4 100644 --- a/src/client/state/RoomList.js +++ b/src/client/state/RoomList.js @@ -6,6 +6,21 @@ function isMEventSpaceChild(mEvent) { return mEvent.getType() === 'm.space.child' && Object.keys(mEvent.getContent()).length > 0; } +/** + * @param {() => boolean} callback if return true wait will over else callback will be called again. + * @param {number} timeout timeout to callback + * @param {number} maxTry maximum callback try > 0. -1 means no limit + */ +async function waitFor(callback, timeout = 400, maxTry = -1) { + if (maxTry === 0) return false; + const isOver = async () => new Promise((resolve) => { + setTimeout(() => resolve(callback()), timeout); + }); + + if (await isOver()) return true; + return waitFor(callback, timeout, maxTry - 1); +} + class RoomList extends EventEmitter { constructor(matrixClient) { super(); @@ -228,6 +243,7 @@ class RoomList extends EventEmitter { } _isDMInvite(room) { + if (this.mDirects.has(room.roomId)) return true; const me = room.getMember(this.matrixClient.getUserId()); const myEventContent = me.events.member.getContent(); return myEventContent.membership === 'invite' && myEventContent.is_direct; @@ -243,22 +259,11 @@ class RoomList extends EventEmitter { latestMDirects.forEach((directId) => { const myRoom = this.matrixClient.getRoom(directId); if (this.mDirects.has(directId)) return; - - // Update mDirects this.mDirects.add(directId); if (myRoom === null) return; - - if (this._isDMInvite(myRoom)) return; - - if (myRoom.getMyMembership === 'join' && !this.directs.has(directId)) { + if (myRoom.getMyMembership() === 'join') { this.directs.add(directId); - } - - // Newly added room. - // at this time my membership can be invite | join - if (myRoom.getMyMembership() === 'join' && this.rooms.has(directId)) { - // found a DM which accidentally gets added to this.rooms this.rooms.delete(directId); this.emit(cons.events.roomList.ROOMLIST_UPDATED); } @@ -298,23 +303,17 @@ class RoomList extends EventEmitter { } }); - this.matrixClient.on('Room.myMembership', (room, membership, prevMembership) => { + this.matrixClient.on('Room.myMembership', async (room, membership, prevMembership) => { // room => prevMembership = null | invite | join | leave | kick | ban | unban // room => membership = invite | join | leave | kick | ban | unban const { roomId } = room; + const isRoomReady = () => this.matrixClient.getRoom(roomId) !== null; + if (['join', 'invite'].includes(membership) && isRoomReady() === false) { + if (await waitFor(isRoomReady, 200, 100) === false) return; + } if (membership === 'unban') return; - // When user_reject/sender_undo room invite - if (prevMembership === 'invite') { - if (this.inviteDirects.has(roomId)) this.inviteDirects.delete(roomId); - else if (this.inviteSpaces.has(roomId)) this.inviteSpaces.delete(roomId); - else this.inviteRooms.delete(roomId); - - this.emit(cons.events.roomList.INVITELIST_UPDATED, roomId); - } - - // When user get invited if (membership === 'invite') { if (this._isDMInvite(room)) this.inviteDirects.add(roomId); else if (room.isSpaceRoom()) this.inviteSpaces.add(roomId); @@ -324,88 +323,53 @@ class RoomList extends EventEmitter { return; } - // When user join room (first time) or start DM. - if ((prevMembership === null || prevMembership === 'invite') && membership === 'join') { - // when user create room/DM OR accept room/dm invite from this client. - // we will update this.rooms/this.directs with user action - if (this.directs.has(roomId) || this.spaces.has(roomId) || this.rooms.has(roomId)) return; + if (prevMembership === 'invite') { + if (this.inviteDirects.has(roomId)) this.inviteDirects.delete(roomId); + else if (this.inviteSpaces.has(roomId)) this.inviteSpaces.delete(roomId); + else this.inviteRooms.delete(roomId); - if (this.processingRooms.has(roomId)) { - const procRoomInfo = this.processingRooms.get(roomId); - - if (procRoomInfo.isDM) this.directs.add(roomId); - else if (room.isSpaceRoom()) this.addToSpaces(roomId); - else this.rooms.add(roomId); - - if (procRoomInfo.task === 'CREATE') this.emit(cons.events.roomList.ROOM_CREATED, roomId); - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - - this.processingRooms.delete(roomId); - return; - } - if (room.isSpaceRoom()) { - this.addToSpaces(roomId); - - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - return; - } - - // below code intented to work when user create room/DM - // OR accept room/dm invite from other client. - // and we have to update our client. (it's ok to have 10sec delay) - - // create a buffer of 10sec and HOPE client.accoundData get updated - // then accoundData event listener will update this.mDirects. - // and we will be able to know if it's a DM. - // ---------- - // less likely situation: - // if we don't get accountData with 10sec then: - // we will temporary add it to this.rooms. - // and in future when accountData get updated - // accountData listener will automatically goona REMOVE it from this.rooms - // and will ADD it to this.directs - // and emit the cons.events.roomList.ROOMLIST_UPDATED to update the UI. - - setTimeout(() => { - if (this.directs.has(roomId) || this.spaces.has(roomId) || this.rooms.has(roomId)) return; - if (this.mDirects.has(roomId)) this.directs.add(roomId); - else this.rooms.add(roomId); - - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - }, 10000); - return; + this.emit(cons.events.roomList.INVITELIST_UPDATED, roomId); } - // when room is a DM add/remove it from DM's and return. - if (this.directs.has(roomId)) { - if (membership === 'leave' || membership === 'kick' || membership === 'ban') { - this.directs.delete(roomId); - this.emit(cons.events.roomList.ROOM_LEAVED, roomId); - } - } - if (this.mDirects.has(roomId)) { - if (membership === 'join') { - this.directs.add(roomId); - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - } + if (['leave', 'kick', 'ban'].includes(membership)) { + if (this.directs.has(roomId)) this.directs.delete(roomId); + else if (this.spaces.has(roomId)) this.deleteFromSpaces(roomId); + else this.rooms.delete(roomId); + this.emit(cons.events.roomList.ROOM_LEAVED, roomId); this.emit(cons.events.roomList.ROOMLIST_UPDATED); return; } - // when room is not a DM add/remove it from rooms. - if (membership === 'leave' || membership === 'kick' || membership === 'ban') { - if (room.isSpaceRoom()) this.deleteFromSpaces(roomId); - else this.rooms.delete(roomId); - this.emit(cons.events.roomList.ROOM_LEAVED, roomId); + + // when user create room/DM OR accept room/dm invite from this client. + // we will update this.rooms/this.directs with user action + if (membership === 'join' && this.processingRooms.has(roomId)) { + const procRoomInfo = this.processingRooms.get(roomId); + + if (procRoomInfo.isDM) this.directs.add(roomId); + else if (room.isSpaceRoom()) this.addToSpaces(roomId); + else this.rooms.add(roomId); + + if (procRoomInfo.task === 'CREATE') this.emit(cons.events.roomList.ROOM_CREATED, roomId); + this.emit(cons.events.roomList.ROOM_JOINED, roomId); + this.emit(cons.events.roomList.ROOMLIST_UPDATED); + + this.processingRooms.delete(roomId); + return; } + + if (this.mDirects.has(roomId) && membership === 'join') { + this.directs.add(roomId); + this.emit(cons.events.roomList.ROOM_JOINED, roomId); + this.emit(cons.events.roomList.ROOMLIST_UPDATED); + return; + } + if (membership === 'join') { if (room.isSpaceRoom()) this.addToSpaces(roomId); else this.rooms.add(roomId); this.emit(cons.events.roomList.ROOM_JOINED, roomId); + this.emit(cons.events.roomList.ROOMLIST_UPDATED); } - this.emit(cons.events.roomList.ROOMLIST_UPDATED); }); } } From 3372fb6f746a8a58598965fcfc3bbefe1b9d28e3 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Wed, 4 May 2022 14:54:43 +0530 Subject: [PATCH 099/824] Fix public room showing leaved room as joined --- src/app/organisms/public-rooms/PublicRooms.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/public-rooms/PublicRooms.jsx b/src/app/organisms/public-rooms/PublicRooms.jsx index 467f38d5..d1674c32 100644 --- a/src/app/organisms/public-rooms/PublicRooms.jsx +++ b/src/app/organisms/public-rooms/PublicRooms.jsx @@ -195,7 +195,7 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) { return rooms.map((room) => { const alias = typeof room.canonical_alias === 'string' ? room.canonical_alias : room.room_id; const name = typeof room.name === 'string' ? room.name : alias; - const isJoined = initMatrix.matrixClient.getRoom(room.room_id) !== null; + const isJoined = initMatrix.matrixClient.getRoom(room.room_id)?.getMyMembership() === 'join'; return ( Date: Thu, 5 May 2022 10:47:11 +0530 Subject: [PATCH 100/824] Bump webpack-dev-server from 4.8.1 to 4.9.0 (#524) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.8.1 to 4.9.0. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.8.1...v4.9.0) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 100 ++++------------------------------------------ package.json | 2 +- 2 files changed, 8 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index a741a64b..74dc61f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,7 @@ "util": "^0.12.4", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.8.1", + "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.7.3" }, "engines": { @@ -3256,15 +3256,6 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -10496,41 +10487,6 @@ "node": ">=4.0.0" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/postcss": { "version": "8.4.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", @@ -13657,9 +13613,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13682,7 +13638,6 @@ "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", @@ -16454,15 +16409,6 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -21961,37 +21907,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "postcss": { "version": "8.4.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", @@ -24338,9 +24253,9 @@ } }, "webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -24363,7 +24278,6 @@ "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", diff --git a/package.json b/package.json index 7a53a997..541bbf52 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "util": "^0.12.4", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.8.1", + "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.7.3" } } From 931f352873c32dcbc506ee6a64beb58d20e92aaa Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Thu, 5 May 2022 19:58:16 +0530 Subject: [PATCH 101/824] Fix space path visible in DM's --- src/app/organisms/navigation/Drawer.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/organisms/navigation/Drawer.jsx b/src/app/organisms/navigation/Drawer.jsx index 5e6badc7..a8b7f1f4 100644 --- a/src/app/organisms/navigation/Drawer.jsx +++ b/src/app/organisms/navigation/Drawer.jsx @@ -64,7 +64,9 @@ function Drawer() {
    - {navigation.selectedSpacePath.length > 1 && } + {navigation.selectedSpacePath.length > 1 && selectedTab !== cons.tabs.DIRECTS && ( + + )}
    From 73723ba6ba666121a21e2ce43e70c405b7732790 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 7 May 2022 09:50:29 +0530 Subject: [PATCH 102/824] Fix own cross siging trust before verification without key #514 --- .../emoji-verification/EmojiVerification.jsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 3d63b3c3..72b93639 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -28,12 +28,15 @@ function EmojiVerificationContent({ data, requestClose }) { const mountStore = useStore(); const beginVerification = async () => { - if (isCrossVerified(mx.deviceId) && !hasPrivateKey(getDefaultSSKey())) { - const keyData = await accessSecretStorage('Session verification'); - if (!keyData) { - request.cancel(); - return; + if (mx.getCrossSigningId() === null && isCrossVerified(mx.deviceId)) { + if (!hasPrivateKey(getDefaultSSKey())) { + const keyData = await accessSecretStorage('Emoji verification'); + if (!keyData) { + request.cancel(); + return; + } } + await mx.checkOwnCrossSigningTrust(); } setProcess(true); await request.accept(); From 2075a572fee32084365017c9ab0730b86eff5a8f Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 8 May 2022 11:55:41 +0530 Subject: [PATCH 103/824] Fixed cinny verified device failed to verify other --- .../emoji-verification/EmojiVerification.jsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 72b93639..8f08c489 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -28,7 +28,10 @@ function EmojiVerificationContent({ data, requestClose }) { const mountStore = useStore(); const beginVerification = async () => { - if (mx.getCrossSigningId() === null && isCrossVerified(mx.deviceId)) { + if ( + isCrossVerified(mx.deviceId) + && (mx.getCrossSigningId() === null || await mx.crypto.crossSigningInfo.isStoredInKeyCache('self_signing') === false) + ) { if (!hasPrivateKey(getDefaultSSKey())) { const keyData = await accessSecretStorage('Emoji verification'); if (!keyData) { @@ -66,10 +69,13 @@ function EmojiVerificationContent({ data, requestClose }) { useEffect(() => { mountStore.setItem(true); const handleChange = () => { + if (request.done || request.cancelled) { + requestClose(); + return; + } if (targetDevice && request.started) { beginVerification(); } - if (request.done || request.cancelled) requestClose(); }; if (request === null) return null; @@ -77,7 +83,7 @@ function EmojiVerificationContent({ data, requestClose }) { req.on('change', handleChange); return () => { req.off('change', handleChange); - if (!req.cancelled && !req.done) { + if (req.cancelled === false && req.done === false) { req.cancel(); } }; From 7525bb78e5d17344ac7106884d2bc0c64a3b9368 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 8 May 2022 12:26:31 +0530 Subject: [PATCH 104/824] Fix emoji verificaition not working with some client --- src/app/organisms/emoji-verification/EmojiVerification.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 8f08c489..6fe81cdd 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -26,6 +26,7 @@ function EmojiVerificationContent({ data, requestClose }) { const { request, targetDevice } = data; const mx = initMatrix.matrixClient; const mountStore = useStore(); + const beginStore = useStore(); const beginVerification = async () => { if ( @@ -73,7 +74,8 @@ function EmojiVerificationContent({ data, requestClose }) { requestClose(); return; } - if (targetDevice && request.started) { + if (targetDevice && !beginStore.getItem()) { + beginStore.setItem(true); beginVerification(); } }; From d2b435618cbfff0fd84d0893e61a2e18e456a3cb Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 8 May 2022 13:23:31 +0530 Subject: [PATCH 105/824] v2.0.0 --- LICENSE | 2 +- README.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LICENSE b/LICENSE index fc638515..ff85e6a6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Ajay Bura (ajbura) and contributors +Copyright (c) 2021 Ajay Bura (ajbura) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 44b358c0..ae9dd0bc 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ To set default Homeserver on login and register page, place a customized [`confi ## License -Copyright (c) 2021 Ajay Bura (ajbura) and contributors +Copyright (c) 2021 Ajay Bura (ajbura) Code licensed under the MIT License: diff --git a/package-lock.json b/package-lock.json index 74dc61f1..8f5f3122 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "1.8.2", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "1.8.2", + "version": "2.0.0", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", diff --git a/package.json b/package.json index 541bbf52..df567d0e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "1.8.2", + "version": "2.0.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index ec8ba266..c41ba764 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '1.8.2', + version: '2.0.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From d04de2fba039ca43f454dec852843b45f11c75a1 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 May 2022 13:52:05 +0530 Subject: [PATCH 106/824] Add badges --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index ae9dd0bc..e4704ab3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # Cinny +[![Star](https://img.shields.io/github/stars/ajbura/cinny)](https://github.com/ajbura/cinny/tree/dev) +[![Chat](https://img.shields.io/badge/chat-on%20matrix-orange)](https://matrix.to/#/#cinny:matrix.org) +[![Twitter](https://img.shields.io/twitter/url?url=https://twitter.com/@cinnyapp)](https://twitter.com/@cinnyapp) +[![Support](https://img.shields.io/badge/sponsor-open%20collective-blue.svg)](https://opencollective.com/cinny) + ## Table of Contents - [About](#about) From c11328a0649aa89e1f46de1657b4c163d48c5adc Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Wed, 11 May 2022 20:25:54 +0530 Subject: [PATCH 107/824] Fix crash on leaving room (#532) --- src/client/action/room.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/client/action/room.js b/src/client/action/room.js index bb96f99c..d945a89c 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -118,7 +118,9 @@ async function leave(roomId) { const isDM = initMatrix.roomList.directs.has(roomId); try { await mx.leave(roomId); - await mx.forget(roomId); + setTimeout(() => { + mx.forget(roomId); + }, 5000); appDispatcher.dispatch({ type: cons.actions.room.LEAVE, roomId, From f77bee25ef87d57d735042f07e265880c52d5dd9 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Wed, 11 May 2022 20:53:21 +0530 Subject: [PATCH 108/824] Remove forget room on leave --- src/client/action/room.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/client/action/room.js b/src/client/action/room.js index d945a89c..1fe721de 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -118,9 +118,6 @@ async function leave(roomId) { const isDM = initMatrix.roomList.directs.has(roomId); try { await mx.leave(roomId); - setTimeout(() => { - mx.forget(roomId); - }, 5000); appDispatcher.dispatch({ type: cons.actions.room.LEAVE, roomId, From 5863dcdf67b3099f58fe4a56b7bc8671b5e54c5e Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Wed, 11 May 2022 20:56:49 +0530 Subject: [PATCH 109/824] Fix join with alias (#533) --- src/app/organisms/join-alias/JoinAlias.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx index 0078d766..9e7f6df1 100644 --- a/src/app/organisms/join-alias/JoinAlias.jsx +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -63,7 +63,7 @@ function JoinAliasContent({ term, requestClose }) { if (alias.startsWith('#')) { try { const aliasData = await mx.resolveRoomAlias(alias); - via = aliasData?.servers || []; + via = aliasData?.servers.slice(0, 3) || []; if (mountStore.getItem()) { setProcess(`Joining ${alias}...`); } From fbe287a702eb985fb03eccbf6cad707ed19b88be Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Thu, 12 May 2022 13:45:23 +0530 Subject: [PATCH 110/824] Fix message edit isn't reflected in reply #421 --- src/app/molecules/message/Message.jsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index be4dea55..6950cb48 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -123,17 +123,26 @@ const MessageReplyWrapper = React.memo(({ roomTimeline, eventId }) => { const eTimeline = await mx.getEventTimeline(timelineSet, eventId); await roomTimeline.decryptAllEventsOfTimeline(eTimeline); - const mEvent = eTimeline.getTimelineSet().findEventById(eventId); + let mEvent = eTimeline.getTimelineSet().findEventById(eventId); + const editedList = roomTimeline.editedTimeline.get(mEvent.getId()); + if (editedList) { + mEvent = editedList[editedList.length - 1]; + } const rawBody = mEvent.getContent().body; const username = getUsernameOfRoomMember(mEvent.sender); if (isMountedRef.current === false) return; const fallbackBody = mEvent.isRedacted() ? '*** This message has been deleted ***' : '*** Unable to load reply ***'; + let parsedBody = parseReply(rawBody)?.body ?? rawBody ?? fallbackBody; + if (editedList && parsedBody.startsWith(' * ')) { + parsedBody = parsedBody.slice(3); + } + setReply({ to: username, color: colorMXID(mEvent.getSender()), - body: parseReply(rawBody)?.body ?? rawBody ?? fallbackBody, + body: parsedBody, event: mEvent, }); } catch { From 44553cc375d92c99ecd522c8216a5bdc0ab49e84 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 12 May 2022 16:32:39 +0530 Subject: [PATCH 111/824] Fix crash in room without create state event (#546) --- src/app/molecules/room-visibility/RoomVisibility.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/room-visibility/RoomVisibility.jsx b/src/app/molecules/room-visibility/RoomVisibility.jsx index 746a07a8..7a852876 100644 --- a/src/app/molecules/room-visibility/RoomVisibility.jsx +++ b/src/app/molecules/room-visibility/RoomVisibility.jsx @@ -70,7 +70,7 @@ function RoomVisibility({ roomId }) { const noSpaceParent = currentState.getStateEvents('m.space.parent').length === 0; const mCreate = currentState.getStateEvents('m.room.create')[0]?.getContent(); - const roomVersion = Number(mCreate.room_version); + const roomVersion = Number(mCreate?.room_version ?? 0); const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); From b3cb48319a57dc5d1f68ff6b34fde53f11a7f8e0 Mon Sep 17 00:00:00 2001 From: Dean Bassett Date: Thu, 12 May 2022 04:28:19 -0700 Subject: [PATCH 112/824] Add the ability to focus on paste (#545) * pasting should focus the message field also refactored a small amount to use KeyEvent.code instead of KeyEvent.keyCode, which is deprecated. fixes ajbura/cinny#544 * fix lint * comments --- src/client/event/hotkeys.js | 67 ++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 11f72bea..393dc871 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -2,25 +2,66 @@ import { openSearch, toggleRoomSettings } from '../action/navigation'; import navigation from '../state/navigation'; import { markAsRead } from '../action/notifications'; +// describes which keys should auto-focus the message field +function shouldFocusMessageField(code) { + // should focus on alphanumeric values, and backspace + if (code.startsWith('Key')) { + return true; + } + if (code.startsWith('Digit')) { + return true; + } + if (code === 'Backspace') { + return true; + } + + // do not focus if super key is pressed + if (code.startsWith('Meta')) { // chrome + return false; + } + if (code.startsWith('OS')) { // firefox + return false; + } + + // do not focus on F keys + if (/^F\d+$/.test(code)) { + return false; + } + + // do not focus on numlock/scroll lock + if (code === 'NumLock' || code === 'ScrollLock') { + return false; + } + + return true; +} + function listenKeyboard(event) { // Ctrl/Cmd + if (event.ctrlKey || event.metaKey) { - // k - for search Modal - if (event.keyCode === 75) { + // open search modal + if (event.code === 'KeyK') { event.preventDefault(); - if (navigation.isRawModalVisible) return; + if (navigation.isRawModalVisible) { + return; + } openSearch(); } + + // focus message field on paste + if (event.code === 'KeyV') { + const msgTextarea = document.getElementById('message-textarea'); + msgTextarea?.focus(); + } } - if (!event.ctrlKey && !event.altKey) { + if (!event.ctrlKey && !event.altKey && !event.metaKey) { if (navigation.isRawModalVisible) return; if (['text', 'textarea'].includes(document.activeElement.type)) { return; } - // esc - if (event.keyCode === 27) { + if (event.code === 'Escape') { if (navigation.isRoomSettings) { toggleRoomSettings(); return; @@ -31,16 +72,12 @@ function listenKeyboard(event) { } } - // Don't allow these keys to type/focus message field - if ((event.keyCode !== 8 && event.keyCode < 48) - || (event.keyCode >= 91 && event.keyCode <= 93) - || (event.keyCode >= 112 && event.keyCode <= 183)) { - return; + // focus the text field on most keypresses + if (shouldFocusMessageField(event.code)) { + // press any key to focus and type in message field + const msgTextarea = document.getElementById('message-textarea'); + msgTextarea?.focus(); } - - // press any key to focus and type in message field - const msgTextarea = document.getElementById('message-textarea'); - msgTextarea?.focus(); } } From c08b0e654b84514c15eb04307adfb38db96e3e89 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 12 May 2022 12:43:14 +0100 Subject: [PATCH 113/824] Add allowCustomHomeservers config option (#525) * feat: Add allowCustomHomeservers config option * fix: Do not lock the homeserver input when the selection is changed --- config.json | 3 ++- src/app/templates/auth/Auth.jsx | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/config.json b/config.json index c8a5ea6f..e7f9eea3 100644 --- a/config.json +++ b/config.json @@ -7,5 +7,6 @@ "kde.org", "matrix.org", "chat.mozilla.org" - ] + ], + "allowCustomHomeservers": true } \ No newline at end of file diff --git a/src/app/templates/auth/Auth.jsx b/src/app/templates/auth/Auth.jsx index 33d2152f..1f76476d 100644 --- a/src/app/templates/auth/Auth.jsx +++ b/src/app/templates/auth/Auth.jsx @@ -93,12 +93,13 @@ function Homeserver({ onChange }) { const result = await (await fetch(configFileUrl, { method: 'GET' })).json(); const selectedHs = result?.defaultHomeserver; const hsList = result?.homeserverList; + const allowCustom = result?.allowCustomHomeservers ?? true; if (!hsList?.length > 0 || selectedHs < 0 || selectedHs >= hsList?.length) { throw new Error(); } - setHs({ selected: hsList[selectedHs], list: hsList }); + setHs({ selected: hsList[selectedHs], list: hsList, allowCustom: allowCustom }); } catch { - setHs({ selected: 'matrix.org', list: ['matrix.org'] }); + setHs({ selected: 'matrix.org', list: ['matrix.org'], allowCustom: true }); } }, []); @@ -106,14 +107,15 @@ function Homeserver({ onChange }) { const { value } = e.target; setProcess({ isLoading: false }); debounce._(async () => { - setHs({ selected: value.trim(), list: hs.list }); + setHs({ ...hs, selected: value.trim() }); }, 700)(); }; return ( <>
    - + ( @@ -126,7 +128,7 @@ function Homeserver({ onChange }) { onClick={() => { hideMenu(); hsRef.current.value = hsName; - setHs({ selected: hsName, list: hs.list }); + setHs({ ...hs, selected: hsName }); }} > {hsName} From 05398367147bd5b3c3990defb032a349ac8c5d22 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 13 May 2022 15:38:18 +0530 Subject: [PATCH 114/824] Fix space and enter focus message field --- src/client/event/hotkeys.js | 39 ++++++++++++++----------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 393dc871..30594e48 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -2,34 +2,25 @@ import { openSearch, toggleRoomSettings } from '../action/navigation'; import navigation from '../state/navigation'; import { markAsRead } from '../action/notifications'; -// describes which keys should auto-focus the message field function shouldFocusMessageField(code) { - // should focus on alphanumeric values, and backspace - if (code.startsWith('Key')) { - return true; - } - if (code.startsWith('Digit')) { - return true; - } - if (code === 'Backspace') { - return true; - } - - // do not focus if super key is pressed - if (code.startsWith('Meta')) { // chrome - return false; - } - if (code.startsWith('OS')) { // firefox - return false; - } - // do not focus on F keys - if (/^F\d+$/.test(code)) { - return false; - } + if (/^F\d+$/.test(code)) return false; // do not focus on numlock/scroll lock - if (code === 'NumLock' || code === 'ScrollLock') { + if ( + code.metaKey + || code.startsWith('OS') + || code.startsWith('Meta') + || code.startsWith('Shift') + || code.startsWith('Alt') + || code.startsWith('Control') + || code.startsWith('Arrow') + || code === 'Tab' + || code === 'Space' + || code === 'Enter' + || code === 'NumLock' + || code === 'ScrollLock' + ) { return false; } From 0b70c7e490bcda197244b826d3a788ca06c84395 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 13 May 2022 16:39:54 +0530 Subject: [PATCH 115/824] v2.0.1 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f5f3122..fa21cbcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.0.0", + "version": "2.0.1", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", diff --git a/package.json b/package.json index df567d0e..0ac5fbc9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.0.0", + "version": "2.0.1", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index c41ba764..bc3aaa94 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.0.0', + version: '2.0.1', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 4a715bfd17fbb2cbaaeb8d5bc839ab7e8e73a036 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 14 May 2022 08:24:21 +0530 Subject: [PATCH 116/824] Fix pasting not working #551 --- src/client/event/hotkeys.js | 8 ++++---- src/client/state/navigation.js | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 30594e48..ce52decf 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -33,22 +33,22 @@ function listenKeyboard(event) { // open search modal if (event.code === 'KeyK') { event.preventDefault(); - if (navigation.isRawModalVisible) { - return; - } + if (navigation.isRawModalVisible) return; openSearch(); } // focus message field on paste if (event.code === 'KeyV') { + if (navigation.isRawModalVisible) return; const msgTextarea = document.getElementById('message-textarea'); + if (document.activeElement !== msgTextarea && document.activeElement.tagName.toLowerCase() === 'input') return; msgTextarea?.focus(); } } if (!event.ctrlKey && !event.altKey && !event.metaKey) { if (navigation.isRawModalVisible) return; - if (['text', 'textarea'].includes(document.activeElement.type)) { + if (document.activeElement.tagName.toLowerCase() === 'input') { return; } diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index cc1e1731..019a5d31 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -14,7 +14,8 @@ class Navigation extends EventEmitter { this.isRoomSettings = false; this.recentRooms = []; - this.isRawModalVisible = false; + this.rawModelStack = []; + window.nav = this; } _setSpacePath(roomId) { @@ -47,8 +48,13 @@ class Navigation extends EventEmitter { } } + get isRawModalVisible() { + return this.rawModelStack.length > 0; + } + setIsRawModalVisible(visible) { - this.isRawModalVisible = visible; + if (visible) this.rawModelStack.push(true); + else this.rawModelStack.pop(); } navigate(action) { From 941dae062517b6f380e5b38fa059c9c02b1fb8fc Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 14 May 2022 08:28:31 +0530 Subject: [PATCH 117/824] Remove globally exposed var --- src/client/state/navigation.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 019a5d31..b39c043f 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -15,7 +15,6 @@ class Navigation extends EventEmitter { this.recentRooms = []; this.rawModelStack = []; - window.nav = this; } _setSpacePath(roomId) { From a6fdf9010b31dcf89f0941adb4d294c363ab14bc Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 14 May 2022 09:38:58 +0530 Subject: [PATCH 118/824] v2.0.2 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa21cbcc..b57e931d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.0.1", + "version": "2.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.0.1", + "version": "2.0.2", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", diff --git a/package.json b/package.json index 0ac5fbc9..20b35b95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.0.1", + "version": "2.0.2", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index bc3aaa94..bff78b5f 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.0.1', + version: '2.0.2', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 1bdd0449e02fb48425d9aa6071b0180415eb148b Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 14 May 2022 20:05:43 +0530 Subject: [PATCH 119/824] Fix edit message not working (#552) --- src/client/event/hotkeys.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index ce52decf..c1b2af1d 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -41,14 +41,17 @@ function listenKeyboard(event) { if (event.code === 'KeyV') { if (navigation.isRawModalVisible) return; const msgTextarea = document.getElementById('message-textarea'); - if (document.activeElement !== msgTextarea && document.activeElement.tagName.toLowerCase() === 'input') return; + const { activeElement } = document; + if (activeElement !== msgTextarea + && ['input', 'textarea'].includes(activeElement.tagName.toLowerCase()) + ) return; msgTextarea?.focus(); } } if (!event.ctrlKey && !event.altKey && !event.metaKey) { if (navigation.isRawModalVisible) return; - if (document.activeElement.tagName.toLowerCase() === 'input') { + if (['input', 'textarea'].includes(document.activeElement.tagName.toLowerCase())) { return; } From 69b60553531680d53da9232363548ec36a6830ae Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 15 May 2022 10:39:42 +0530 Subject: [PATCH 120/824] v2.0.3 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b57e931d..9b4ae930 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.0.2", + "version": "2.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", diff --git a/package.json b/package.json index 20b35b95..34b56e6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.0.2", + "version": "2.0.3", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index bff78b5f..b6021125 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.0.2', + version: '2.0.3', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From fda71166df4b71ef83cd40a4edb2dffdc449fef7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:16:55 +0530 Subject: [PATCH 121/824] Bump actions/github-script from 6.0.0 to 6.1.0 (#562) Bumps [actions/github-script](https://github.com/actions/github-script) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/deploy-pull-request.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 1c1ddfa0..11116945 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -21,7 +21,7 @@ jobs: path: dist retention-days: 1 - name: Get PR info - uses: actions/github-script@v6.0.0 + uses: actions/github-script@v6.1.0 with: script: | var fs = require('fs'); diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 814a344b..84098f24 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -14,7 +14,7 @@ jobs: # workflow_run action (https://github.com/actions/download-artifact/issues/60) # so instead we get this mess: - name: Download artifact - uses: actions/github-script@v6.0.0 + uses: actions/github-script@v6.1.0 with: script: | var artifacts = await github.rest.actions.listWorkflowRunArtifacts({ @@ -48,7 +48,7 @@ jobs: run: unzip -d dist previewbuild.zip && rm previewbuild.zip && unzip pr.json.zip && rm pr.json.zip - name: Read PR Info id: readctx - uses: actions/github-script@v6.0.0 + uses: actions/github-script@v6.1.0 with: script: | var fs = require('fs'); From 54fd394ef5f836977b6bb4df36056cb3bbeaa182 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:17:47 +0530 Subject: [PATCH 122/824] Bump webpack from 5.72.0 to 5.72.1 (#561) Bumps [webpack](https://github.com/webpack/webpack) from 5.72.0 to 5.72.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.72.0...v5.72.1) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b4ae930..8d14b05b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.72.0", + "webpack": "^5.72.1", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.7.3" @@ -5480,9 +5480,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8304,10 +8304,10 @@ "node": ">=4" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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": { @@ -13438,9 +13438,9 @@ } }, "node_modules/webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13452,13 +13452,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -18150,9 +18150,9 @@ } }, "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -20282,10 +20282,10 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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": { @@ -24119,9 +24119,9 @@ } }, "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -24133,13 +24133,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", diff --git a/package.json b/package.json index 34b56e6f..fd2cf6bf 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.72.0", + "webpack": "^5.72.1", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.7.3" From 73dcb441210a857a736c85cfe7d7ff586124e586 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:20:01 +0530 Subject: [PATCH 123/824] Bump matrix-js-sdk from 17.1.0 to 17.2.0 (#560) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 17.1.0 to 17.2.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v17.1.0...v17.2.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 17 ++++++++++------- package.json | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d14b05b..4cc09590 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.1.0", + "matrix-js-sdk": "^17.2.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", @@ -8875,9 +8875,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.1.0.tgz", - "integrity": "sha512-1MZYo+B4FnZMII1/Mw0E7WX4erCxnPpeA8fankY5Ql82LQQVSnceOpX2XAsRlDHcxcdExB929KKqVrk/eqDM/A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.2.0.tgz", + "integrity": "sha512-/IrgHCSVUZNVcKoPO20OF9Xog9X79a1ckmR7FwF5lSTNdmC7eQvU0XcFYCi5IXo57du+im69lEw8dLbPngZhoQ==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -8890,6 +8890,9 @@ "qs": "^6.9.6", "request": "^2.88.2", "unhomoglyph": "^1.0.6" + }, + "engines": { + "node": ">=12.9.0" } }, "node_modules/md5.js": { @@ -20770,9 +20773,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.1.0.tgz", - "integrity": "sha512-1MZYo+B4FnZMII1/Mw0E7WX4erCxnPpeA8fankY5Ql82LQQVSnceOpX2XAsRlDHcxcdExB929KKqVrk/eqDM/A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.2.0.tgz", + "integrity": "sha512-/IrgHCSVUZNVcKoPO20OF9Xog9X79a1ckmR7FwF5lSTNdmC7eQvU0XcFYCi5IXo57du+im69lEw8dLbPngZhoQ==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index fd2cf6bf..bb3e7696 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "html-react-parser": "^1.4.12", "katex": "^0.15.3", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.1.0", + "matrix-js-sdk": "^17.2.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", From 7227fc7c43711f152df57bc3589ca2ed9755e6b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:20:54 +0530 Subject: [PATCH 124/824] Bump @babel/preset-react from 7.16.7 to 7.17.12 (#559) Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.16.7 to 7.17.12. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-preset-react) --- updated-dependencies: - dependency-name: "@babel/preset-react" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 86 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4cc09590..368010b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "devDependencies": { "@babel/core": "^7.17.10", "@babel/preset-env": "^7.17.10", - "@babel/preset-react": "^7.16.7", + "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", @@ -364,9 +364,9 @@ } }, "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==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -867,12 +867,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1368,16 +1368,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1659,15 +1659,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", + "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -14199,9 +14199,9 @@ } }, "@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==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -14540,12 +14540,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -14861,16 +14861,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" } }, "@babel/plugin-transform-react-jsx-development": { @@ -15071,15 +15071,15 @@ } }, "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } @@ -15147,9 +15147,9 @@ } }, "@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", + "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", diff --git a/package.json b/package.json index bb3e7696..f15f6479 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "devDependencies": { "@babel/core": "^7.17.10", "@babel/preset-env": "^7.17.10", - "@babel/preset-react": "^7.16.7", + "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", From 854d2b4c27b01cb2db191f430700875497bf9bf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:24:28 +0530 Subject: [PATCH 125/824] Bump @fontsource/roboto from 4.5.5 to 4.5.7 (#556) Bumps [@fontsource/roboto](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/roboto) from 4.5.5 to 4.5.7. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/roboto) --- updated-dependencies: - dependency-name: "@fontsource/roboto" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 368010b2..902f0317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", - "@fontsource/roboto": "^4.5.5", + "@fontsource/roboto": "^4.5.7", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", @@ -1811,9 +1811,9 @@ "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" }, "node_modules/@fontsource/roboto": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.5.tgz", - "integrity": "sha512-Pe1p+gAO6K0aLxBXlLoJRHVx352tVc/v/7DOnvM3t+FYXb+KUga9aCD1NpnDfd0kKnWXqrZyAXguyyFWDDuphw==" + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.7.tgz", + "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.3", @@ -15196,9 +15196,9 @@ "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" }, "@fontsource/roboto": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.5.tgz", - "integrity": "sha512-Pe1p+gAO6K0aLxBXlLoJRHVx352tVc/v/7DOnvM3t+FYXb+KUga9aCD1NpnDfd0kKnWXqrZyAXguyyFWDDuphw==" + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.7.tgz", + "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" }, "@humanwhocodes/config-array": { "version": "0.9.3", diff --git a/package.json b/package.json index f15f6479..26ce8100 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", - "@fontsource/roboto": "^4.5.5", + "@fontsource/roboto": "^4.5.7", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", From 0cd3df391e1de60d694960062083239f0d748ec6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:25:57 +0530 Subject: [PATCH 126/824] Bump eslint from 8.14.0 to 8.15.0 (#536) Bumps [eslint](https://github.com/eslint/eslint) from 8.14.0 to 8.15.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.14.0...v8.15.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 90 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 902f0317..21df319a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.14.0", + "eslint": "^8.15.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -1771,19 +1771,19 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", + "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", + "espree": "^9.3.2", "globals": "^13.9.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1791,9 +1791,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2917,9 +2917,9 @@ } }, "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==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -5618,12 +5618,12 @@ } }, "node_modules/eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.2", + "@eslint/eslintrc": "^1.2.3", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -5634,7 +5634,7 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5650,7 +5650,7 @@ "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", @@ -6064,13 +6064,13 @@ } }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -15163,26 +15163,26 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", + "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", + "espree": "^9.3.2", "globals": "^13.9.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -16138,9 +16138,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true }, "acorn-jsx": { @@ -18258,12 +18258,12 @@ "dev": true }, "eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.2", + "@eslint/eslintrc": "^1.2.3", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -18274,7 +18274,7 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -18290,7 +18290,7 @@ "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", @@ -18602,13 +18602,13 @@ "dev": true }, "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index 26ce8100..a1fcd3f3 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.14.0", + "eslint": "^8.15.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From 2cd74b4ea9987ba55ed6e62b7913cfb4c71b6190 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:58:34 +0530 Subject: [PATCH 127/824] Bump docker/login-action from 1.14.1 to 2.0.0 (#540) Bumps [docker/login-action](https://github.com/docker/login-action) from 1.14.1 to 2.0.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v1.14.1...v2.0.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 107abbc4..cdd695c4 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -46,7 +46,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Login to Docker Hub - uses: docker/login-action@v1.14.1 + uses: docker/login-action@v2.0.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} From 780bd5e65a30138c409ac2e07c6d6702e0d655c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:59:00 +0530 Subject: [PATCH 128/824] Bump docker/metadata-action from 3.8.0 to 4.0.1 (#539) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 3.8.0 to 4.0.1. - [Release notes](https://github.com/docker/metadata-action/releases) - [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md) - [Commits](https://github.com/docker/metadata-action/compare/v3.8.0...v4.0.1) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index cdd695c4..65a09a7c 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -52,7 +52,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v3.8.0 + uses: docker/metadata-action@v4.0.1 with: images: ajbura/cinny - name: Build and push Docker image From 40de64078a4b5358ae74319f32f429dd55981099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 09:59:40 +0530 Subject: [PATCH 129/824] Bump docker/build-push-action from 2.10.0 to 3.0.0 (#538) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.10.0 to 3.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v2.10.0...v3.0.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 87df19dc..4daf0aae 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Build Docker image - uses: docker/build-push-action@v2.10.0 + uses: docker/build-push-action@v3.0.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 65a09a7c..0f790ff4 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -56,7 +56,7 @@ jobs: with: images: ajbura/cinny - name: Build and push Docker image - uses: docker/build-push-action@v2.10.0 + uses: docker/build-push-action@v3.0.0 with: context: . push: true From 38bd38a4873ff1113993cffbdb5e47e67d3f31f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 10:01:37 +0530 Subject: [PATCH 130/824] Bump @babel/core from 7.17.10 to 7.18.0 (#568) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.10 to 7.18.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.0/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 188 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 96 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21df319a..0d11f894 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.10", + "@babel/core": "^7.18.0", "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", @@ -117,21 +117,21 @@ } }, "node_modules/@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", + "@babel/generator": "^7.18.0", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -147,13 +147,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, "engines": { @@ -333,9 +333,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", @@ -344,8 +344,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -472,14 +472,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -500,9 +500,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1728,19 +1728,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2330,13 +2330,14 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -2352,9 +2353,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2367,9 +2368,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -14013,21 +14014,21 @@ "dev": true }, "@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", + "@babel/generator": "^7.18.0", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14036,13 +14037,13 @@ } }, "@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "requires": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } }, @@ -14174,9 +14175,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", @@ -14185,8 +14186,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { @@ -14280,14 +14281,14 @@ } }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/highlight": { @@ -14302,9 +14303,9 @@ } }, "@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15129,27 +15130,27 @@ } }, "@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -15599,13 +15600,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { @@ -15615,9 +15617,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -15627,9 +15629,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", diff --git a/package.json b/package.json index a1fcd3f3..c525f207 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.17.10", + "@babel/core": "^7.18.0", "@babel/preset-env": "^7.17.10", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", From deef1f2c8a73032aae00b8ff3092e5a96ee3b60a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 10:06:10 +0530 Subject: [PATCH 131/824] Bump @babel/preset-env from 7.17.10 to 7.18.0 (#569) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.17.10 to 7.18.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.0/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 828 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 430 insertions(+), 400 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d11f894..dd60aaf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@babel/core": "^7.18.0", - "@babel/preset-env": "^7.17.10", + "@babel/preset-env": "^7.18.0", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -204,9 +204,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -225,9 +225,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -512,12 +512,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -527,14 +527,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -544,12 +544,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -561,13 +561,13 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -577,13 +577,13 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -610,12 +610,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -626,12 +626,12 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -642,12 +642,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -658,12 +658,12 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -690,16 +690,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -725,12 +725,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -742,13 +742,13 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -758,14 +758,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -776,13 +776,13 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=4" @@ -854,6 +854,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "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", @@ -984,12 +999,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -999,13 +1014,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" }, "engines": { @@ -1031,12 +1046,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", + "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1046,16 +1061,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", + "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" @@ -1068,12 +1083,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1083,12 +1098,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1114,12 +1129,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1145,12 +1160,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1177,12 +1192,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1207,13 +1222,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1224,13 +1239,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1242,14 +1257,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1261,13 +1276,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1277,12 +1292,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1292,12 +1308,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1323,12 +1339,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1418,11 +1434,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1433,12 +1450,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1463,12 +1480,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { @@ -1494,12 +1511,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", + "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1509,12 +1526,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1555,37 +1572,38 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", + "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1595,40 +1613,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.17.12", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", + "@babel/types": "^7.18.0", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -14079,9 +14097,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -14094,9 +14112,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -14309,54 +14327,54 @@ "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, @@ -14371,42 +14389,42 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, @@ -14421,16 +14439,16 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -14444,46 +14462,46 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-async-generators": { @@ -14531,6 +14549,15 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, "@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", @@ -14622,22 +14649,22 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" } }, @@ -14651,46 +14678,46 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", + "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", + "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-dotall-regex": { @@ -14704,12 +14731,12 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -14723,12 +14750,12 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-function-name": { @@ -14743,12 +14770,12 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-member-expression-literals": { @@ -14761,67 +14788,68 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-object-super": { @@ -14835,12 +14863,12 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-property-literals": { @@ -14894,21 +14922,22 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-shorthand-properties": { @@ -14921,12 +14950,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, @@ -14940,21 +14969,21 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", + "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-unicode-escapes": { @@ -14977,37 +15006,38 @@ } }, "@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", + "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -15017,40 +15047,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.17.12", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", + "@babel/types": "^7.18.0", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", diff --git a/package.json b/package.json index c525f207..2ab6d8d2 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@babel/core": "^7.18.0", - "@babel/preset-env": "^7.17.10", + "@babel/preset-env": "^7.18.0", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", From fc6c7b8dc69a1eab4da70d7a61431f3ecf944c38 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 21 May 2022 17:33:01 +0530 Subject: [PATCH 132/824] Add recommended ways to install node and node version --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e4704ab3..b35e5975 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ A tarball of pre-compiled version of the app is provided with each [release](htt You can serve the application with a webserver of your choosing by simply copying `dist/` directory to the webroot. ### Building from source +> We recommend using a version manager as versions change very quickly. You will likely need to switch +between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Also recommended nodejs version is 16.15.0 LTS. Execute the following commands to compile the app from its source code: From 3bd4eda789eb16870b0e7f578144e3e7cd753b03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:40:24 +0530 Subject: [PATCH 133/824] Bump actions/upload-artifact from 3.0.0 to 3.1.0 (#578) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3.0.0...v3.1.0) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 11116945..e5102a3a 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -15,7 +15,7 @@ jobs: - name: Build app run: npm ci && npm run build - name: Upload artifact - uses: actions/upload-artifact@v3.0.0 + uses: actions/upload-artifact@v3.1.0 with: name: previewbuild path: dist @@ -27,7 +27,7 @@ jobs: var fs = require('fs'); fs.writeFileSync('${{github.workspace}}/pr.json', JSON.stringify(context.payload.pull_request)); - name: Upload PR Info - uses: actions/upload-artifact@v3.0.0 + uses: actions/upload-artifact@v3.1.0 with: name: pr.json path: pr.json From 489f178c7c452ffd986026b152066af1d16bfda4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:43:21 +0530 Subject: [PATCH 134/824] Bump katex from 0.15.3 to 0.15.6 (#577) Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.15.3 to 0.15.6. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.15.3...v0.15.6) --- updated-dependencies: - dependency-name: katex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd60aaf2..95f71a35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.12", - "katex": "^0.15.3", + "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.2.0", "micromark": "^3.0.10", @@ -8410,9 +8410,9 @@ } }, "node_modules/katex": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.3.tgz", - "integrity": "sha512-Al6V7RJsmjklT9QItyHWGaQCt+NYTle1bZwB1e9MR/tLoIT1MXaHy9UpfGSB7eaqDgjjqqRxQOaQGrALCrEyBQ==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -20387,9 +20387,9 @@ } }, "katex": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.3.tgz", - "integrity": "sha512-Al6V7RJsmjklT9QItyHWGaQCt+NYTle1bZwB1e9MR/tLoIT1MXaHy9UpfGSB7eaqDgjjqqRxQOaQGrALCrEyBQ==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", "requires": { "commander": "^8.0.0" } diff --git a/package.json b/package.json index 2ab6d8d2..b15e6c10 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^1.4.12", - "katex": "^0.15.3", + "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.2.0", "micromark": "^3.0.10", From e48d216d79d50f13dbe38dad6fc5c67b59e57528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:45:33 +0530 Subject: [PATCH 135/824] Bump sass from 1.51.0 to 1.52.1 (#572) Bumps [sass](https://github.com/sass/dart-sass) from 1.51.0 to 1.52.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.51.0...1.52.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95f71a35..c7d4fe01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.51.0", + "sass": "^1.52.1", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11943,9 +11943,9 @@ } }, "node_modules/sass": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", - "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -22988,9 +22988,9 @@ } }, "sass": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", - "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index b15e6c10..cfa6dbcb 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.51.0", + "sass": "^1.52.1", "sass-loader": "^12.6.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 00956f5bba6787931af8e882674a9fe8be5c4bf2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:46:35 +0530 Subject: [PATCH 136/824] Bump eslint from 8.15.0 to 8.16.0 (#574) Bumps [eslint](https://github.com/eslint/eslint) from 8.15.0 to 8.16.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.15.0...v8.16.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7d4fe01..0f406751 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.15.0", + "eslint": "^8.16.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -1789,15 +1789,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -5637,12 +5637,12 @@ } }, "node_modules/eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.3", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -5660,7 +5660,7 @@ "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -6047,9 +6047,9 @@ } }, "node_modules/eslint/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==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -15194,15 +15194,15 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -18290,12 +18290,12 @@ "dev": true }, "eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.3", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -18313,7 +18313,7 @@ "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -18383,9 +18383,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dev": true, "requires": { "type-fest": "^0.20.2" diff --git a/package.json b/package.json index cfa6dbcb..8a95b443 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", - "eslint": "^8.15.0", + "eslint": "^8.16.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From df718e4498fe8bea49e57e0acbe233ca46dc42f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:47:49 +0530 Subject: [PATCH 137/824] Bump eslint-plugin-react from 7.29.4 to 7.30.0 (#575) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.29.4 to 7.30.0. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.29.4...v7.30.0) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 441 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 276 insertions(+), 167 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f406751..7f1fa4bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,7 @@ "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", @@ -3148,14 +3148,14 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" }, @@ -3193,14 +3193,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5096,15 +5097,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { @@ -5544,31 +5549,34 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5583,6 +5591,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -5850,25 +5867,25 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "engines": { "node": ">=4" @@ -6839,12 +6856,39 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/fwd-stream": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", @@ -7085,9 +7129,9 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7102,10 +7146,22 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -7975,9 +8031,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -7996,9 +8052,9 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -8090,10 +8146,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8165,12 +8224,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9937,9 +9996,9 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10019,13 +10078,13 @@ } }, "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11504,13 +11563,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -12561,18 +12621,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" }, "funding": { @@ -12580,26 +12640,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13192,14 +13254,14 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -16342,14 +16404,14 @@ "dev": true }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } @@ -16372,14 +16434,15 @@ } }, "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "arrify": { @@ -17856,12 +17919,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -18215,31 +18279,34 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, "es-module-lexer": { @@ -18248,6 +18315,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -18543,25 +18619,25 @@ } }, "eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "dependencies": { "doctrine": { @@ -19228,12 +19304,30 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "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 }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "fwd-stream": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", @@ -19435,9 +19529,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -19446,10 +19540,19 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -20061,9 +20164,9 @@ } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -20073,9 +20176,9 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -20137,10 +20240,13 @@ } }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-stream": { "version": "2.0.1", @@ -20185,12 +20291,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "is-wsl": { @@ -21498,9 +21604,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" }, "object-is": { "version": "1.1.5", @@ -21553,13 +21659,13 @@ } }, "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "object.values": { @@ -22644,13 +22750,14 @@ } }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -23472,39 +23579,41 @@ } }, "string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "strip-ansi": { @@ -23934,14 +24043,14 @@ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, diff --git a/package.json b/package.json index 8a95b443..2211b67a 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", From 427ea9baab78dec19329e3d360848db2ef6e0b41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:51:19 +0530 Subject: [PATCH 138/824] Bump sass-loader from 12.6.0 to 13.0.0 (#576) Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 12.6.0 to 13.0.0. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v12.6.0...v13.0.0) --- updated-dependencies: - dependency-name: sass-loader dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f1fa4bf..34ad4949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", "sass": "^1.52.1", - "sass-loader": "^12.6.0", + "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "url": "^0.11.0", @@ -12020,16 +12020,16 @@ } }, "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", + "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -23106,9 +23106,9 @@ } }, "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", + "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", "dev": true, "requires": { "klona": "^2.0.4", diff --git a/package.json b/package.json index 2211b67a..d160ffac 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", "sass": "^1.52.1", - "sass-loader": "^12.6.0", + "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "url": "^0.11.0", From 895b2c4f1985888c8b2cf8d057654757bff9fe7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 19:53:37 +0530 Subject: [PATCH 139/824] Bump copy-webpack-plugin from 10.2.4 to 11.0.0 (#571) Bumps [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin) from 10.2.4 to 11.0.0. - [Release notes](https://github.com/webpack-contrib/copy-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/copy-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/copy-webpack-plugin/compare/v10.2.4...v11.0.0) --- updated-dependencies: - dependency-name: copy-webpack-plugin dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 158 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 70 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34ad4949..1778ebc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^10.2.4", + "copy-webpack-plugin": "^11.0.0", "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", @@ -4419,20 +4419,20 @@ "dev": true }, "node_modules/copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^12.0.2", + "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 12.20.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -4470,38 +4470,6 @@ "ajv": "^8.8.2" } }, - "node_modules/copy-webpack-plugin/node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4527,18 +4495,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -6357,9 +6313,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6369,7 +6325,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { @@ -7085,6 +7041,25 @@ "node": ">=4" } }, + "node_modules/globby": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -12412,6 +12387,18 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -17432,14 +17419,14 @@ "dev": true }, "copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^12.0.2", + "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" @@ -17466,26 +17453,6 @@ "fast-deep-equal": "^3.1.3" } }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "requires": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -17503,12 +17470,6 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true } } }, @@ -18909,9 +18870,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -19495,6 +19456,19 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -23413,6 +23387,12 @@ } } }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", diff --git a/package.json b/package.json index d160ffac..d828c495 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "browserify-fs": "^1.0.0", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^10.2.4", + "copy-webpack-plugin": "^11.0.0", "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", From fde7d4a25a66feb311ad87e82185fe3f8b663206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 20:06:17 +0530 Subject: [PATCH 140/824] Bump css-minimizer-webpack-plugin from 3.4.1 to 4.0.0 (#573) Bumps [css-minimizer-webpack-plugin](https://github.com/webpack-contrib/css-minimizer-webpack-plugin) from 3.4.1 to 4.0.0. - [Release notes](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/compare/v3.4.1...v4.0.0) --- updated-dependencies: - dependency-name: css-minimizer-webpack-plugin dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 713 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 320 insertions(+), 395 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1778ebc1..f1145511 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "copy-webpack-plugin": "^11.0.0", "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^3.4.1", + "css-minimizer-webpack-plugin": "^4.0.0", "eslint": "^8.16.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", @@ -4039,15 +4039,6 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/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/clean-webpack-plugin": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", @@ -4629,15 +4620,12 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", "dev": true, - "dependencies": { - "timsort": "^0.3.0" - }, "engines": { - "node": ">= 10" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" @@ -4685,20 +4673,20 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", "dev": true, "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -4775,15 +4763,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/css-minimizer-webpack-plugin/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/css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -4813,15 +4792,6 @@ "node": ">=8.0.0" } }, - "node_modules/css-tree/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/css-what": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", @@ -4847,12 +4817,12 @@ } }, "node_modules/cssnano": { - "version": "5.0.17", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.17.tgz", - "integrity": "sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", + "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.1.12", + "cssnano-preset-default": "^5.2.9", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -4868,40 +4838,40 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.12.tgz", - "integrity": "sha512-rO/JZYyjW1QNkWBxMGV28DW7d98UDLaF759frhli58QFehZ+D/LSmwQ2z/ylBAe2hUlsIWTq6NYGfQPq65EF9w==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", + "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.2", - "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.5", - "postcss-convert-values": "^5.0.4", - "postcss-discard-comments": "^5.0.3", - "postcss-discard-duplicates": "^5.0.3", - "postcss-discard-empty": "^5.0.3", - "postcss-discard-overridden": "^5.0.4", - "postcss-merge-longhand": "^5.0.6", - "postcss-merge-rules": "^5.0.6", - "postcss-minify-font-values": "^5.0.4", - "postcss-minify-gradients": "^5.0.6", - "postcss-minify-params": "^5.0.5", - "postcss-minify-selectors": "^5.1.3", - "postcss-normalize-charset": "^5.0.3", - "postcss-normalize-display-values": "^5.0.3", - "postcss-normalize-positions": "^5.0.4", - "postcss-normalize-repeat-style": "^5.0.4", - "postcss-normalize-string": "^5.0.4", - "postcss-normalize-timing-functions": "^5.0.3", - "postcss-normalize-unicode": "^5.0.4", - "postcss-normalize-url": "^5.0.5", - "postcss-normalize-whitespace": "^5.0.4", - "postcss-ordered-values": "^5.0.5", - "postcss-reduce-initial": "^5.0.3", - "postcss-reduce-transforms": "^5.0.4", - "postcss-svgo": "^5.0.4", - "postcss-unique-selectors": "^5.0.4" + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.1", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -4911,9 +4881,9 @@ } }, "node_modules/cssnano-utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.2.tgz", - "integrity": "sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -8727,9 +8697,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true, "engines": { "node": ">=10" @@ -9794,9 +9764,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10544,20 +10514,26 @@ } }, "node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-calc": { @@ -10574,9 +10550,9 @@ } }, "node_modules/postcss-colormin": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.5.tgz", - "integrity": "sha512-+X30aDaGYq81mFqwyPpnYInsZQnNpdxMX0ajlY7AExCexEFkPVV+KrO7kXwayqEWL2xwEbNQ4nUO0ZsRWGnevg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -10592,11 +10568,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.4.tgz", - "integrity": "sha512-bugzSAyjIexdObovsPZu/sBCTHccImJxLyFgeV0MmNBm/Lw5h5XnjfML6gzEmJ3A6nyfCW7hb1JXzcsA4Zfbdw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", + "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", "dev": true, "dependencies": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10607,9 +10584,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz", - "integrity": "sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10619,9 +10596,9 @@ } }, "node_modules/postcss-discard-duplicates": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz", - "integrity": "sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10631,9 +10608,9 @@ } }, "node_modules/postcss-discard-empty": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz", - "integrity": "sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10643,9 +10620,9 @@ } }, "node_modules/postcss-discard-overridden": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz", - "integrity": "sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10655,13 +10632,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.6.tgz", - "integrity": "sha512-rkmoPwQO6ymJSmWsX6l2hHeEBQa7C4kJb9jyi5fZB1sE8nSCv7sqchoYPixRwX/yvLoZP2y6FA5kcjiByeJqDg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.0.3" + "stylehacks": "^5.1.0" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10671,14 +10648,14 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.6.tgz", - "integrity": "sha512-nzJWJ9yXWp8AOEpn/HFAW72WKVGD2bsLiAmgw4hDchSij27bt6TF+sIK0cJUBAYT3SGcjtGGsOR89bwkkMuMgQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "dev": true, "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -10689,9 +10666,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.4.tgz", - "integrity": "sha512-RN6q3tyuEesvyCYYFCRGJ41J1XFvgV+dvYGHr0CeHv8F00yILlN8Slf4t8XW4IghlfZYCeyRrANO6HpJ948ieA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10704,13 +10681,13 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.6.tgz", - "integrity": "sha512-E/dT6oVxB9nLGUTiY/rG5dX9taugv9cbLNTFad3dKxOO+BQg25Q/xo2z2ddG+ZB1CbkZYaVwx5blY8VC7R/43A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10721,13 +10698,13 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.5.tgz", - "integrity": "sha512-YBNuq3Rz5LfLFNHb9wrvm6t859b8qIqfXsWeK7wROm3jSKNpO1Y5e8cOyBv6Acji15TgSrAwb3JkVNCqNyLvBg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "dev": true, "dependencies": { "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10738,9 +10715,9 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.3.tgz", - "integrity": "sha512-9RJfTiQEKA/kZhMaEXND893nBqmYQ8qYa/G+uPdVnXF6D/FzpfI6kwBtWEcHx5FqDbA79O9n6fQJfrIj6M8jvQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" @@ -10812,9 +10789,9 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz", - "integrity": "sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -10824,9 +10801,9 @@ } }, "node_modules/postcss-normalize-display-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.3.tgz", - "integrity": "sha512-FIV5FY/qs4Ja32jiDb5mVj5iWBlS3N8tFcw2yg98+8MkRgyhtnBgSC0lxU+16AMHbjX5fbSJgw5AXLMolonuRQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10839,9 +10816,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.4.tgz", - "integrity": "sha512-qynirjBX0Lc73ROomZE3lzzmXXTu48/QiEzKgMeqh28+MfuHLsuqC9po4kj84igZqqFGovz8F8hf44hA3dPYmQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10854,9 +10831,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.4.tgz", - "integrity": "sha512-Innt+wctD7YpfeDR7r5Ik6krdyppyAg2HBRpX88fo5AYzC1Ut/l3xaxACG0KsbX49cO2n5EB13clPwuYVt8cMA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10869,9 +10846,9 @@ } }, "node_modules/postcss-normalize-string": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.4.tgz", - "integrity": "sha512-Dfk42l0+A1CDnVpgE606ENvdmksttLynEqTQf5FL3XGQOyqxjbo25+pglCUvziicTxjtI2NLUR6KkxyUWEVubQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10884,9 +10861,9 @@ } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.3.tgz", - "integrity": "sha512-QRfjvFh11moN4PYnJ7hia4uJXeFotyK3t2jjg8lM9mswleGsNw2Lm3I5wO+l4k1FzK96EFwEVn8X8Ojrp2gP4g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10899,9 +10876,9 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.4.tgz", - "integrity": "sha512-W79Regn+a+eXTzB+oV/8XJ33s3pDyFTND2yDuUCo0Xa3QSy1HtNIfRVPXNubHxjhlqmMFADr3FSCHT84ITW3ig==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -10915,9 +10892,9 @@ } }, "node_modules/postcss-normalize-url": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.5.tgz", - "integrity": "sha512-Ws3tX+PcekYlXh+ycAt0wyzqGthkvVtZ9SZLutMVvHARxcpu4o7vvXcNoiNKyjKuWecnjS6HDI3fjBuDr5MQxQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, "dependencies": { "normalize-url": "^6.0.1", @@ -10931,9 +10908,9 @@ } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.4.tgz", - "integrity": "sha512-wsnuHolYZjMwWZJoTC9jeI2AcjA67v4UuidDrPN9RnX8KIZfE+r2Nd6XZRwHVwUiHmRvKQtxiqo64K+h8/imaw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -10946,12 +10923,12 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.5.tgz", - "integrity": "sha512-mfY7lXpq+8bDEHfP+muqibDPhZ5eP9zgBEF9XRvoQgXcQe2Db3G1wcvjbnfjXG6wYsl+0UIjikqq4ym1V2jGMQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", "dev": true, "dependencies": { - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10962,9 +10939,9 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.3.tgz", - "integrity": "sha512-c88TkSnQ/Dnwgb4OZbKPOBbCaauwEjbECP5uAuFPOzQ+XdjNjRH7SG0dteXrpp1LlIFEKK76iUGgmw2V0xeieA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -10978,9 +10955,9 @@ } }, "node_modules/postcss-reduce-transforms": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.4.tgz", - "integrity": "sha512-VIJB9SFSaL8B/B7AXb7KHL6/GNNbbCHslgdzS9UDfBZYIA2nx8NLY7iD/BXFSO/1sRUILzBTfHCoW5inP37C5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -11006,9 +10983,9 @@ } }, "node_modules/postcss-svgo": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.4.tgz", - "integrity": "sha512-yDKHvULbnZtIrRqhZoA+rxreWpee28JSRH/gy9727u0UCgtpv1M/9WEWY3xySlFa0zQJcqf6oCBJPR5NwkmYpg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", @@ -11022,9 +10999,9 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.4.tgz", - "integrity": "sha512-5ampwoSDJCxDPoANBIlMgoBcYUHnhaiuLYJR5pj1DLnYQvMRVyFuTA5C3Bvt+aHtiqWpJkD/lXT50Vo1D0ZsAQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" @@ -12410,6 +12387,15 @@ "websocket-driver": "^0.7.4" } }, + "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-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -12428,15 +12414,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/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/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -12729,9 +12706,9 @@ } }, "node_modules/stylehacks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.3.tgz", - "integrity": "sha512-ENcUdpf4yO0E1rubu8rkxI+JGQk4CgjchynZ4bDBJDfqdy+uhTRSWb8/F3Jtu+Bw5MW45Po3/aQGeIyyxgQtxg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -12954,15 +12931,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/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/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -13005,12 +12973,6 @@ "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", "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/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -17092,14 +17054,6 @@ "dev": true, "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "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 - } } }, "clean-webpack-plugin": { @@ -17591,13 +17545,11 @@ } }, "css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", "dev": true, - "requires": { - "timsort": "^0.3.0" - } + "requires": {} }, "css-loader": { "version": "6.7.1", @@ -17627,14 +17579,14 @@ } }, "css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", "dev": true, "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -17678,12 +17630,6 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } - }, - "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 } } }, @@ -17708,14 +17654,6 @@ "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } } }, "css-what": { @@ -17731,57 +17669,57 @@ "dev": true }, "cssnano": { - "version": "5.0.17", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.17.tgz", - "integrity": "sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", + "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", "dev": true, "requires": { - "cssnano-preset-default": "^5.1.12", + "cssnano-preset-default": "^5.2.9", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.12.tgz", - "integrity": "sha512-rO/JZYyjW1QNkWBxMGV28DW7d98UDLaF759frhli58QFehZ+D/LSmwQ2z/ylBAe2hUlsIWTq6NYGfQPq65EF9w==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", + "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", "dev": true, "requires": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.2", - "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.5", - "postcss-convert-values": "^5.0.4", - "postcss-discard-comments": "^5.0.3", - "postcss-discard-duplicates": "^5.0.3", - "postcss-discard-empty": "^5.0.3", - "postcss-discard-overridden": "^5.0.4", - "postcss-merge-longhand": "^5.0.6", - "postcss-merge-rules": "^5.0.6", - "postcss-minify-font-values": "^5.0.4", - "postcss-minify-gradients": "^5.0.6", - "postcss-minify-params": "^5.0.5", - "postcss-minify-selectors": "^5.1.3", - "postcss-normalize-charset": "^5.0.3", - "postcss-normalize-display-values": "^5.0.3", - "postcss-normalize-positions": "^5.0.4", - "postcss-normalize-repeat-style": "^5.0.4", - "postcss-normalize-string": "^5.0.4", - "postcss-normalize-timing-functions": "^5.0.3", - "postcss-normalize-unicode": "^5.0.4", - "postcss-normalize-url": "^5.0.5", - "postcss-normalize-whitespace": "^5.0.4", - "postcss-ordered-values": "^5.0.5", - "postcss-reduce-initial": "^5.0.3", - "postcss-reduce-transforms": "^5.0.4", - "postcss-svgo": "^5.0.4", - "postcss-unique-selectors": "^5.0.4" + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.1", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.2.tgz", - "integrity": "sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "dev": true, "requires": {} }, @@ -20723,9 +20661,9 @@ } }, "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true }, "line-height": { @@ -21441,9 +21379,9 @@ } }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "napi-build-utils": { "version": "1.0.2", @@ -22023,11 +21961,11 @@ "dev": true }, "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "requires": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -22043,9 +21981,9 @@ } }, "postcss-colormin": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.5.tgz", - "integrity": "sha512-+X30aDaGYq81mFqwyPpnYInsZQnNpdxMX0ajlY7AExCexEFkPVV+KrO7kXwayqEWL2xwEbNQ4nUO0ZsRWGnevg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -22055,99 +21993,100 @@ } }, "postcss-convert-values": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.4.tgz", - "integrity": "sha512-bugzSAyjIexdObovsPZu/sBCTHccImJxLyFgeV0MmNBm/Lw5h5XnjfML6gzEmJ3A6nyfCW7hb1JXzcsA4Zfbdw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", + "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", "dev": true, "requires": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" } }, "postcss-discard-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz", - "integrity": "sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", "dev": true, "requires": {} }, "postcss-discard-duplicates": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz", - "integrity": "sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "dev": true, "requires": {} }, "postcss-discard-empty": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz", - "integrity": "sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "dev": true, "requires": {} }, "postcss-discard-overridden": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz", - "integrity": "sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "dev": true, "requires": {} }, "postcss-merge-longhand": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.6.tgz", - "integrity": "sha512-rkmoPwQO6ymJSmWsX6l2hHeEBQa7C4kJb9jyi5fZB1sE8nSCv7sqchoYPixRwX/yvLoZP2y6FA5kcjiByeJqDg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.0.3" + "stylehacks": "^5.1.0" } }, "postcss-merge-rules": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.6.tgz", - "integrity": "sha512-nzJWJ9yXWp8AOEpn/HFAW72WKVGD2bsLiAmgw4hDchSij27bt6TF+sIK0cJUBAYT3SGcjtGGsOR89bwkkMuMgQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "dev": true, "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.4.tgz", - "integrity": "sha512-RN6q3tyuEesvyCYYFCRGJ41J1XFvgV+dvYGHr0CeHv8F00yILlN8Slf4t8XW4IghlfZYCeyRrANO6HpJ948ieA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.6.tgz", - "integrity": "sha512-E/dT6oVxB9nLGUTiY/rG5dX9taugv9cbLNTFad3dKxOO+BQg25Q/xo2z2ddG+ZB1CbkZYaVwx5blY8VC7R/43A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, "requires": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.5.tgz", - "integrity": "sha512-YBNuq3Rz5LfLFNHb9wrvm6t859b8qIqfXsWeK7wROm3jSKNpO1Y5e8cOyBv6Acji15TgSrAwb3JkVNCqNyLvBg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "dev": true, "requires": { "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.3.tgz", - "integrity": "sha512-9RJfTiQEKA/kZhMaEXND893nBqmYQ8qYa/G+uPdVnXF6D/FzpfI6kwBtWEcHx5FqDbA79O9n6fQJfrIj6M8jvQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -22190,61 +22129,61 @@ } }, "postcss-normalize-charset": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz", - "integrity": "sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "dev": true, "requires": {} }, "postcss-normalize-display-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.3.tgz", - "integrity": "sha512-FIV5FY/qs4Ja32jiDb5mVj5iWBlS3N8tFcw2yg98+8MkRgyhtnBgSC0lxU+16AMHbjX5fbSJgw5AXLMolonuRQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.4.tgz", - "integrity": "sha512-qynirjBX0Lc73ROomZE3lzzmXXTu48/QiEzKgMeqh28+MfuHLsuqC9po4kj84igZqqFGovz8F8hf44hA3dPYmQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.4.tgz", - "integrity": "sha512-Innt+wctD7YpfeDR7r5Ik6krdyppyAg2HBRpX88fo5AYzC1Ut/l3xaxACG0KsbX49cO2n5EB13clPwuYVt8cMA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.4.tgz", - "integrity": "sha512-Dfk42l0+A1CDnVpgE606ENvdmksttLynEqTQf5FL3XGQOyqxjbo25+pglCUvziicTxjtI2NLUR6KkxyUWEVubQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.3.tgz", - "integrity": "sha512-QRfjvFh11moN4PYnJ7hia4uJXeFotyK3t2jjg8lM9mswleGsNw2Lm3I5wO+l4k1FzK96EFwEVn8X8Ojrp2gP4g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.4.tgz", - "integrity": "sha512-W79Regn+a+eXTzB+oV/8XJ33s3pDyFTND2yDuUCo0Xa3QSy1HtNIfRVPXNubHxjhlqmMFADr3FSCHT84ITW3ig==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -22252,9 +22191,9 @@ } }, "postcss-normalize-url": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.5.tgz", - "integrity": "sha512-Ws3tX+PcekYlXh+ycAt0wyzqGthkvVtZ9SZLutMVvHARxcpu4o7vvXcNoiNKyjKuWecnjS6HDI3fjBuDr5MQxQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, "requires": { "normalize-url": "^6.0.1", @@ -22262,28 +22201,28 @@ } }, "postcss-normalize-whitespace": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.4.tgz", - "integrity": "sha512-wsnuHolYZjMwWZJoTC9jeI2AcjA67v4UuidDrPN9RnX8KIZfE+r2Nd6XZRwHVwUiHmRvKQtxiqo64K+h8/imaw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-ordered-values": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.5.tgz", - "integrity": "sha512-mfY7lXpq+8bDEHfP+muqibDPhZ5eP9zgBEF9XRvoQgXcQe2Db3G1wcvjbnfjXG6wYsl+0UIjikqq4ym1V2jGMQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", "dev": true, "requires": { - "cssnano-utils": "^3.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-reduce-initial": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.3.tgz", - "integrity": "sha512-c88TkSnQ/Dnwgb4OZbKPOBbCaauwEjbECP5uAuFPOzQ+XdjNjRH7SG0dteXrpp1LlIFEKK76iUGgmw2V0xeieA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -22291,9 +22230,9 @@ } }, "postcss-reduce-transforms": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.4.tgz", - "integrity": "sha512-VIJB9SFSaL8B/B7AXb7KHL6/GNNbbCHslgdzS9UDfBZYIA2nx8NLY7iD/BXFSO/1sRUILzBTfHCoW5inP37C5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -22310,9 +22249,9 @@ } }, "postcss-svgo": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.4.tgz", - "integrity": "sha512-yDKHvULbnZtIrRqhZoA+rxreWpee28JSRH/gy9727u0UCgtpv1M/9WEWY3xySlFa0zQJcqf6oCBJPR5NwkmYpg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", @@ -22320,9 +22259,9 @@ } }, "postcss-unique-selectors": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.4.tgz", - "integrity": "sha512-5ampwoSDJCxDPoANBIlMgoBcYUHnhaiuLYJR5pj1DLnYQvMRVyFuTA5C3Bvt+aHtiqWpJkD/lXT50Vo1D0ZsAQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -23404,6 +23343,12 @@ "websocket-driver": "^0.7.4" } }, + "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-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -23417,14 +23362,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } } }, "spdy": { @@ -23647,9 +23584,9 @@ } }, "stylehacks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.3.tgz", - "integrity": "sha512-ENcUdpf4yO0E1rubu8rkxI+JGQk4CgjchynZ4bDBJDfqdy+uhTRSWb8/F3Jtu+Bw5MW45Po3/aQGeIyyxgQtxg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -23805,12 +23742,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "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 } } }, @@ -23841,12 +23772,6 @@ "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", "dev": true }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", diff --git a/package.json b/package.json index d828c495..d3076435 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "copy-webpack-plugin": "^11.0.0", "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^3.4.1", + "css-minimizer-webpack-plugin": "^4.0.0", "eslint": "^8.16.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", From 9963f3f988b21c40722ee36c2930de2210acedbe Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Tue, 24 May 2022 20:07:11 +0530 Subject: [PATCH 141/824] Set minimum and maximum engine versions (#580) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d3076435..599b5e11 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Yet another matrix client", "main": "index.js", "engines": { - "npm": ">=6.14.11", - "node": ">=14.6.0" + "npm": ">=6.14.8 <8.5.5", + "node": ">=14.15.0 <17.9.0" }, "scripts": { "start": "webpack serve --config ./webpack.dev.js --open", From 95b814b751394b742978365af385f4008b61539a Mon Sep 17 00:00:00 2001 From: Matt Corallo <649246+TheBlueMatt@users.noreply.github.com> Date: Thu, 26 May 2022 07:47:41 -0700 Subject: [PATCH 142/824] Reduce third-party build script dependencies and reduce GITHUB_TOKEN perms in CI (#541) * Reduce dependence on third-party build scripts in release pipeline This removes one third-party build script from the release pipeline for the release tar.gz, though one is still used in the now-separate netlify deploy. * Reduce GITHUB_TOKEN perms in actions when using 3rd party scripts This avoids allowing third parties to arbitrarily overwrite the repository. * Replace PGP signing action with the bash script from the same The PGP signing action ultimately just calls gpg with arguments set in https://github.com/actionhippie/gpgsign/blob/v1/overlay/usr/local/bin/entrypoint so its rather trivial to simply take the required arguments and put them directly in CI. This is substantially safer than the PGP signing action used as the action currently downloads, unverified and un-pinned, a docker image in order to access PGP. --- .github/workflows/deploy-pull-request.yml | 3 ++ .github/workflows/netlify-dev.yml | 3 +- .github/workflows/prod-deploy.yml | 54 +++++++++++++++-------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 84098f24..77801b1e 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -6,6 +6,9 @@ on: - completed jobs: get-build-and-deploy: + permissions: + contents: read + pull-requests: write runs-on: ubuntu-latest if: > ${{ github.event.workflow_run.conclusion == 'success' }} diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 2c36f79f..bd9d163c 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -9,7 +9,8 @@ jobs: deploy-to-netlify: name: 'Deploy' runs-on: ubuntu-latest - + permissions: + contents: read steps: - name: Checkout repository uses: actions/checkout@v3.0.2 diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 0f790ff4..127a2f56 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -5,9 +5,43 @@ on: types: [published] jobs: + create-release: + name: 'Create release tar' + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v3.0.2 + - name: Build + run: | + npm ci + npm run build + - name: Get version from tag + id: vars + run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} + - name: Create tar.gz + run: tar -czvf cinny-${{ steps.vars.outputs.tag }}.tar.gz dist + - name: Sign tar.gz + run: | + echo '${{ secrets.GNUPG_KEY }}' | gpg --batch --import + # Sadly a few lines in the private key match a few lines in the public key, + # As a result just --export --armor gives us a few lines replaced with *** + # making it useless for importing the signing key. Instead, we dump it as + # non-armored and hex-encode it so that its printable. + echo "PGP Signing key, in raw PGP format in hex. Import with cat ... | xxd -r -p - | gpg --import" + gpg --export | xxd -p + echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz + - name: Upload tagged release + uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 + with: + files: | + cinny-${{ steps.vars.outputs.tag }}.tar.gz + cinny-${{ steps.vars.outputs.tag }}.tar.gz.asc + deploy-to-netlify: name: 'Deploy to Netlify' runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout repository uses: actions/checkout@v3.0.2 @@ -20,28 +54,12 @@ jobs: BUILD_DIRECTORY: "dist" NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" NETLIFY_DEPLOY_TO_PROD: true - - name: Get version from tag - id: vars - run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} - - name: Create tar.gz - run: tar -czvf cinny-${{ steps.vars.outputs.tag }}.tar.gz dist - - name: Sign tar.gz - uses: actionhippie/gpgsign@4e28208b142cae93e1582401dcda1cf79e4f72c0 - with: - private_key: ${{ secrets.GNUPG_KEY }} - passphrase: ${{ secrets.GNUPG_PASSPHRASE }} - detach_sign: true - files: cinny-${{ steps.vars.outputs.tag }}.tar.gz - - name: Upload tagged release - uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 - with: - files: | - cinny-${{ steps.vars.outputs.tag }}.tar.gz - cinny-${{ steps.vars.outputs.tag }}.tar.gz.asc push_to_dockerhub: name: Push Docker image to Docker Hub runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout repository uses: actions/checkout@v3.0.2 From 2ca67bb61a086af8931f4a2bf50b254ad0e0b766 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 26 May 2022 20:20:28 +0530 Subject: [PATCH 143/824] Consistent job naming --- .github/workflows/prod-deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 127a2f56..c4903568 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -5,11 +5,11 @@ on: types: [published] jobs: - create-release: + create-release-tar: name: 'Create release tar' runs-on: ubuntu-latest steps: - - name: Check out the repo + - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Build run: | @@ -55,7 +55,7 @@ jobs: NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" NETLIFY_DEPLOY_TO_PROD: true - push_to_dockerhub: + push-to-dockerhub: name: Push Docker image to Docker Hub runs-on: ubuntu-latest permissions: From 38b604ad41e8a7c28554df924e5965657fecea7b Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 27 May 2022 13:09:36 +0530 Subject: [PATCH 144/824] Add PGP public key and fix engine versions in package.json (#583) * nodejs 17.9.0 also works * Add github sponser link * Add Public PGP key of signed tarball * Update README.md * Add download badge also. * Add docker pulls --- .github/FUNDING.yml | 3 +- README.md | 84 ++++++++++++++++++++++++++++++++++++--------- package.json | 4 +-- 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 2189f7f4..e24e8dcf 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,3 @@ +github: ajbura +liberapay: ajbura open_collective: cinny -liberapay: ajbura \ No newline at end of file diff --git a/README.md b/README.md index b35e5975..94a6e56b 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,27 @@ -# Cinny +

    + + Cinny +

    +

    + + GitHub all releases + + GitHub all releases + + + + + + +

    -[![Star](https://img.shields.io/github/stars/ajbura/cinny)](https://github.com/ajbura/cinny/tree/dev) -[![Chat](https://img.shields.io/badge/chat-on%20matrix-orange)](https://matrix.to/#/#cinny:matrix.org) -[![Twitter](https://img.shields.io/twitter/url?url=https://twitter.com/@cinnyapp)](https://twitter.com/@cinnyapp) -[![Support](https://img.shields.io/badge/sponsor-open%20collective-blue.svg)](https://opencollective.com/cinny) +**Cinny** is a Matrix client focusing primarily on simple, elegant and secure interface. The main goal is to have a client that is easy on end user +and feels a modern chat application. -## Table of Contents - -- [About](#about) -- [Getting Started](https://cinny.in) - [Contributing](./CONTRIBUTING.md) - [Roadmap](https://github.com/ajbura/cinny/projects/11) -## About - -Cinny is a [Matrix](https://matrix.org) client focusing primarily on simple, elegant and secure interface. - -![preview](https://github.com/cinnyapp/cinny-site/blob/main/assets/preview-light.png) - ## Building and Running ### Running pre-compiled @@ -25,6 +29,54 @@ Cinny is a [Matrix](https://matrix.org) client focusing primarily on simple, ele A tarball of pre-compiled version of the app is provided with each [release](https://github.com/ajbura/cinny/releases). You can serve the application with a webserver of your choosing by simply copying `dist/` directory to the webroot. +
    +PGP Public Key to verify pre-compiled tarball + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +UeGsouhyuITLwEhScounZDqop+Dx +=Zg+6 +-----END PGP PUBLIC KEY BLOCK----- +``` +
    + ### Building from source > We recommend using a version manager as versions change very quickly. You will likely need to switch between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Also recommended nodejs version is 16.15.0 LTS. @@ -38,7 +90,7 @@ npm run build # Compiles the app into the dist/ directory You can then copy the files to a webserver's webroot of your choice. -To serve a development version of the app locally for testing, you may also use the command `npm start`. +To serve a development version of the app locally for testing, you need to use the command `npm start`. ### Running with Docker diff --git a/package.json b/package.json index 599b5e11..72d65bc8 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Yet another matrix client", "main": "index.js", "engines": { - "npm": ">=6.14.8 <8.5.5", - "node": ">=14.15.0 <17.9.0" + "npm": ">=6.14.8 <=8.5.5", + "node": ">=14.15.0 <=17.9.0" }, "scripts": { "start": "webpack serve --config ./webpack.dev.js --open", From fd680a93e0818103511814050a3fcaf45bd7f8d5 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 27 May 2022 14:09:53 +0530 Subject: [PATCH 145/824] Add alt text to sheilds --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 94a6e56b..101de850 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,15 @@

    - GitHub all releases + GitHub release downloads - GitHub all releases + DockerHub downloads - + Follow on Mastodon - + Follow on Twitter - + Sponsor Cinny

    **Cinny** is a Matrix client focusing primarily on simple, elegant and secure interface. The main goal is to have a client that is easy on end user From fa6c8650006e00fff5ca66c0d1a6d96d9b162b9d Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sat, 28 May 2022 18:29:15 +0530 Subject: [PATCH 146/824] Update typo in string (#586) --- src/app/molecules/room-notification/RoomNotification.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/room-notification/RoomNotification.jsx b/src/app/molecules/room-notification/RoomNotification.jsx index 0a3619f1..1c088e5f 100644 --- a/src/app/molecules/room-notification/RoomNotification.jsx +++ b/src/app/molecules/room-notification/RoomNotification.jsx @@ -20,7 +20,7 @@ const items = [{ type: cons.notifs.DEFAULT, }, { iconSrc: BellRingIC, - text: 'All message', + text: 'All messages', type: cons.notifs.ALL_MESSAGES, }, { iconSrc: BellPingIC, From d3431a5d53ff0bf765edd412fd88154786a8219b Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 29 May 2022 09:36:46 +0530 Subject: [PATCH 147/824] Fix emoji autocomplete in some cases (#565) --- src/app/organisms/emoji-board/recent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/emoji-board/recent.js b/src/app/organisms/emoji-board/recent.js index d175f26c..dff67fb0 100644 --- a/src/app/organisms/emoji-board/recent.js +++ b/src/app/organisms/emoji-board/recent.js @@ -4,7 +4,7 @@ import { emojis } from './emoji'; const eventType = 'io.element.recent_emoji'; function getRecentEmojisRaw() { - return initMatrix.matrixClient.getAccountData(eventType).getContent().recent_emoji ?? []; + return initMatrix.matrixClient.getAccountData(eventType)?.getContent().recent_emoji ?? []; } export function getRecentEmojis(limit) { From 7165bd91cd7c451fd6490282302e4efbd7f862cc Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 29 May 2022 09:47:30 +0530 Subject: [PATCH 148/824] Don't show verify button if CS is not enable --- src/app/organisms/settings/DeviceManage.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index dad5b96d..062ec021 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -155,6 +155,7 @@ function DeviceManage() { const lastIP = device.last_seen_ip; const lastTS = device.last_seen_ts; const isCurrentDevice = mx.deviceId === deviceId; + const canVerify = isVerified === false && (isMeVerified || isCurrentDevice); return ( : ( <> - {((isMeVerified && isVerified === false) || (isCurrentDevice && isVerified === false)) && } + {(isCSEnabled && canVerify) && } handleRename(device)} src={PencilIC} tooltip="Rename" /> handleRemove(device)} src={BinIC} tooltip="Remove session" /> From d0fd654bf7e02c5952449927222a4fe0197dd9a2 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 29 May 2022 10:15:31 +0530 Subject: [PATCH 149/824] Add support for building docker image for linux/arm64 (#494) * Update docker-pr.yml * setup docker build for linux/arm64 * Update prod-deploy.yml * Apply PR suggestion --- .github/workflows/prod-deploy.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index c4903568..39ef611e 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -63,6 +63,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3.0.2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1.2.0 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1.6.0 - name: Login to Docker Hub uses: docker/login-action@v2.0.0 with: @@ -77,6 +81,7 @@ jobs: uses: docker/build-push-action@v3.0.0 with: context: . + platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} From f05037c7d6b7635b32f529b97dfaeb566cd9e838 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 29 May 2022 10:48:20 +0530 Subject: [PATCH 150/824] v2.0.4 (#590) --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1145511..fdabc93b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.0.3", + "version": "2.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.0.3", + "version": "2.0.4", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.10", diff --git a/package.json b/package.json index 72d65bc8..c2ab24ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.0.3", + "version": "2.0.4", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index b6021125..49d32a84 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.0.3', + version: '2.0.4', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 5fd7d64d214aabc9769f926900ff60ecc523dca8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:24:43 +0530 Subject: [PATCH 151/824] Bump docker/setup-qemu-action from 1.2.0 to 2.0.0 (#596) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 1.2.0 to 2.0.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v1.2.0...v2.0.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 39ef611e..919944e1 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -64,7 +64,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Set up QEMU - uses: docker/setup-qemu-action@v1.2.0 + uses: docker/setup-qemu-action@v2.0.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1.6.0 - name: Login to Docker Hub From e998438135af1a5a67c9132dbaad9ae03ad1e86a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:28:18 +0530 Subject: [PATCH 152/824] Bump docker/setup-buildx-action from 1.6.0 to 2.0.0 (#595) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1.6.0 to 2.0.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v1.6.0...v2.0.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 919944e1..12778546 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -66,7 +66,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1.6.0 + uses: docker/setup-buildx-action@v2.0.0 - name: Login to Docker Hub uses: docker/login-action@v2.0.0 with: From 63ab96b71b7044890522729234af2417045bd874 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:30:58 +0530 Subject: [PATCH 153/824] Bump html-react-parser from 1.4.12 to 1.4.14 (#598) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 1.4.12 to 1.4.14. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v1.4.12...v1.4.14) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdabc93b..e41c861a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.12", + "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.2.0", @@ -79,8 +79,8 @@ "webpack-merge": "^5.7.3" }, "engines": { - "node": ">=14.6.0", - "npm": ">=6.14.11" + "node": ">=14.15.0 <=17.9.0", + "npm": ">=6.14.8 <=8.5.5" } }, "node_modules/@ampproject/remapping": { @@ -7335,14 +7335,14 @@ } }, "node_modules/html-react-parser": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.12.tgz", - "integrity": "sha512-nqYQzr4uXh67G9ejAG7djupTHmQvSTgjY83zbXLRfKHJ0F06751jXx6WKSFARDdXxCngo2/7H4Rwtfeowql4gQ==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz", + "integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==", "dependencies": { "domhandler": "4.3.1", "html-dom-parser": "1.2.0", "react-property": "2.0.0", - "style-to-js": "1.1.0" + "style-to-js": "1.1.1" }, "peerDependencies": { "react": "0.14 || 15 || 16 || 17 || 18" @@ -12690,9 +12690,9 @@ } }, "node_modules/style-to-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz", - "integrity": "sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz", + "integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==", "dependencies": { "style-to-object": "0.3.0" } @@ -19638,14 +19638,14 @@ } }, "html-react-parser": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.12.tgz", - "integrity": "sha512-nqYQzr4uXh67G9ejAG7djupTHmQvSTgjY83zbXLRfKHJ0F06751jXx6WKSFARDdXxCngo2/7H4Rwtfeowql4gQ==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz", + "integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==", "requires": { "domhandler": "4.3.1", "html-dom-parser": "1.2.0", "react-property": "2.0.0", - "style-to-js": "1.1.0" + "style-to-js": "1.1.1" } }, "html-webpack-plugin": { @@ -23568,9 +23568,9 @@ "requires": {} }, "style-to-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz", - "integrity": "sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz", + "integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==", "requires": { "style-to-object": "0.3.0" } diff --git a/package.json b/package.json index c2ab24ce..5b87b7e8 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.12", + "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^17.2.0", From e8587f99c92534754159e4a25518512b8a094c08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:32:06 +0530 Subject: [PATCH 154/824] Bump sass from 1.52.1 to 1.52.2 (#599) Bumps [sass](https://github.com/sass/dart-sass) from 1.52.1 to 1.52.2. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.52.1...1.52.2) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e41c861a..0b01c62c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.52.1", + "sass": "^1.52.2", "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11955,9 +11955,9 @@ } }, "node_modules/sass": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", - "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", + "version": "1.52.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", + "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23008,9 +23008,9 @@ } }, "sass": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", - "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", + "version": "1.52.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", + "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 5b87b7e8..e56a0bfd 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.52.1", + "sass": "^1.52.2", "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 299d9766227aabc7e241de11bc0456ead1869c16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:33:39 +0530 Subject: [PATCH 155/824] Bump webpack-dev-server from 4.9.0 to 4.9.1 (#600) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.9.0...v4.9.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 63 ++++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b01c62c..cd59fe1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,7 @@ "util": "^0.12.4", "webpack": "^5.72.1", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.1", "webpack-merge": "^5.7.3" }, "engines": { @@ -7412,9 +7412,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", "dev": true }, "node_modules/http-proxy": { @@ -12377,16 +12377,25 @@ } }, "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13646,9 +13655,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", - "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13675,7 +13684,7 @@ "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" @@ -19692,9 +19701,9 @@ } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", "dev": true }, "http-proxy": { @@ -23333,14 +23342,22 @@ "dev": true }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "source-map": { @@ -24302,9 +24319,9 @@ } }, "webpack-dev-server": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", - "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -24331,7 +24348,7 @@ "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" diff --git a/package.json b/package.json index e56a0bfd..7cab591d 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "util": "^0.12.4", "webpack": "^5.72.1", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.1", "webpack-merge": "^5.7.3" } } From c410d4e9f5823259821c0b0cf352f2f9b5911ccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:51:10 +0530 Subject: [PATCH 156/824] Bump eslint from 8.16.0 to 8.17.0 (#602) Bumps [eslint](https://github.com/eslint/eslint) from 8.16.0 to 8.17.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.16.0...v8.17.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd59fe1e..eb3413d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -5580,9 +5580,9 @@ } }, "node_modules/eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", @@ -18274,9 +18274,9 @@ "dev": true }, "eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", diff --git a/package.json b/package.json index 7cab591d..66edbc9c 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From 315b5a10484d10ec2ec8e6088cc3a24190186b05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:52:17 +0530 Subject: [PATCH 157/824] Bump webpack from 5.72.1 to 5.73.0 (#601) Bumps [webpack](https://github.com/webpack/webpack) from 5.72.1 to 5.73.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.72.1...v5.73.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb3413d0..f6e9fbcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.9.1", "webpack-merge": "^5.7.3" @@ -13480,9 +13480,9 @@ } }, "node_modules/webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -24185,9 +24185,9 @@ } }, "webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 66edbc9c..50f16cb5 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.9.1", "webpack-merge": "^5.7.3" From af6e6bfc67490ede624975efa9e4d4536a1c2559 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:53:30 +0530 Subject: [PATCH 158/824] Bump @babel/core from 7.18.0 to 7.18.2 (#592) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.0 to 7.18.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 138 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 67 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6e9fbcb..bfa0b656 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.0", + "@babel/core": "^7.18.2", "@babel/preset-env": "^7.18.0", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", @@ -117,21 +117,21 @@ } }, "node_modules/@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", + "@babel/helpers": "^7.18.2", "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -147,12 +147,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -186,9 +186,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", @@ -260,13 +260,10 @@ } }, "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==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } @@ -472,14 +469,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" @@ -1746,19 +1743,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1767,9 +1764,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -14052,21 +14049,21 @@ "dev": true }, "@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", + "@babel/helpers": "^7.18.2", "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14075,12 +14072,12 @@ } }, "@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, "requires": { - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } @@ -14105,9 +14102,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", @@ -14158,13 +14155,10 @@ } }, "@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" - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", @@ -14319,14 +14313,14 @@ } }, "@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { @@ -15180,27 +15174,27 @@ } }, "@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", diff --git a/package.json b/package.json index 50f16cb5..3f84bcee 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.0", + "@babel/core": "^7.18.2", "@babel/preset-env": "^7.18.0", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", From ba39724813dd3a8c6c05abebd0abf4bb72bf5d94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Jun 2022 10:14:37 +0530 Subject: [PATCH 159/824] Bump @babel/preset-env from 7.18.0 to 7.18.2 (#594) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.0 to 7.18.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 78 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfa0b656..0a952b2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@babel/core": "^7.18.2", - "@babel/preset-env": "^7.18.0", + "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -400,12 +400,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" @@ -1236,14 +1236,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", - "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1508,9 +1508,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", - "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -1569,13 +1569,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", - "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", @@ -1620,12 +1620,12 @@ "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.17.12", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", "@babel/plugin-transform-modules-systemjs": "^7.18.0", "@babel/plugin-transform-modules-umd": "^7.18.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", @@ -1638,12 +1638,12 @@ "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-template-literals": "^7.18.2", "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -14262,12 +14262,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -14813,14 +14813,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", - "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" } }, @@ -14983,9 +14983,9 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", - "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" @@ -15020,13 +15020,13 @@ } }, "@babel/preset-env": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", - "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", @@ -15071,12 +15071,12 @@ "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.17.12", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", "@babel/plugin-transform-modules-systemjs": "^7.18.0", "@babel/plugin-transform-modules-umd": "^7.18.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", @@ -15089,12 +15089,12 @@ "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-template-literals": "^7.18.2", "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", diff --git a/package.json b/package.json index 3f84bcee..9bd341a7 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@babel/core": "^7.18.2", - "@babel/preset-env": "^7.18.0", + "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", From 0d121447446db8a281d066637be49db5e22d4918 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Jun 2022 10:32:15 +0530 Subject: [PATCH 160/824] Bump matrix-js-sdk from 17.2.0 to 18.0.0 (#591) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 17.2.0 to 18.0.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v17.2.0...v18.0.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a952b2a..74aa7270 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.2.0", + "matrix-js-sdk": "^18.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", @@ -8895,9 +8895,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.2.0.tgz", - "integrity": "sha512-/IrgHCSVUZNVcKoPO20OF9Xog9X79a1ckmR7FwF5lSTNdmC7eQvU0XcFYCi5IXo57du+im69lEw8dLbPngZhoQ==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.0.0.tgz", + "integrity": "sha512-P7PI2nQs7BfjkEATgVtQK3ix1DqIYBiDsVo9nSwJcG2vqq+Mf2PnnuPtU6/ZQBoUNhMbFCd8XCaxsPnE6XqnEA==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -20826,9 +20826,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-17.2.0.tgz", - "integrity": "sha512-/IrgHCSVUZNVcKoPO20OF9Xog9X79a1ckmR7FwF5lSTNdmC7eQvU0XcFYCi5IXo57du+im69lEw8dLbPngZhoQ==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.0.0.tgz", + "integrity": "sha512-P7PI2nQs7BfjkEATgVtQK3ix1DqIYBiDsVo9nSwJcG2vqq+Mf2PnnuPtU6/ZQBoUNhMbFCd8XCaxsPnE6XqnEA==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 9bd341a7..6393b748 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^17.2.0", + "matrix-js-sdk": "^18.0.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", From 371e66a6dfc53a1ec1bc8d31ce134f530e0f5ac2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:08:55 +0530 Subject: [PATCH 161/824] Bump @fontsource/inter from 4.5.10 to 4.5.11 (#619) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.10 to 4.5.11. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74aa7270..842a9dfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.4", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.10", + "@fontsource/inter": "^4.5.11", "@fontsource/roboto": "^4.5.7", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", @@ -1821,9 +1821,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.10.tgz", - "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" + "version": "4.5.11", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.11.tgz", + "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" }, "node_modules/@fontsource/roboto": { "version": "4.5.7", @@ -15236,9 +15236,9 @@ } }, "@fontsource/inter": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.10.tgz", - "integrity": "sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==" + "version": "4.5.11", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.11.tgz", + "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" }, "@fontsource/roboto": { "version": "4.5.7", diff --git a/package.json b/package.json index 6393b748..a2b99c69 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.10", + "@fontsource/inter": "^4.5.11", "@fontsource/roboto": "^4.5.7", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", From eef2d451b7a1332fa41d360aaa6dfbc29072beb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:09:32 +0530 Subject: [PATCH 162/824] Bump webpack-dev-server from 4.9.1 to 4.9.2 (#617) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.9.1 to 4.9.2. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.9.1...v4.9.2) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++++------- package.json | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 842a9dfa..7eedd84c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,7 @@ "util": "^0.12.4", "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.1", + "webpack-dev-server": "^4.9.2", "webpack-merge": "^5.7.3" }, "engines": { @@ -13652,15 +13652,16 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", + "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -24313,15 +24314,16 @@ } }, "webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", + "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", diff --git a/package.json b/package.json index a2b99c69..89da1f6c 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "util": "^0.12.4", "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.1", + "webpack-dev-server": "^4.9.2", "webpack-merge": "^5.7.3" } } From 8b96e0ab982a6a45c15f9541355c06ae64a7d6ee Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 14 Jun 2022 19:55:48 +0530 Subject: [PATCH 163/824] Fix nodejs version in actions (#627) * Update prod-deploy.yml * Update netlify-dev.yml * Update build-pull-request.yml * Update build-pull-request.yml * Update netlify-dev.yml * Update prod-deploy.yml Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++++ .github/workflows/netlify-dev.yml | 4 ++++ .github/workflows/prod-deploy.yml | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index e5102a3a..e57acd9e 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,6 +12,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3.0.2 + - name: Setup node + uses: actions/setup-node@v3.3.0 + with: + node-version: 17.9.0 - name: Build app run: npm ci && npm run build - name: Upload artifact diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index bd9d163c..a1646954 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -14,6 +14,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3.0.2 + - name: Setup node + uses: actions/setup-node@v3.3.0 + with: + node-version: 17.9.0 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@fb6a5f936a4b06a8f7793e69fc5a022ffe39807a with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 12778546..4d05c68a 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -11,6 +11,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3.0.2 + - name: Setup node + uses: actions/setup-node@v3.3.0 + with: + node-version: 17.9.0 - name: Build run: | npm ci @@ -45,6 +49,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3.0.2 + - name: Setup node + uses: actions/setup-node@v3.3.0 + with: + node-version: 17.9.0 - name: Build and deploy to Netlify uses: jsmrcaga/action-netlify-deploy@fb6a5f936a4b06a8f7793e69fc5a022ffe39807a with: From a3f5b9248494ff79ef3fbb16a917134ecaacece1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jun 2022 19:59:42 +0530 Subject: [PATCH 164/824] Bump @babel/core from 7.18.2 to 7.18.5 (#625) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.2 to 7.18.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.5/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 58 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7eedd84c..bdf6aab2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.2", + "@babel/core": "^7.18.5", "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", @@ -117,9 +117,9 @@ } }, "node_modules/@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -128,10 +128,10 @@ "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", + "@babel/parser": "^7.18.5", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -497,9 +497,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", + "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1743,9 +1743,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", + "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -1754,8 +1754,8 @@ "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/types": "^7.18.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -14050,9 +14050,9 @@ "dev": true }, "@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", @@ -14061,10 +14061,10 @@ "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", + "@babel/parser": "^7.18.5", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14336,9 +14336,9 @@ } }, "@babel/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", + "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15175,9 +15175,9 @@ } }, "@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", + "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -15186,8 +15186,8 @@ "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/types": "^7.18.4", "debug": "^4.1.0", "globals": "^11.1.0" } diff --git a/package.json b/package.json index 89da1f6c..69d6120c 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.2", + "@babel/core": "^7.18.5", "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", From d9e1fb620b5a9561f4a3de4833c8808738830658 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jun 2022 20:12:27 +0530 Subject: [PATCH 165/824] Bump matrix-js-sdk from 18.0.0 to 18.1.0 (#624) * Bump matrix-js-sdk from 18.0.0 to 18.1.0 Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 18.0.0 to 18.1.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v18.0.0...v18.1.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Replace with stable function Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- src/app/molecules/room-aliases/RoomAliases.jsx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdf6aab2..e7915fe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^18.0.0", + "matrix-js-sdk": "^18.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", @@ -8895,9 +8895,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.0.0.tgz", - "integrity": "sha512-P7PI2nQs7BfjkEATgVtQK3ix1DqIYBiDsVo9nSwJcG2vqq+Mf2PnnuPtU6/ZQBoUNhMbFCd8XCaxsPnE6XqnEA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.1.0.tgz", + "integrity": "sha512-O5D36paIsY7a2M2mOo7KKU7v1Mb3PVkmYKupXYcXd9gB/Ki1K4mds+vSDEhgkKyKwk6MK1AV/vgvp0xJCsttvg==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -20827,9 +20827,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.0.0.tgz", - "integrity": "sha512-P7PI2nQs7BfjkEATgVtQK3ix1DqIYBiDsVo9nSwJcG2vqq+Mf2PnnuPtU6/ZQBoUNhMbFCd8XCaxsPnE6XqnEA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.1.0.tgz", + "integrity": "sha512-O5D36paIsY7a2M2mOo7KKU7v1Mb3PVkmYKupXYcXd9gB/Ki1K4mds+vSDEhgkKyKwk6MK1AV/vgvp0xJCsttvg==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 69d6120c..7099bf86 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "html-react-parser": "^1.4.14", "katex": "^0.15.6", "linkifyjs": "^2.1.9", - "matrix-js-sdk": "^18.0.0", + "matrix-js-sdk": "^18.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", diff --git a/src/app/molecules/room-aliases/RoomAliases.jsx b/src/app/molecules/room-aliases/RoomAliases.jsx index 4fa2b3ae..201c523a 100644 --- a/src/app/molecules/room-aliases/RoomAliases.jsx +++ b/src/app/molecules/room-aliases/RoomAliases.jsx @@ -118,7 +118,7 @@ function RoomAliases({ roomId }) { const loadLocalAliases = async () => { let local = []; try { - const result = await mx.unstableGetLocalAliases(roomId); + const result = await mx.getLocalAliases(roomId); local = result.aliases.filter((alias) => !aliases.published.includes(alias)); } catch { local = []; From 58c3eee153db943313064605a650db56cd7eaaf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jun 2022 20:15:14 +0530 Subject: [PATCH 166/824] Bump sass from 1.52.2 to 1.52.3 (#623) Bumps [sass](https://github.com/sass/dart-sass) from 1.52.2 to 1.52.3. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.52.2...1.52.3) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7915fe0..e1e78cd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.52.2", + "sass": "^1.52.3", "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11952,9 +11952,9 @@ } }, "node_modules/sass": { - "version": "1.52.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", - "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", + "version": "1.52.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", + "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23012,9 +23012,9 @@ } }, "sass": { - "version": "1.52.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", - "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", + "version": "1.52.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", + "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 7099bf86..777550f7 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.0", "path-browserify": "^1.0.1", - "sass": "^1.52.2", + "sass": "^1.52.3", "sass-loader": "^13.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 217f29f068f6513c6547f292bb71f8da0bbe8b1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jun 2022 20:18:38 +0530 Subject: [PATCH 167/824] Bump webpack-cli from 4.9.2 to 4.10.0 (#622) Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.9.2 to 4.10.0. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.9.2...webpack-cli@4.10.0) --- updated-dependencies: - dependency-name: webpack-cli dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 70 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1e78cd1..43d73f0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,7 @@ "url": "^0.11.0", "util": "^0.12.4", "webpack": "^5.73.0", - "webpack-cli": "^4.9.2", + "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.9.2", "webpack-merge": "^5.7.3" }, @@ -2854,9 +2854,9 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "dev": true, "peerDependencies": { "webpack": "4.x.x || 5.x.x", @@ -2864,9 +2864,9 @@ } }, "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", "dev": true, "dependencies": { "envinfo": "^7.7.3" @@ -2876,9 +2876,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true, "peerDependencies": { "webpack-cli": "4.x.x" @@ -13524,18 +13524,18 @@ } }, "node_modules/webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", "colorette": "^2.0.14", "commander": "^7.0.0", - "execa": "^5.0.0", + "cross-spawn": "^7.0.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", @@ -13548,6 +13548,10 @@ "engines": { "node": ">=10.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "4.x.x || 5.x.x" }, @@ -16123,25 +16127,25 @@ } }, "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true, "requires": {} }, @@ -24232,18 +24236,18 @@ } }, "webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", "colorette": "^2.0.14", "commander": "^7.0.0", - "execa": "^5.0.0", + "cross-spawn": "^7.0.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", diff --git a/package.json b/package.json index 777550f7..d409d0ea 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "url": "^0.11.0", "util": "^0.12.4", "webpack": "^5.73.0", - "webpack-cli": "^4.9.2", + "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.9.2", "webpack-merge": "^5.7.3" } From 2d3634d6bfe28e203ca5d3731fff1fddbdde3edf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jun 2022 20:19:46 +0530 Subject: [PATCH 168/824] Bump jsmrcaga/action-netlify-deploy from 1.7.2 to 1.8.0 (#618) Bumps [jsmrcaga/action-netlify-deploy](https://github.com/jsmrcaga/action-netlify-deploy) from 1.7.2 to 1.8.0. - [Release notes](https://github.com/jsmrcaga/action-netlify-deploy/releases) - [Commits](https://github.com/jsmrcaga/action-netlify-deploy/compare/fb6a5f936a4b06a8f7793e69fc5a022ffe39807a...53de32e559b0b3833615b9788c7a090cd2fddb03) --- updated-dependencies: - dependency-name: jsmrcaga/action-netlify-deploy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index a1646954..8def7fa0 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -19,7 +19,7 @@ jobs: with: node-version: 17.9.0 - name: Build and deploy to Netlify - uses: jsmrcaga/action-netlify-deploy@fb6a5f936a4b06a8f7793e69fc5a022ffe39807a + uses: jsmrcaga/action-netlify-deploy@53de32e559b0b3833615b9788c7a090cd2fddb03 with: install_command: "npm ci" NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 4d05c68a..d6a3e0c7 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -54,7 +54,7 @@ jobs: with: node-version: 17.9.0 - name: Build and deploy to Netlify - uses: jsmrcaga/action-netlify-deploy@fb6a5f936a4b06a8f7793e69fc5a022ffe39807a + uses: jsmrcaga/action-netlify-deploy@53de32e559b0b3833615b9788c7a090cd2fddb03 with: install_command: "npm ci" NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} From 8c1c3cd634db1f331e069a7a05dfe87e8fc681a5 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 15 Jun 2022 12:07:14 +0530 Subject: [PATCH 169/824] Fix mozilla homerserver domain (#199) (#629) --- config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.json b/config.json index e7f9eea3..c647dbb4 100644 --- a/config.json +++ b/config.json @@ -6,7 +6,7 @@ "halogen.city", "kde.org", "matrix.org", - "chat.mozilla.org" + "mozilla.org" ], "allowCustomHomeservers": true -} \ No newline at end of file +} From 57ab10a87c7ba4f4df0e9a6268cf95e66ef95180 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:28:44 +0530 Subject: [PATCH 170/824] Bump eslint from 8.17.0 to 8.18.0 (#638) Bumps [eslint](https://github.com/eslint/eslint) from 8.17.0 to 8.18.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.17.0...v8.18.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43d73f0c..4129948b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.17.0", + "eslint": "^8.18.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", @@ -5577,9 +5577,9 @@ } }, "node_modules/eslint": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", - "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", + "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", @@ -18273,9 +18273,9 @@ "dev": true }, "eslint": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", - "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", + "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", diff --git a/package.json b/package.json index d409d0ea..9deb3630 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.17.0", + "eslint": "^8.18.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", From a142ade9239ba19b7a2b8ca2da78016c4f810fdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:30:23 +0530 Subject: [PATCH 171/824] Bump mini-css-extract-plugin from 2.6.0 to 2.6.1 (#640) Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 2.6.0 to 2.6.1. - [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases) - [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.6.0...v2.6.1) --- updated-dependencies: - dependency-name: mini-css-extract-plugin dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4129948b..c87625d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", "html-webpack-plugin": "^5.3.1", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", "sass": "^1.52.3", "sass-loader": "^13.0.0", @@ -9627,9 +9627,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -21284,9 +21284,9 @@ } }, "mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, "requires": { "schema-utils": "^4.0.0" diff --git a/package.json b/package.json index 9deb3630..1ea9188b 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", "html-webpack-plugin": "^5.3.1", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", "sass": "^1.52.3", "sass-loader": "^13.0.0", From 118dcd8fa043977d314778ce41ee23907cc5f0d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:31:58 +0530 Subject: [PATCH 172/824] Bump eslint-plugin-react-hooks from 4.5.0 to 4.6.0 (#642) Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 4.5.0 to 4.6.0. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks) --- updated-dependencies: - dependency-name: eslint-plugin-react-hooks dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c87625d2..4300eaac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,7 +60,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.30.0", - "eslint-plugin-react-hooks": "^4.5.0", + "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", @@ -5818,9 +5818,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", - "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, "engines": { "node": ">=10" @@ -18569,9 +18569,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", - "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 1ea9188b..b189e804 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.30.0", - "eslint-plugin-react-hooks": "^4.5.0", + "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", "html-loader": "^3.1.0", From 4c7820ceacf3c12a9febc2f426b0e5f23ea39b0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:33:58 +0530 Subject: [PATCH 173/824] Bump html-react-parser from 1.4.14 to 2.0.0 (#641) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 1.4.14 to 2.0.0. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v1.4.14...v2.0.0) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4300eaac..8f77a6bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.14", + "html-react-parser": "^2.0.0", "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^18.1.0", @@ -7247,9 +7247,9 @@ } }, "node_modules/html-dom-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz", - "integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-2.0.0.tgz", + "integrity": "sha512-PwVjg12yfWunpH2WjwjaYNKcZyKKm20kclTfMQohiRzfgYiXX0dR7nXIIKnHneghMDvB0rKFZLEAe11ykOfpcg==", "dependencies": { "domhandler": "4.3.1", "htmlparser2": "7.2.0" @@ -7332,12 +7332,12 @@ } }, "node_modules/html-react-parser": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz", - "integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-2.0.0.tgz", + "integrity": "sha512-AI1lhybWGi8w4QkGtEIS3iSGAjeFGaonxl/+CzqzCeNT3g3z/yx2NKsA93trnv2BLjhe+juGLmLeTSUkyYWk9Q==", "dependencies": { "domhandler": "4.3.1", - "html-dom-parser": "1.2.0", + "html-dom-parser": "2.0.0", "react-property": "2.0.0", "style-to-js": "1.1.1" }, @@ -19588,9 +19588,9 @@ } }, "html-dom-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz", - "integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-2.0.0.tgz", + "integrity": "sha512-PwVjg12yfWunpH2WjwjaYNKcZyKKm20kclTfMQohiRzfgYiXX0dR7nXIIKnHneghMDvB0rKFZLEAe11ykOfpcg==", "requires": { "domhandler": "4.3.1", "htmlparser2": "7.2.0" @@ -19646,12 +19646,12 @@ } }, "html-react-parser": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz", - "integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-2.0.0.tgz", + "integrity": "sha512-AI1lhybWGi8w4QkGtEIS3iSGAjeFGaonxl/+CzqzCeNT3g3z/yx2NKsA93trnv2BLjhe+juGLmLeTSUkyYWk9Q==", "requires": { "domhandler": "4.3.1", - "html-dom-parser": "1.2.0", + "html-dom-parser": "2.0.0", "react-property": "2.0.0", "style-to-js": "1.1.1" } diff --git a/package.json b/package.json index b189e804..abdf2f59 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^1.4.14", + "html-react-parser": "^2.0.0", "katex": "^0.15.6", "linkifyjs": "^2.1.9", "matrix-js-sdk": "^18.1.0", From 1cba4d3fa756ba15267d3aa6dcb23c423b1071c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:39:36 +0530 Subject: [PATCH 174/824] Bump html-loader from 3.1.0 to 3.1.2 (#643) Bumps [html-loader](https://github.com/webpack-contrib/html-loader) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/webpack-contrib/html-loader/releases) - [Changelog](https://github.com/webpack-contrib/html-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/html-loader/compare/v3.1.0...v3.1.2) --- updated-dependencies: - dependency-name: html-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f77a6bd..390ac9d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", - "html-loader": "^3.1.0", + "html-loader": "^3.1.2", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", @@ -7291,9 +7291,9 @@ "dev": true }, "node_modules/html-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.0.tgz", - "integrity": "sha512-ycMYFRiCF7YANcLDNP72kh3Po5pTcH+bROzdDwh00iVOAY/BwvpuZ1BKPziQ35Dk9D+UD84VGX1Lu/H4HpO4fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.2.tgz", + "integrity": "sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==", "dev": true, "dependencies": { "html-minifier-terser": "^6.0.2", @@ -19621,9 +19621,9 @@ "dev": true }, "html-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.0.tgz", - "integrity": "sha512-ycMYFRiCF7YANcLDNP72kh3Po5pTcH+bROzdDwh00iVOAY/BwvpuZ1BKPziQ35Dk9D+UD84VGX1Lu/H4HpO4fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.2.tgz", + "integrity": "sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==", "dev": true, "requires": { "html-minifier-terser": "^6.0.2", diff --git a/package.json b/package.json index abdf2f59..c5f7e5e6 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", - "html-loader": "^3.1.0", + "html-loader": "^3.1.2", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", From 56bc8c28903b433125f5958b5863919b04bad2e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:27:20 +0530 Subject: [PATCH 175/824] Bump nginx from 1.21.6-alpine to 1.23.0-alpine (#649) Bumps nginx from 1.21.6-alpine to 1.23.0-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5712068f..a1066da1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN npm run build ## App -FROM nginx:1.21.6-alpine +FROM nginx:1.23.0-alpine COPY --from=builder /src/dist /app From f5386398826f6ca3519d0bb295d7437d73a85a26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:27:40 +0530 Subject: [PATCH 176/824] Bump eslint-plugin-react from 7.30.0 to 7.30.1 (#650) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.30.0 to 7.30.1. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.30.0...v7.30.1) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 390ac9d9..c9d656e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,7 @@ "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", @@ -5790,9 +5790,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -18526,9 +18526,9 @@ } }, "eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", "dev": true, "requires": { "array-includes": "^3.1.5", diff --git a/package.json b/package.json index c5f7e5e6..952ee8ad 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", From db92b9f5ffa37978a29d7b6cdf281d86f994f471 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:28:24 +0530 Subject: [PATCH 177/824] Bump sass-loader from 13.0.0 to 13.0.2 (#651) Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 13.0.0 to 13.0.2. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v13.0.0...v13.0.2) --- updated-dependencies: - dependency-name: sass-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9d656e3..d2e869db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", "sass": "^1.52.3", - "sass-loader": "^13.0.0", + "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "url": "^0.11.0", @@ -11969,9 +11969,9 @@ } }, "node_modules/sass-loader": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", - "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "dev": true, "dependencies": { "klona": "^2.0.4", @@ -23027,9 +23027,9 @@ } }, "sass-loader": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", - "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "dev": true, "requires": { "klona": "^2.0.4", diff --git a/package.json b/package.json index 952ee8ad..f11801cb 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", "sass": "^1.52.3", - "sass-loader": "^13.0.0", + "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "url": "^0.11.0", From 2292f63fb68d39dfd1bd6627870986b90072572f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:52:31 +0530 Subject: [PATCH 178/824] Bump eslint-plugin-jsx-a11y from 6.5.1 to 6.6.0 (#652) Bumps [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y) from 6.5.1 to 6.6.0. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/compare/v6.5.1...v6.6.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsx-a11y dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 94 ++++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2e869db..30929296 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "eslint": "^8.18.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-jsx-a11y": "^6.6.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", @@ -1694,9 +1694,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -3318,12 +3318,12 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "node_modules/axe-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.0.tgz", - "integrity": "sha512-btWy2rze3NnxSSxb7LtNhPYYFrRoFBfjiGzmSc/5Hu47wApO2KNXjP/w7Nv2Uz/Fyr/pfEiwOkcXhDxu0jz5FA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/axobject-query": { @@ -4902,9 +4902,9 @@ } }, "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, "node_modules/dashdash": { @@ -5764,23 +5764,24 @@ "dev": true }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", + "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", "dev": true, "dependencies": { - "@babel/runtime": "^7.16.3", + "@babel/runtime": "^7.18.3", "aria-query": "^4.2.2", - "array-includes": "^3.1.4", + "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", + "axe-core": "^4.4.2", "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", + "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", + "jsx-ast-utils": "^3.3.1", "language-tags": "^1.0.5", - "minimatch": "^3.0.4" + "minimatch": "^3.1.2", + "semver": "^6.3.0" }, "engines": { "node": ">=4.0" @@ -8398,12 +8399,12 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", + "integrity": "sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.3", + "array-includes": "^3.1.5", "object.assign": "^4.1.2" }, "engines": { @@ -15135,9 +15136,9 @@ } }, "@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -16497,9 +16498,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axe-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.0.tgz", - "integrity": "sha512-btWy2rze3NnxSSxb7LtNhPYYFrRoFBfjiGzmSc/5Hu47wApO2KNXjP/w7Nv2Uz/Fyr/pfEiwOkcXhDxu0jz5FA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", "dev": true }, "axobject-query": { @@ -17741,9 +17742,9 @@ } }, "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, "dashdash": { @@ -18506,23 +18507,24 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", + "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", "dev": true, "requires": { - "@babel/runtime": "^7.16.3", + "@babel/runtime": "^7.18.3", "aria-query": "^4.2.2", - "array-includes": "^3.1.4", + "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", + "axe-core": "^4.4.2", "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", + "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", + "jsx-ast-utils": "^3.3.1", "language-tags": "^1.0.5", - "minimatch": "^3.0.4" + "minimatch": "^3.1.2", + "semver": "^6.3.0" } }, "eslint-plugin-react": { @@ -20403,12 +20405,12 @@ } }, "jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", + "integrity": "sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ==", "dev": true, "requires": { - "array-includes": "^3.1.3", + "array-includes": "^3.1.5", "object.assign": "^4.1.2" } }, diff --git a/package.json b/package.json index f11801cb..e0dbea6d 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "eslint": "^8.18.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-jsx-a11y": "^6.6.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", From a9c5765be5d45b1aeb5eb1292bec4618e1763dc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:53:23 +0530 Subject: [PATCH 179/824] Bump sass from 1.52.3 to 1.53.0 (#655) Bumps [sass](https://github.com/sass/dart-sass) from 1.52.3 to 1.53.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.52.3...1.53.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30929296..a6295ccb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.52.3", + "sass": "^1.53.0", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -11953,9 +11953,9 @@ } }, "node_modules/sass": { - "version": "1.52.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", - "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", + "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23018,9 +23018,9 @@ } }, "sass": { - "version": "1.52.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", - "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", + "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index e0dbea6d..b409961d 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.52.3", + "sass": "^1.53.0", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 7bd7518963dfc0756b34ecde1563cc8a657e87d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:54:07 +0530 Subject: [PATCH 180/824] Bump @babel/core from 7.18.5 to 7.18.6 (#653) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.5 to 7.18.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 422 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 212 insertions(+), 212 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6295ccb..7cd34a3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.5", + "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", @@ -96,42 +96,42 @@ } }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", - "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.5", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.5", - "@babel/types": "^7.18.4", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -147,12 +147,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", + "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.2", + "@babel/types": "^7.18.6", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -186,13 +186,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" }, @@ -260,9 +260,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", "dev": true, "engines": { "node": ">=6.9.0" @@ -281,25 +281,25 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -318,31 +318,31 @@ } }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", + "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -400,12 +400,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -424,30 +424,30 @@ } }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -469,26 +469,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -497,9 +497,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", - "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1729,33 +1729,33 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", - "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.5", - "@babel/types": "^7.18.4", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1764,12 +1764,12 @@ } }, "node_modules/@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", + "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -5570,7 +5570,7 @@ "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=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -7083,7 +7083,7 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -14040,36 +14040,36 @@ } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", "dev": true }, "@babel/core": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", - "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.5", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.5", - "@babel/types": "^7.18.4", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14078,12 +14078,12 @@ } }, "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", + "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", "dev": true, "requires": { - "@babel/types": "^7.18.2", + "@babel/types": "^7.18.6", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } @@ -14108,13 +14108,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" } @@ -14161,9 +14161,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -14176,22 +14176,22 @@ } }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { @@ -14204,28 +14204,28 @@ } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", + "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-optimise-call-expression": { @@ -14268,12 +14268,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.18.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -14286,24 +14286,24 @@ } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helper-wrap-function": { @@ -14319,31 +14319,31 @@ } }, "@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", - "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15169,41 +15169,41 @@ } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", - "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.5", - "@babel/types": "^7.18.4", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", + "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -18270,7 +18270,7 @@ "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=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "eslint": { @@ -19459,7 +19459,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "has-property-descriptors": { diff --git a/package.json b/package.json index b409961d..a077c5c7 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.5", + "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", From 1d12a906d479b00836510c4977277b78bd9cce70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 20:31:52 +0530 Subject: [PATCH 181/824] Bump @babel/preset-env from 7.18.2 to 7.18.6 (#654) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.2 to 7.18.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1469 +++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 739 insertions(+), 732 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cd34a3a..973528c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.2", + "@babel/preset-env": "^7.18.6", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -161,25 +161,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -204,18 +204,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -225,13 +225,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -269,12 +269,12 @@ } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -306,12 +306,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -349,51 +349,55 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -412,12 +416,12 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -454,15 +458,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -509,12 +513,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -524,14 +528,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -541,13 +545,14 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -558,13 +563,13 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -574,13 +579,13 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -591,12 +596,12 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -607,12 +612,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -623,12 +628,12 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -639,12 +644,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -655,12 +660,12 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -671,12 +676,12 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -687,16 +692,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" + "@babel/plugin-transform-parameters": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -706,12 +711,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -722,13 +727,13 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -739,13 +744,13 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -755,14 +760,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -773,13 +778,13 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -852,12 +857,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -996,12 +1001,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1011,14 +1016,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1028,12 +1033,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1043,12 +1048,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", - "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1058,18 +1063,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", - "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", + "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -1080,12 +1085,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1095,12 +1100,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1110,13 +1115,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1126,12 +1131,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1141,13 +1146,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1157,12 +1162,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", + "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1172,14 +1177,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1189,12 +1194,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1204,12 +1209,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1219,13 +1224,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1236,14 +1241,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1254,15 +1259,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", - "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1273,13 +1278,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1289,13 +1294,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1305,12 +1310,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1320,13 +1325,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1336,12 +1341,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", + "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1351,12 +1356,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1431,12 +1436,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1447,12 +1452,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1462,12 +1467,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1477,13 +1482,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1493,12 +1498,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1508,12 +1513,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1523,12 +1528,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1538,12 +1543,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1553,13 +1558,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1569,38 +1574,38 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1610,43 +1615,43 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, @@ -11542,9 +11547,9 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", "dev": true, "dependencies": { "regenerate": "^1.4.2", @@ -11579,7 +11584,7 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -14089,22 +14094,22 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-compilation-targets": { @@ -14120,28 +14125,28 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, "@babel/helper-define-polyfill-provider": { @@ -14167,12 +14172,12 @@ "dev": true }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { @@ -14195,12 +14200,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { @@ -14229,42 +14234,43 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-simple-access": { @@ -14277,12 +14283,12 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { @@ -14307,15 +14313,15 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helpers": { @@ -14347,181 +14353,182 @@ "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" + "@babel/plugin-transform-parameters": "^7.18.6" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { @@ -14570,12 +14577,12 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-json-strings": { @@ -14669,235 +14676,235 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", - "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-classes": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", - "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", + "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", + "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", - "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", + "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-display-name": { @@ -14942,122 +14949,122 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -15067,43 +15074,43 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "core-js-compat": "^3.22.1", "semver": "^6.3.0" } @@ -22690,9 +22697,9 @@ "dev": true }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", "dev": true, "requires": { "regenerate": "^1.4.2", @@ -22721,7 +22728,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } diff --git a/package.json b/package.json index a077c5c7..2dda7601 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.2", + "@babel/preset-env": "^7.18.6", "@babel/preset-react": "^7.17.12", "assert": "^2.0.0", "babel-loader": "^8.2.5", From 0ca1df24edab9a35493954fe91cd38b125033b84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 20:39:44 +0530 Subject: [PATCH 182/824] Bump @babel/preset-react from 7.17.12 to 7.18.6 (#656) Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.17.12 to 7.18.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-preset-react) --- updated-dependencies: - dependency-name: "@babel/preset-react" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 138 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index 973528c3..b81d4ad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "devDependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.17.12", + "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", @@ -884,12 +884,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1371,12 +1371,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1386,16 +1386,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1405,12 +1405,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1420,13 +1420,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1679,17 +1679,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -14595,12 +14595,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -14908,44 +14908,44 @@ } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.18.6" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { @@ -15129,17 +15129,17 @@ } }, "@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, "@babel/runtime": { diff --git a/package.json b/package.json index 2dda7601..10c6c109 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "devDependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.17.12", + "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", "browserify-fs": "^1.0.0", From 06a4e0c93be98244989aac08fcbf7806e448d239 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Wed, 29 Jun 2022 14:49:43 +0200 Subject: [PATCH 183/824] Add emoji name fallback (#658) --- src/app/organisms/emoji-board/emoji.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/organisms/emoji-board/emoji.js b/src/app/organisms/emoji-board/emoji.js index 4f76f7c6..3cbd0b88 100644 --- a/src/app/organisms/emoji-board/emoji.js +++ b/src/app/organisms/emoji-board/emoji.js @@ -1,5 +1,6 @@ import emojisData from 'emojibase-data/en/compact.json'; -import shortcodes from 'emojibase-data/en/shortcodes/joypixels.json'; +import joypixels from 'emojibase-data/en/shortcodes/joypixels.json'; +import emojibase from 'emojibase-data/en/shortcodes/emojibase.json'; const emojiGroups = [{ name: 'Smileys & people', @@ -52,7 +53,7 @@ function addToGroup(emoji) { const emojis = []; emojisData.forEach((emoji) => { - const myShortCodes = shortcodes[emoji.hexcode]; + const myShortCodes = joypixels[emoji.hexcode] || emojibase[emoji.hexcode]; if (!myShortCodes) return; const em = { ...emoji, From a6f21b6606846a92df8d539d0500f87a5664939f Mon Sep 17 00:00:00 2001 From: Chuang Zhu Date: Mon, 4 Jul 2022 22:20:11 +0800 Subject: [PATCH 184/824] Fix parsing encoded matrix.to URL (#660) From https://spec.matrix.org/v1.3/appendices/#matrixto-navigation: The components of the matrix.to URI ( and ) are to be percent-encoded as per RFC 3986. Historically, clients have not produced URIs which are fully encoded. Clients should try to interpret these cases to the best of their ability. For example, an unencoded room alias should still work within the client if possible --- src/util/sanitize.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/sanitize.js b/src/util/sanitize.js index 3b230523..5351a1a0 100644 --- a/src/util/sanitize.js +++ b/src/util/sanitize.js @@ -44,7 +44,7 @@ function transformSpanTag(tagName, attribs) { } function transformATag(tagName, attribs) { - const userLink = attribs.href.match(/^https?:\/\/matrix.to\/#\/(@.+:.+)/); + const userLink = decodeURIComponent(attribs.href).match(/^https?:\/\/matrix.to\/#\/(@.+:.+)/); if (userLink !== null) { // convert user link to pill const userId = userLink[1]; From 68da1d0551d814d2f48c2da8ce46a8e107ff4a64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 10:06:53 +0530 Subject: [PATCH 185/824] Bump eslint from 8.18.0 to 8.19.0 (#663) Bumps [eslint](https://github.com/eslint/eslint) from 8.18.0 to 8.19.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.18.0...v8.19.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b81d4ad0..b164cee1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.18.0", + "eslint": "^8.19.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", @@ -5582,9 +5582,9 @@ } }, "node_modules/eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", - "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", @@ -18281,9 +18281,9 @@ "dev": true }, "eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", - "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", diff --git a/package.json b/package.json index 10c6c109..8000b113 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.18.0", + "eslint": "^8.19.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", From 7decbb6eefb8034ad2bf8b463fb8bd45b78a70f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 10:08:25 +0530 Subject: [PATCH 186/824] Bump webpack-dev-server from 4.9.2 to 4.9.3 (#662) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.9.2 to 4.9.3. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.9.2...v4.9.3) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 34 +++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index b164cee1..f08c4d3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,7 @@ "util": "^0.12.4", "webpack": "^5.73.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.2", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.7.3" }, "engines": { @@ -4333,9 +4333,9 @@ "dev": true }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "engines": { "node": ">=0.8" @@ -13662,9 +13662,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", - "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13679,7 +13679,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", @@ -13703,6 +13703,10 @@ "engines": { "node": ">= 12.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, @@ -17334,9 +17338,9 @@ "dev": true }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, "console-control-strings": { @@ -24327,9 +24331,9 @@ } }, "webpack-dev-server": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", - "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -24344,7 +24348,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", diff --git a/package.json b/package.json index 8000b113..b92bdf39 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "util": "^0.12.4", "webpack": "^5.73.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.2", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.7.3" } } From 47e6527b0e3a280cb5529d8a1921d184c4ef284e Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 8 Jul 2022 20:24:35 +0530 Subject: [PATCH 187/824] Don't enable e2ee from profileViewer for bridge users (#666) --- src/app/organisms/invite-user/InviteUser.jsx | 14 +------------- src/app/organisms/profile-viewer/ProfileViewer.jsx | 4 ++-- src/util/matrixUtil.js | 13 +++++++++++++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/app/organisms/invite-user/InviteUser.jsx b/src/app/organisms/invite-user/InviteUser.jsx index d0a8d9e1..75195102 100644 --- a/src/app/organisms/invite-user/InviteUser.jsx +++ b/src/app/organisms/invite-user/InviteUser.jsx @@ -6,7 +6,7 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import * as roomActions from '../../../client/action/room'; import { selectRoom } from '../../../client/action/navigation'; -import { hasDMWith } from '../../../util/matrixUtil'; +import { hasDMWith, hasDevices } from '../../../util/matrixUtil'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -103,18 +103,6 @@ function InviteUser({ updateIsSearching(false); } - async function hasDevices(userId) { - try { - const usersDeviceMap = await mx.downloadKeys([userId, mx.getUserId()]); - return Object.values(usersDeviceMap).every((userDevices) => - Object.keys(userDevices).length > 0, - ); - } catch (e) { - console.error("Error determining if it's possible to encrypt to all users: ", e); - return false; - } - } - async function createDM(userId) { if (mx.getUserId() === userId) return; const dmRoomId = hasDMWith(userId); diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index d74629f2..26e39682 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -11,7 +11,7 @@ import { selectRoom, openReusableContextMenu } from '../../../client/action/navi import * as roomActions from '../../../client/action/room'; import { - getUsername, getUsernameOfRoomMember, getPowerLabel, hasDMWith + getUsername, getUsernameOfRoomMember, getPowerLabel, hasDMWith, hasDevices } from '../../../util/matrixUtil'; import { getEventCords } from '../../../util/common'; import colorMXID from '../../../util/colorMXID'; @@ -201,7 +201,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { // Create new DM try { setIsCreatingDM(true); - await roomActions.createDM(userId); + await roomActions.createDM(userId, await hasDevices(userId)); } catch { if (isMountedRef.current === false) return; setIsCreatingDM(false); diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index 16be1175..fb97d850 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -199,3 +199,16 @@ export function getSSKeyInfo(key) { return undefined; } } + +export async function hasDevices(userId) { + const mx = initMatrix.matrixClient; + try { + const usersDeviceMap = await mx.downloadKeys([userId, mx.getUserId()]); + return Object.values(usersDeviceMap).every((userDevices) => + Object.keys(userDevices).length > 0, + ); + } catch (e) { + console.error("Error determining if it's possible to encrypt to all users: ", e); + return false; + } +} \ No newline at end of file From ca2627d3cf98e62759bd972b3fd3bc6970b7b365 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 8 Jul 2022 20:29:07 +0530 Subject: [PATCH 188/824] Bump linkifyjs 2.1.9 to 4.0.0-beta.5 (#665) --- package-lock.json | 45 ++++++++++++++++++++---------------------- package.json | 3 ++- src/util/twemojify.jsx | 2 +- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index f08c4d3e..7bb70f62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,8 @@ "formik": "^2.2.9", "html-react-parser": "^2.0.0", "katex": "^0.15.6", - "linkifyjs": "^2.1.9", + "linkify-html": "^4.0.0-beta.5", + "linkifyjs": "^4.0.0-beta.5", "matrix-js-sdk": "^18.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", @@ -8290,12 +8291,6 @@ "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", "dev": true }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "peer": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8719,16 +8714,19 @@ "node": ">= 4.0.0" } }, - "node_modules/linkifyjs": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.9.tgz", - "integrity": "sha512-74ivurkK6WHvHFozVaGtQWV38FzBwSTGNmJolEgFp7QgR2bl6ArUWlvT4GcHKbPe1z3nWYi+VUdDZk16zDOVug==", + "node_modules/linkify-html": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0-beta.5.tgz", + "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==", "peerDependencies": { - "jquery": ">= 1.11.0", - "react": ">= 0.14.0", - "react-dom": ">= 0.14.0" + "linkifyjs": "^4.0.0-beta.1" } }, + "node_modules/linkifyjs": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", + "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" + }, "node_modules/load-bmfont": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", @@ -20325,12 +20323,6 @@ "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", "dev": true }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "peer": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -20695,12 +20687,17 @@ "computed-style": "~0.1.3" } }, - "linkifyjs": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.9.tgz", - "integrity": "sha512-74ivurkK6WHvHFozVaGtQWV38FzBwSTGNmJolEgFp7QgR2bl6ArUWlvT4GcHKbPe1z3nWYi+VUdDZk16zDOVug==", + "linkify-html": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0-beta.5.tgz", + "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==", "requires": {} }, + "linkifyjs": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", + "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" + }, "load-bmfont": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", diff --git a/package.json b/package.json index b92bdf39..ad1d799f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "formik": "^2.2.9", "html-react-parser": "^2.0.0", "katex": "^0.15.6", - "linkifyjs": "^2.1.9", + "linkify-html": "^4.0.0-beta.5", + "linkifyjs": "^4.0.0-beta.5", "matrix-js-sdk": "^18.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", diff --git a/src/util/twemojify.jsx b/src/util/twemojify.jsx index aed8b09d..0a4fede7 100644 --- a/src/util/twemojify.jsx +++ b/src/util/twemojify.jsx @@ -1,7 +1,7 @@ /* eslint-disable import/prefer-default-export */ import React, { lazy, Suspense } from 'react'; -import linkifyHtml from 'linkifyjs/html'; +import linkifyHtml from 'linkify-html'; import parse from 'html-react-parser'; import twemoji from 'twemoji'; import { sanitizeText } from './sanitize'; From c9df0be874c70537511a9f9d358871cf23fdebef Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Fri, 8 Jul 2022 21:07:14 +0530 Subject: [PATCH 189/824] Fix captcha loop issue in registration form (#664) --- src/app/templates/auth/Auth.jsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/app/templates/auth/Auth.jsx b/src/app/templates/auth/Auth.jsx index 1f76476d..f7998fe3 100644 --- a/src/app/templates/auth/Auth.jsx +++ b/src/app/templates/auth/Auth.jsx @@ -97,7 +97,7 @@ function Homeserver({ onChange }) { if (!hsList?.length > 0 || selectedHs < 0 || selectedHs >= hsList?.length) { throw new Error(); } - setHs({ selected: hsList[selectedHs], list: hsList, allowCustom: allowCustom }); + setHs({ selected: hsList[selectedHs], list: hsList, allowCustom }); } catch { setHs({ selected: 'matrix.org', list: ['matrix.org'], allowCustom: true }); } @@ -114,8 +114,14 @@ function Homeserver({ onChange }) { return ( <>
    - + ( @@ -319,6 +325,7 @@ function Register({ registerInfo, loginFlow, baseUrl }) { if (!isAvail) { actions.setErrors({ username: 'Username is already taken' }); actions.setSubmitting(false); + return; } if (isEmail && values.email.length > 0) { const result = await auth.verifyEmail(baseUrl, values.email, clientSecret, 1); From 3dda4d65404bbea97f60c0eec2b08340095318ef Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 9 Jul 2022 10:35:17 +0530 Subject: [PATCH 190/824] Add toggle to show password in auth page (#73) --- public/res/ic/outlined/eye-blind.svg | 4 ++++ public/res/ic/outlined/eye.svg | 15 +++------------ src/app/templates/auth/Auth.jsx | 20 +++++++++++++++++--- src/app/templates/auth/Auth.scss | 17 ++++++++++++++++- 4 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 public/res/ic/outlined/eye-blind.svg diff --git a/public/res/ic/outlined/eye-blind.svg b/public/res/ic/outlined/eye-blind.svg new file mode 100644 index 00000000..fbc8e2ae --- /dev/null +++ b/public/res/ic/outlined/eye-blind.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/res/ic/outlined/eye.svg b/public/res/ic/outlined/eye.svg index fb31e4f4..1ce868bf 100644 --- a/public/res/ic/outlined/eye.svg +++ b/public/res/ic/outlined/eye.svg @@ -1,13 +1,4 @@ - - - - - - - - - - + + + diff --git a/src/app/templates/auth/Auth.jsx b/src/app/templates/auth/Auth.jsx index f7998fe3..0c27c00c 100644 --- a/src/app/templates/auth/Auth.jsx +++ b/src/app/templates/auth/Auth.jsx @@ -21,6 +21,8 @@ import Avatar from '../../atoms/avatar/Avatar'; import ContextMenu, { MenuItem, MenuHeader } from '../../atoms/context-menu/ContextMenu'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; +import EyeIC from '../../../../public/res/ic/outlined/eye.svg'; +import EyeBlindIC from '../../../../public/res/ic/outlined/eye-blind.svg'; import CinnySvg from '../../../../public/res/svg/cinny.svg'; import SSOButtons from '../../molecules/sso-buttons/SSOButtons'; @@ -162,6 +164,7 @@ Homeserver.propTypes = { function Login({ loginFlow, baseUrl }) { const [typeIndex, setTypeIndex] = useState(0); + const [passVisible, setPassVisible] = useState(false); const loginTypes = ['Username', 'Email']; const isPassword = loginFlow?.filter((flow) => flow.type === 'm.login.password')[0]; const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0]; @@ -242,7 +245,10 @@ function Login({ loginFlow, baseUrl }) { {errors.username && {errors.username}} {typeIndex === 1 && } {errors.email && {errors.email}} - +
    + + setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" /> +
    {errors.password && {errors.password}} {errors.other && {errors.other}}
    @@ -275,6 +281,8 @@ let sid; let clientSecret; function Register({ registerInfo, loginFlow, baseUrl }) { const [process, setProcess] = useState({}); + const [passVisible, setPassVisible] = useState(false); + const [cPassVisible, setCPassVisible] = useState(false); const formRef = useRef(); const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0]; @@ -444,9 +452,15 @@ function Register({ registerInfo, loginFlow, baseUrl }) {
    {errors.username && {errors.username}} - +
    + + setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" /> +
    {errors.password && {errors.password}} - +
    + + setCPassVisible(!cPassVisible)} src={cPassVisible ? EyeIC : EyeBlindIC} size="extra-small" /> +
    {errors.confirmPassword && {errors.confirmPassword}} {isEmail && } {errors.email && {errors.email}} diff --git a/src/app/templates/auth/Auth.scss b/src/app/templates/auth/Auth.scss index 8249e163..956a2700 100644 --- a/src/app/templates/auth/Auth.scss +++ b/src/app/templates/auth/Auth.scss @@ -97,7 +97,8 @@ } .auth-form { - & > .input-container { + & > .input-container, + &__pass-eye-wrapper { margin: var(--sp-tight) 0 var(--sp-ultra-tight); } @@ -107,6 +108,20 @@ margin-top: calc(var(--sp-extra-loose) + var(--sp-tight)); } + &__pass-eye-wrapper { + position: relative; + & .ic-btn { + position: absolute; + @include dir.prop(right, 6px, unset); + @include dir.prop(left, unset, 6px ); + bottom: 6px; + border-radius: 4px; + } + & input { + @include dir.side(padding, var(--sp-normal), 46px); + } + } + &__btns { padding-top: var(--sp-loose); margin-bottom: var(--sp-extra-loose); From 4427b3b2915cb9214e690c64843e569026e8f650 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 9 Jul 2022 13:58:57 +0530 Subject: [PATCH 191/824] Accept mxid on login (#187) --- config.json | 3 +- src/app/templates/auth/Auth.jsx | 52 ++++++++++++++++++--------------- src/util/matrixUtil.js | 9 +++--- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/config.json b/config.json index c647dbb4..2aa67ddc 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,6 @@ { - "defaultHomeserver": 4, + "defaultHomeserver": 3, "homeserverList": [ - "converser.eu", "envs.net", "halogen.city", "kde.org", diff --git a/src/app/templates/auth/Auth.jsx b/src/app/templates/auth/Auth.jsx index 0c27c00c..7c211736 100644 --- a/src/app/templates/auth/Auth.jsx +++ b/src/app/templates/auth/Auth.jsx @@ -56,11 +56,8 @@ function Homeserver({ onChange }) { const setupHsConfig = async (servername) => { setProcess({ isLoading: true, message: 'Looking for homeserver...' }); let baseUrl = null; - try { - baseUrl = await getBaseUrl(servername); - } catch (e) { - baseUrl = e.message; - } + baseUrl = await getBaseUrl(servername); + if (searchingHs !== servername) return; setProcess({ isLoading: true, message: `Connecting to ${baseUrl}...` }); const tempClient = auth.createTemporaryClient(baseUrl); @@ -175,31 +172,38 @@ function Login({ loginFlow, baseUrl }) { const validator = (values) => { const errors = {}; - if (typeIndex === 0 && values.username.length > 0 && values.username.indexOf(':') > -1) { - errors.username = 'Username must contain local-part only'; - } if (typeIndex === 1 && values.email.length > 0 && !isValidInput(values.email, EMAIL_REGEX)) { errors.email = BAD_EMAIL_ERROR; } return errors; }; - const submitter = (values, actions) => auth.login( - baseUrl, - typeIndex === 0 ? normalizeUsername(values.username) : undefined, - typeIndex === 1 ? values.email : undefined, - values.password, - ).then(() => { - actions.setSubmitting(true); - window.location.reload(); - }).catch((error) => { - let msg = error.message; - if (msg === 'Unknown message') msg = 'Please check your credentials'; - actions.setErrors({ - password: msg === 'Invalid password' ? msg : undefined, - other: msg !== 'Invalid password' ? msg : undefined, + const submitter = async (values, actions) => { + let userBaseUrl = baseUrl; + let { username } = values; + const mxIdMatch = username.match(/^@(.+):(.+\..+)$/); + if (typeIndex === 0 && mxIdMatch) { + [, username, userBaseUrl] = mxIdMatch; + userBaseUrl = await getBaseUrl(userBaseUrl); + } + + return auth.login( + userBaseUrl, + typeIndex === 0 ? normalizeUsername(username) : undefined, + typeIndex === 1 ? values.email : undefined, + values.password, + ).then(() => { + actions.setSubmitting(true); + window.location.reload(); + }).catch((error) => { + let msg = error.message; + if (msg === 'Unknown message') msg = 'Please check your credentials'; + actions.setErrors({ + password: msg === 'Invalid password' ? msg : undefined, + other: msg !== 'Invalid password' ? msg : undefined, + }); + actions.setSubmitting(false); }); - actions.setSubmitting(false); - }); + }; return ( <> diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index fb97d850..ef016eda 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -20,7 +20,7 @@ export async function getBaseUrl(servername) { if (baseUrl === undefined) throw new Error(); return baseUrl; } catch (e) { - throw new Error(`${protocol}${servername}`); + return `${protocol}${servername}`; } } @@ -204,11 +204,10 @@ export async function hasDevices(userId) { const mx = initMatrix.matrixClient; try { const usersDeviceMap = await mx.downloadKeys([userId, mx.getUserId()]); - return Object.values(usersDeviceMap).every((userDevices) => - Object.keys(userDevices).length > 0, - ); + return Object.values(usersDeviceMap) + .every((userDevices) => (Object.keys(userDevices).length > 0)); } catch (e) { console.error("Error determining if it's possible to encrypt to all users: ", e); return false; } -} \ No newline at end of file +} From 009966a5c7151a7e1941fee76341330e40afd91f Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 9 Jul 2022 16:32:42 +0530 Subject: [PATCH 192/824] Fix wrong power level in room permission --- src/app/molecules/room-permissions/RoomPermissions.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/room-permissions/RoomPermissions.jsx b/src/app/molecules/room-permissions/RoomPermissions.jsx index 989a9396..da8720cd 100644 --- a/src/app/molecules/room-permissions/RoomPermissions.jsx +++ b/src/app/molecules/room-permissions/RoomPermissions.jsx @@ -237,12 +237,12 @@ function RoomPermissions({ roomId }) { ? permissions[permInfo.parent]?.[permKey] : permissions[permKey]; - if (!permValue) permValue = permInfo.default; + if (permValue === undefined) permValue = permInfo.default; if (typeof permValue === 'number') { powerLevel = permValue; } else if (permKey === 'notifications') { - powerLevel = permValue.room || 50; + powerLevel = permValue.room ?? 50; } return ( Date: Sat, 9 Jul 2022 18:08:35 +0530 Subject: [PATCH 193/824] Follow system theme by default --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- src/app/organisms/settings/Settings.jsx | 34 ++++++++++--------- src/client/state/settings.js | 45 ++++++++++++++----------- src/index.jsx | 2 +- 4 files changed, 46 insertions(+), 37 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a8a04e76..1292f1d2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ - + ### Description diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 82b948ad..b0f45f41 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -57,23 +57,25 @@ function AppearanceSection() { )} content={Use light or dark mode based on the system settings.} /> - {!settings.useSystemTheme && ( - settings.setTheme(index)} - /> - )} - /> + { + if (settings.useSystemTheme) toggleSystemTheme(); + settings.setTheme(index); + updateState({}); + }} + /> )} + />
    Room messages diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 0f476ef8..32f55fcc 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -48,31 +48,43 @@ class Settings extends EventEmitter { return this.themes[this.themeIndex]; } - setTheme(themeIndex) { - const appBody = document.getElementById('appBody'); - - appBody.classList.remove('system-theme'); + _clearTheme() { + document.body.classList.remove('system-theme'); this.themes.forEach((themeName) => { if (themeName === '') return; - appBody.classList.remove(themeName); + document.body.classList.remove(themeName); }); - // If use system theme is enabled - // we will override current theme choice with system theme + } + + applyTheme() { + this._clearTheme(); if (this.useSystemTheme) { - appBody.classList.add('system-theme'); - } else if (this.themes[themeIndex] !== '') { - appBody.classList.add(this.themes[themeIndex]); + document.body.classList.add('system-theme'); + } else if (this.themes[this.themeIndex]) { + document.body.classList.add(this.themes[this.themeIndex]); } - setSettings('themeIndex', themeIndex); + } + + setTheme(themeIndex) { this.themeIndex = themeIndex; + setSettings('themeIndex', this.themeIndex); + this.applyTheme(); + } + + toggleUseSystemTheme() { + this.useSystemTheme = !this.useSystemTheme; + setSettings('useSystemTheme', this.useSystemTheme); + this.applyTheme(); + + this.emit(cons.events.settings.SYSTEM_THEME_TOGGLED, this.useSystemTheme); } getUseSystemTheme() { if (typeof this.useSystemTheme === 'boolean') return this.useSystemTheme; const settings = getSettings(); - if (settings === null) return false; - if (typeof settings.useSystemTheme === 'undefined') return false; + if (settings === null) return true; + if (typeof settings.useSystemTheme === 'undefined') return true; return settings.useSystemTheme; } @@ -138,12 +150,7 @@ class Settings extends EventEmitter { setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { - this.useSystemTheme = !this.useSystemTheme; - - setSettings('useSystemTheme', this.useSystemTheme); - this.setTheme(this.themeIndex); - - this.emit(cons.events.settings.SYSTEM_THEME_TOGGLED, this.useSystemTheme); + this.toggleUseSystemTheme(); }, [cons.actions.settings.TOGGLE_MARKDOWN]: () => { this.isMarkdown = !this.isMarkdown; diff --git a/src/index.jsx b/src/index.jsx index 69fff62f..55f8656b 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -7,7 +7,7 @@ import settings from './client/state/settings'; import App from './app/pages/App'; -settings.setTheme(settings.getThemeIndex()); +settings.applyTheme(); ReactDom.render( , From 1979646b4b370060f897c8dc737f443b7f993a75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Jul 2022 17:11:48 +0530 Subject: [PATCH 194/824] Bump actions/setup-node from 3.3.0 to 3.4.1 (#687) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.3.0 to 3.4.1. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3.3.0...v3.4.1) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index e57acd9e..cbf8a4f5 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.3.0 + uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - name: Build app diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 8def7fa0..89d526b6 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.3.0 + uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - name: Build and deploy to Netlify diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index d6a3e0c7..ee80ea85 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.3.0 + uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - name: Build @@ -50,7 +50,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.3.0 + uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - name: Build and deploy to Netlify From e6f395c6439712edb22eaaffb0b76f42ecac6772 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 18 Jul 2022 17:33:11 +0100 Subject: [PATCH 195/824] Add support to play .mov files (#672) * update allowed mimetypes * fix .mov files failing to play in Chromium * add check for before passing to FileReader * add missing semi-colon --- src/app/molecules/media/Media.jsx | 10 +++++++++- src/client/state/RoomsInput.js | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index 6fc38517..341dcb03 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -12,15 +12,19 @@ import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; import PlaySVG from '../../../../public/res/ic/outlined/play.svg'; -// https://github.com/matrix-org/matrix-react-sdk/blob/a9e28db33058d1893d964ec96cd247ecc3d92fc3/src/utils/blobs.ts#L73 +// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts#L73 const ALLOWED_BLOB_MIMETYPES = [ 'image/jpeg', 'image/gif', 'image/png', + 'image/apng', + 'image/webp', + 'image/avif', 'video/mp4', 'video/webm', 'video/ogg', + 'video/quicktime', 'audio/mp4', 'audio/webm', @@ -38,6 +42,10 @@ function getBlobSafeMimeType(mimetype) { if (!ALLOWED_BLOB_MIMETYPES.includes(mimetype)) { return 'application/octet-stream'; } + // Required for Chromium browsers + if (mimetype === 'video/quicktime') { + return 'video/mp4'; + } return mimetype; } diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 4bbd3d88..882c7bc0 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -46,7 +46,12 @@ function loadVideo(videoFile) { reader.onerror = (e) => { reject(e); }; - reader.readAsDataURL(videoFile); + if (videoFile.type === 'video/quicktime') { + const quicktimeVideoFile = new File([videoFile], videoFile.name, { type: 'video/mp4' }); + reader.readAsDataURL(quicktimeVideoFile); + } else { + reader.readAsDataURL(videoFile); + } }); } function getVideoThumbnail(video, width, height, mimeType) { From 1211ca277b7fe1fde956176729ca1a349b317556 Mon Sep 17 00:00:00 2001 From: Dean Bassett Date: Mon, 18 Jul 2022 09:36:51 -0700 Subject: [PATCH 196/824] Support mark as read by ESC while in room input (#669) fixes #cinnyapp/cinny/668 --- src/client/event/hotkeys.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index c1b2af1d..22170653 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -51,9 +51,6 @@ function listenKeyboard(event) { if (!event.ctrlKey && !event.altKey && !event.metaKey) { if (navigation.isRawModalVisible) return; - if (['input', 'textarea'].includes(document.activeElement.tagName.toLowerCase())) { - return; - } if (event.code === 'Escape') { if (navigation.isRoomSettings) { @@ -66,6 +63,10 @@ function listenKeyboard(event) { } } + if (['input', 'textarea'].includes(document.activeElement.tagName.toLowerCase())) { + return; + } + // focus the text field on most keypresses if (shouldFocusMessageField(event.code)) { // press any key to focus and type in message field From a46138c8b9f949547dc168ed996fc8630c0beb26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 17:51:13 +0530 Subject: [PATCH 197/824] Bump @babel/preset-env from 7.18.6 to 7.18.9 (#692) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.6 to 7.18.9. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.9/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 690 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 346 insertions(+), 346 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bb70f62..afd0dbf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", + "@babel/preset-env": "^7.18.9", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -109,9 +109,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -148,13 +148,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", - "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "engines": { @@ -187,12 +187,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.6", + "@babel/compat-data": "^7.18.8", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -261,9 +261,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -282,13 +282,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "dependencies": { "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -307,12 +307,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -331,19 +331,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -362,9 +362,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -389,16 +389,16 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -417,12 +417,12 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -502,9 +502,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -529,14 +529,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -613,12 +613,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -645,12 +645,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -693,16 +693,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.18.8" }, "engines": { "node": ">=6.9.0" @@ -728,13 +728,13 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1049,12 +1049,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1064,17 +1064,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, @@ -1086,12 +1086,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1101,12 +1101,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1132,12 +1132,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1163,9 +1163,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" @@ -1178,14 +1178,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1195,12 +1195,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1260,14 +1260,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1342,9 +1342,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" @@ -1483,13 +1483,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1514,12 +1514,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1529,12 +1529,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1575,29 +1575,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -1619,37 +1619,37 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", + "@babel/types": "^7.18.9", "babel-plugin-polyfill-corejs2": "^0.3.1", "babel-plugin-polyfill-corejs3": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.3.1", @@ -1749,19 +1749,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1770,9 +1770,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", - "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", @@ -2351,12 +2351,12 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, @@ -2374,9 +2374,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -14056,9 +14056,9 @@ } }, "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true }, "@babel/core": { @@ -14085,13 +14085,13 @@ } }, "@babel/generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", - "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "requires": { - "@babel/types": "^7.18.6", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, @@ -14115,12 +14115,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.6", + "@babel/compat-data": "^7.18.8", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -14168,9 +14168,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -14183,13 +14183,13 @@ } }, "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { @@ -14202,12 +14202,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { @@ -14220,19 +14220,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-optimise-call-expression": { @@ -14245,9 +14245,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -14263,16 +14263,16 @@ } }, "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-simple-access": { @@ -14285,12 +14285,12 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" } }, "@babel/helper-split-export-declaration": { @@ -14349,9 +14349,9 @@ } }, "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -14364,14 +14364,14 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -14418,12 +14418,12 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -14438,12 +14438,12 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -14468,16 +14468,16 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.18.8" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -14491,13 +14491,13 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -14707,46 +14707,46 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-dotall-regex": { @@ -14760,12 +14760,12 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -14779,32 +14779,32 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { @@ -14840,14 +14840,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -14892,9 +14892,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" @@ -14979,13 +14979,13 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { @@ -14998,21 +14998,21 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { @@ -15035,29 +15035,29 @@ } }, "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -15079,37 +15079,37 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", + "@babel/types": "^7.18.9", "babel-plugin-polyfill-corejs2": "^0.3.1", "babel-plugin-polyfill-corejs3": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.3.1", @@ -15189,27 +15189,27 @@ } }, "@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", - "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", @@ -15659,12 +15659,12 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } @@ -15676,9 +15676,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/sourcemap-codec": { diff --git a/package.json b/package.json index ad1d799f..984b76c1 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ }, "devDependencies": { "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", + "@babel/preset-env": "^7.18.9", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", From b6428197ac4297e25ffa744095a5a3043af68d63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 17:52:17 +0530 Subject: [PATCH 198/824] Bump eslint from 8.19.0 to 8.20.0 (#691) Bumps [eslint](https://github.com/eslint/eslint) from 8.19.0 to 8.20.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.19.0...v8.20.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index afd0dbf2..1f2c2c9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.19.0", + "eslint": "^8.20.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", @@ -5583,9 +5583,9 @@ } }, "node_modules/eslint": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", - "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", @@ -18283,9 +18283,9 @@ "dev": true }, "eslint": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", - "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", diff --git a/package.json b/package.json index 984b76c1..516159ea 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.19.0", + "eslint": "^8.20.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", From 88b79eb3a55fd082c366711fd6dc3441929d6a37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 17:56:48 +0530 Subject: [PATCH 199/824] Bump @babel/core from 7.18.6 to 7.18.9 (#690) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.6 to 7.18.9. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.9/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 62 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f2c2c9b..c561be2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.6", + "@babel/core": "^7.18.9", "@babel/preset-env": "^7.18.9", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", @@ -118,21 +118,21 @@ } }, "node_modules/@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -474,14 +474,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "dependencies": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -14062,21 +14062,21 @@ "dev": true }, "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14327,14 +14327,14 @@ } }, "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { diff --git a/package.json b/package.json index 516159ea..0b42f30e 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.6", + "@babel/core": "^7.18.9", "@babel/preset-env": "^7.18.9", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", From bdb8bdf76c31bb60102453fa4c7c2cff57672fb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:18:12 +0530 Subject: [PATCH 200/824] Bump cross-fetch from 3.1.4 to 3.1.5 (#512) Bumps [cross-fetch](https://github.com/lquixada/cross-fetch) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/lquixada/cross-fetch/releases) - [Commits](https://github.com/lquixada/cross-fetch/compare/v3.1.4...v3.1.5) --- updated-dependencies: - dependency-name: cross-fetch dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 80 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index c561be2e..5795aba4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4579,11 +4579,11 @@ } }, "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dependencies": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { @@ -9837,11 +9837,22 @@ "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==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-forge": { @@ -13083,6 +13094,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -13480,6 +13496,11 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "node_modules/webpack": { "version": "5.73.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", @@ -13848,6 +13869,15 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17525,11 +17555,11 @@ } }, "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "cross-spawn": { @@ -21459,9 +21489,12 @@ "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==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-forge": { "version": "1.3.1", @@ -23873,6 +23906,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -24193,6 +24231,11 @@ "minimalistic-assert": "^1.0.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "webpack": { "version": "5.73.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", @@ -24444,6 +24487,15 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", From 78e12d5beeaad3b0f1b0f84846ec16bbf19df355 Mon Sep 17 00:00:00 2001 From: Ava Pek <1592386+exodrifter@users.noreply.github.com> Date: Mon, 25 Jul 2022 01:11:56 -0500 Subject: [PATCH 201/824] Add mark as read button to space options (#667) This allows users to mark all rooms in a space as read, matching similar features found in other popular chat applications. We opted to place the mark as read button at the top of the list instead of next to the add user button like in room options since we felt this will be the most-used button in the list. Fixes #645. Co-authored-by: Maple Co-authored-by: Maple --- src/app/molecules/space-options/SpaceOptions.jsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/app/molecules/space-options/SpaceOptions.jsx b/src/app/molecules/space-options/SpaceOptions.jsx index e6b78d4c..56fdfd3f 100644 --- a/src/app/molecules/space-options/SpaceOptions.jsx +++ b/src/app/molecules/space-options/SpaceOptions.jsx @@ -5,6 +5,7 @@ import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import { openSpaceSettings, openSpaceManage, openInviteUser } from '../../../client/action/navigation'; +import { markAsRead } from '../../../client/action/notifications'; import { leave } from '../../../client/action/room'; import { createSpaceShortcut, @@ -17,6 +18,7 @@ import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; import CategoryIC from '../../../../public/res/ic/outlined/category.svg'; import CategoryFilledIC from '../../../../public/res/ic/filled/category.svg'; +import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; import HashSearchIC from '../../../../public/res/ic/outlined/hash-search.svg'; @@ -28,11 +30,21 @@ import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; function SpaceOptions({ roomId, afterOptionSelect }) { const mx = initMatrix.matrixClient; + const { roomList } = initMatrix; const room = mx.getRoom(roomId); const canInvite = room?.canInvite(mx.getUserId()); const isPinned = initMatrix.accountData.spaceShortcut.has(roomId); const isCategorized = initMatrix.accountData.categorizedSpaces.has(roomId); + const handleMarkAsRead = () => { + const spaceChildren = roomList.getCategorizedSpaces([roomId]); + spaceChildren?.forEach((childIds, spaceId) => { + childIds?.forEach((childId) => { + markAsRead(childId); + }) + }); + afterOptionSelect(); + }; const handleInviteClick = () => { openInviteUser(roomId); afterOptionSelect(); @@ -71,6 +83,7 @@ function SpaceOptions({ roomId, afterOptionSelect }) { return (
    {twemojify(`Options for ${initMatrix.matrixClient.getRoom(roomId)?.name}`)} + Mark as read Date: Wed, 27 Jul 2022 14:03:41 +0530 Subject: [PATCH 202/824] Bump nginx from 1.23.0-alpine to 1.23.1-alpine (#694) Bumps nginx from 1.23.0-alpine to 1.23.1-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a1066da1..ea1b96f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN npm run build ## App -FROM nginx:1.23.0-alpine +FROM nginx:1.23.1-alpine COPY --from=builder /src/dist /app From 48793f3a9501c83ce1d9f87fc46090ac82a9f264 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Jul 2022 14:04:59 +0530 Subject: [PATCH 203/824] Bump docker/build-push-action from 3.0.0 to 3.1.0 (#695) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3.0.0...v3.1.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 4daf0aae..5e4f2fc5 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Build Docker image - uses: docker/build-push-action@v3.0.0 + uses: docker/build-push-action@v3.1.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index ee80ea85..857f9363 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -86,7 +86,7 @@ jobs: with: images: ajbura/cinny - name: Build and push Docker image - uses: docker/build-push-action@v3.0.0 + uses: docker/build-push-action@v3.1.0 with: context: . platforms: linux/amd64,linux/arm64 From 9ba003b16d67a23c053e8f0dfa38fb12afa4caf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:12:15 +0530 Subject: [PATCH 204/824] Bump @babel/preset-env from 7.18.9 to 7.18.10 (#707) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.9 to 7.18.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.10/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 429 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 239 insertions(+), 192 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5795aba4..24233246 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@babel/core": "^7.18.9", - "@babel/preset-env": "^7.18.9", + "@babel/preset-env": "^7.18.10", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", @@ -148,12 +148,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9", + "@babel/types": "^7.18.10", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -242,15 +242,13 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -371,15 +369,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -440,6 +438,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", @@ -459,15 +466,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", + "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" @@ -502,9 +509,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", + "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -546,14 +553,14 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1544,12 +1551,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1575,9 +1582,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", - "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.18.8", @@ -1586,7 +1593,7 @@ "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1646,13 +1653,13 @@ "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, @@ -1735,33 +1742,33 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", + "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", + "@babel/generator": "^7.18.10", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1770,11 +1777,12 @@ } }, "node_modules/@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", "dev": true, "dependencies": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, @@ -3367,13 +3375,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" }, "peerDependencies": { @@ -3381,12 +3389,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" }, "peerDependencies": { @@ -3394,12 +3402,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", + "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -3755,9 +3763,9 @@ ] }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "funding": [ { @@ -3770,11 +3778,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" }, "bin": { "browserslist": "cli.js" @@ -3911,9 +3918,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", "dev": true, "funding": [ { @@ -4497,12 +4504,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", - "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", "dev": true, "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "funding": { @@ -5351,9 +5358,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.129", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", - "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==", + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", "dev": true }, "node_modules/elliptic": { @@ -8801,7 +8808,7 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.defaultsdeep": { @@ -9865,9 +9872,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "node_modules/normalize-path": { @@ -13305,6 +13312,32 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14115,12 +14148,12 @@ } }, "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", "dev": true, "requires": { - "@babel/types": "^7.18.9", + "@babel/types": "^7.18.10", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } @@ -14182,15 +14215,13 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -14281,15 +14312,15 @@ "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { @@ -14332,6 +14363,12 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", @@ -14345,15 +14382,15 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", + "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/helpers": { @@ -14379,9 +14416,9 @@ } }, "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", + "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -14405,14 +14442,14 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -15046,12 +15083,12 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { @@ -15065,9 +15102,9 @@ } }, "@babel/preset-env": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", - "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", "dev": true, "requires": { "@babel/compat-data": "^7.18.8", @@ -15076,7 +15113,7 @@ "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -15136,13 +15173,13 @@ "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", "core-js-compat": "^3.22.1", "semver": "^6.3.0" } @@ -15208,40 +15245,41 @@ } }, "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", + "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", + "@babel/generator": "^7.18.10", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", "dev": true, "requires": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } @@ -16570,33 +16608,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", + "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.2" } }, "babel-polyfill": { @@ -16902,16 +16940,15 @@ } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "bs58": { @@ -17016,9 +17053,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", "dev": true }, "caseless": { @@ -17481,12 +17518,12 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", - "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", "dev": true, "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "dependencies": { @@ -18128,9 +18165,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.129", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", - "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==", + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", "dev": true }, "elliptic": { @@ -20792,7 +20829,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "lodash.defaultsdeep": { @@ -21503,9 +21540,9 @@ "dev": true }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "normalize-path": { @@ -24067,6 +24104,16 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 0b42f30e..eb5681a7 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ }, "devDependencies": { "@babel/core": "^7.18.9", - "@babel/preset-env": "^7.18.9", + "@babel/preset-env": "^7.18.10", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", "babel-loader": "^8.2.5", From abfe263750511fecdc73a0aa5b942790b980e499 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:18:22 +0530 Subject: [PATCH 205/824] Bump @babel/core from 7.18.9 to 7.18.10 (#705) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.9 to 7.18.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.18.10/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24233246..2dd619ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.9", + "@babel/core": "^7.18.10", "@babel/preset-env": "^7.18.10", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", @@ -118,21 +118,21 @@ } }, "node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", + "@babel/generator": "^7.18.10", "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-module-transforms": "^7.18.9", "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14125,21 +14125,21 @@ "dev": true }, "@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", + "@babel/generator": "^7.18.10", "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-module-transforms": "^7.18.9", "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", diff --git a/package.json b/package.json index eb5681a7..91430246 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "twemoji": "^14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.9", + "@babel/core": "^7.18.10", "@babel/preset-env": "^7.18.10", "@babel/preset-react": "^7.18.6", "assert": "^2.0.0", From 48f34053ab64ad7d63d11b315fd0743ac5a5c50c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:21:10 +0530 Subject: [PATCH 206/824] Bump eslint from 8.20.0 to 8.21.0 (#704) Bumps [eslint](https://github.com/eslint/eslint) from 8.20.0 to 8.21.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.20.0...v8.21.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 254 ++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 224 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2dd619ee..d988e2d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.20.0", + "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", @@ -1845,9 +1845,9 @@ "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1858,6 +1858,16 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -2947,9 +2957,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3177,6 +3187,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -5590,13 +5609,14 @@ } }, "node_modules/eslint": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", - "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -5606,14 +5626,17 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.3.3", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -6000,6 +6023,22 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/globals": { "version": "13.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", @@ -6015,6 +6054,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6024,6 +6083,54 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/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/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6037,17 +6144,20 @@ } }, "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "dev": true, "dependencies": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { @@ -7046,6 +7156,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -15329,9 +15445,9 @@ "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" }, "@humanwhocodes/config-array": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -15339,6 +15455,12 @@ "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -16267,9 +16389,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-jsx": { @@ -16451,6 +16573,12 @@ "is-string": "^1.0.7" } }, + "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 + }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -18350,13 +18478,14 @@ "dev": true }, "eslint": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", - "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -18366,14 +18495,17 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.3.3", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -18442,6 +18574,16 @@ "estraverse": "^5.2.0" } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "globals": { "version": "13.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", @@ -18451,12 +18593,56 @@ "type-fest": "^0.20.2" } }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "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 }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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 + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18695,12 +18881,12 @@ "dev": true }, "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "dev": true, "requires": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -19498,6 +19684,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", diff --git a/package.json b/package.json index 91430246..8317b1da 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.20.0", + "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.0", From 6e418337cc1237ce806a612957304a5d7af18261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:23:17 +0530 Subject: [PATCH 207/824] Bump eslint-plugin-jsx-a11y from 6.6.0 to 6.6.1 (#699) Bumps [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y) from 6.6.0 to 6.6.1. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/compare/v6.6.0...v6.6.1) --- updated-dependencies: - dependency-name: eslint-plugin-jsx-a11y dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 64 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index d988e2d6..a98456e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,7 @@ "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", @@ -1707,9 +1707,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -3351,12 +3351,12 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "node_modules/axe-core": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", - "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", + "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", "dev": true, "engines": { - "node": ">=12" + "node": ">=4" } }, "node_modules/axobject-query": { @@ -5800,21 +5800,21 @@ "dev": true }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", - "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", "dev": true, "dependencies": { - "@babel/runtime": "^7.18.3", + "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.2", + "axe-core": "^4.4.3", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.1", + "jsx-ast-utils": "^3.3.2", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" @@ -8522,9 +8522,9 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", - "integrity": "sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", + "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -15328,9 +15328,9 @@ } }, "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -16703,9 +16703,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axe-core": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", - "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", + "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", "dev": true }, "axobject-query": { @@ -18769,21 +18769,21 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", - "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", "dev": true, "requires": { - "@babel/runtime": "^7.18.3", + "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.2", + "axe-core": "^4.4.3", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.1", + "jsx-ast-utils": "^3.3.2", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" @@ -20667,9 +20667,9 @@ } }, "jsx-ast-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", - "integrity": "sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", + "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", "dev": true, "requires": { "array-includes": "^3.1.5", diff --git a/package.json b/package.json index 8317b1da..b9b8a69b 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", From 21e6049c1687bf66d8376cd0158e158871d9eca5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:25:02 +0530 Subject: [PATCH 208/824] Bump sanitize-html from 2.7.0 to 2.7.1 (#698) Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.7.0 to 2.7.1. - [Release notes](https://github.com/apostrophecms/sanitize-html/releases) - [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md) - [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.7.0...2.7.1) --- updated-dependencies: - dependency-name: sanitize-html dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a98456e1..da4c21d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.15.1", - "sanitize-html": "^2.7.0", + "sanitize-html": "^2.7.1", "tippy.js": "^6.3.7", "twemoji": "^14.0.2" }, @@ -12050,9 +12050,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", - "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", + "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -23258,9 +23258,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", - "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", + "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", diff --git a/package.json b/package.json index b9b8a69b..1e6fc69e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "react-dom": "^17.0.2", "react-google-recaptcha": "^2.1.0", "react-modal": "^3.15.1", - "sanitize-html": "^2.7.0", + "sanitize-html": "^2.7.1", "tippy.js": "^6.3.7", "twemoji": "^14.0.2" }, From c78a39af501754fdd82fcfdd68b5fef5cd897c58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:27:07 +0530 Subject: [PATCH 209/824] Bump webpack from 5.73.0 to 5.74.0 (#696) Bumps [webpack](https://github.com/webpack/webpack) from 5.73.0 to 5.74.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.73.0...v5.74.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index da4c21d7..c091e59b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.73.0", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.7.3" @@ -5459,9 +5459,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -13624,9 +13624,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -13651,9 +13651,9 @@ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "node_modules/webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13661,11 +13661,11 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -13678,7 +13678,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -18361,9 +18361,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -24452,9 +24452,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -24476,9 +24476,9 @@ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -24486,11 +24486,11 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -24503,7 +24503,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { diff --git a/package.json b/package.json index 1e6fc69e..3fddccf4 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "style-loader": "^3.3.1", "url": "^0.11.0", "util": "^0.12.4", - "webpack": "^5.73.0", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.7.3" From febb28e9c424bfd7f0a4146bab08eb26bf43bf75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:28:54 +0530 Subject: [PATCH 210/824] Bump katex from 0.15.6 to 0.16.0 (#616) * Bump katex from 0.15.6 to 0.16.0 Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.15.6 to 0.16.0. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.15.6...v0.16.0) --- updated-dependencies: - dependency-name: katex dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Remove copy-tex.css as it no longer required Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- src/app/atoms/math/Math.jsx | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c091e59b..51ea8f2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^2.0.0", - "katex": "^0.15.6", + "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", "matrix-js-sdk": "^18.1.0", @@ -8535,9 +8535,9 @@ } }, "node_modules/katex": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", - "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.0.tgz", + "integrity": "sha512-wPRB4iUPysfH97wTgG5/tRLYxmKVq6Q4jRAWRVOUxXB1dsiv4cvcNjqabHkrOvJHM1Bpk3WrgmllSO1vIvP24w==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -20677,9 +20677,9 @@ } }, "katex": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", - "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.0.tgz", + "integrity": "sha512-wPRB4iUPysfH97wTgG5/tRLYxmKVq6Q4jRAWRVOUxXB1dsiv4cvcNjqabHkrOvJHM1Bpk3WrgmllSO1vIvP24w==", "requires": { "commander": "^8.0.0" } diff --git a/package.json b/package.json index 3fddccf4..988a3b6c 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "flux": "^4.0.3", "formik": "^2.2.9", "html-react-parser": "^2.0.0", - "katex": "^0.15.6", + "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", "matrix-js-sdk": "^18.1.0", diff --git a/src/app/atoms/math/Math.jsx b/src/app/atoms/math/Math.jsx index dcfd0212..87f85899 100644 --- a/src/app/atoms/math/Math.jsx +++ b/src/app/atoms/math/Math.jsx @@ -5,7 +5,6 @@ import katex from 'katex'; import 'katex/dist/katex.min.css'; import 'katex/dist/contrib/copy-tex'; -import 'katex/dist/contrib/copy-tex.css'; const Math = React.memo(({ content, throwOnError, errorColor, displayMode, From a478fc4805ac6e613ad9b02c6389f2706f66c7df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:33:54 +0530 Subject: [PATCH 211/824] Bump sass from 1.53.0 to 1.54.1 (#712) Bumps [sass](https://github.com/sass/dart-sass) from 1.53.0 to 1.54.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.53.0...1.54.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51ea8f2b..4a5aefff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.53.0", + "sass": "^1.54.1", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -12090,9 +12090,9 @@ } }, "node_modules/sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.1.tgz", + "integrity": "sha512-GHJJr31Me32RjjUBagyzx8tzjKBUcDwo5239XANIRBq0adDu5iIG0aFO0i/TBb/4I9oyxkEv44nq/kL1DxdDhA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23288,9 +23288,9 @@ } }, "sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.1.tgz", + "integrity": "sha512-GHJJr31Me32RjjUBagyzx8tzjKBUcDwo5239XANIRBq0adDu5iIG0aFO0i/TBb/4I9oyxkEv44nq/kL1DxdDhA==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 988a3b6c..cb79b782 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.53.0", + "sass": "^1.54.1", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From fa4c95a9b6249f6cc54f5fbd89f58290f0a23c7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:36:36 +0530 Subject: [PATCH 212/824] Bump html-loader from 3.1.2 to 4.1.0 (#677) Bumps [html-loader](https://github.com/webpack-contrib/html-loader) from 3.1.2 to 4.1.0. - [Release notes](https://github.com/webpack-contrib/html-loader/releases) - [Changelog](https://github.com/webpack-contrib/html-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/html-loader/compare/v3.1.2...v4.1.0) --- updated-dependencies: - dependency-name: html-loader dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 65 ++++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a5aefff..252c459c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", - "html-loader": "^3.1.2", + "html-loader": "^4.1.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", @@ -7421,16 +7421,16 @@ "dev": true }, "node_modules/html-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.2.tgz", - "integrity": "sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", + "integrity": "sha512-QDDNmLgn96NWtTPx/VXRerFXH0hn7cm4bruqsZ333GCb+rqiqGurcxtP/M52wcui1/iLiu0l5ms/McE7/Ik6aQ==", "dev": true, "dependencies": { - "html-minifier-terser": "^6.0.2", - "parse5": "^6.0.1" + "html-minifier-terser": "^6.1.0", + "parse5": "^7.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -7440,6 +7440,30 @@ "webpack": "^5.0.0" } }, + "node_modules/html-loader/node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/html-loader/node_modules/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19891,13 +19915,30 @@ "dev": true }, "html-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.2.tgz", - "integrity": "sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", + "integrity": "sha512-QDDNmLgn96NWtTPx/VXRerFXH0hn7cm4bruqsZ333GCb+rqiqGurcxtP/M52wcui1/iLiu0l5ms/McE7/Ik6aQ==", "dev": true, "requires": { - "html-minifier-terser": "^6.0.2", - "parse5": "^6.0.1" + "html-minifier-terser": "^6.1.0", + "parse5": "^7.0.0" + }, + "dependencies": { + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true + }, + "parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "requires": { + "entities": "^4.3.0" + } + } } }, "html-minifier-terser": { diff --git a/package.json b/package.json index cb79b782..918c9f04 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "favicons": "^6.2.2", "favicons-webpack-plugin": "^5.0.2", - "html-loader": "^3.1.2", + "html-loader": "^4.1.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", From f8b8a35152dc4542cabe3a0f7f8d18399af6ec84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 19:52:50 +0530 Subject: [PATCH 213/824] Bump html-react-parser from 2.0.0 to 3.0.1 (#675) Bumps [html-react-parser](https://github.com/remarkablemark/html-react-parser) from 2.0.0 to 3.0.1. - [Release notes](https://github.com/remarkablemark/html-react-parser/releases) - [Changelog](https://github.com/remarkablemark/html-react-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/remarkablemark/html-react-parser/compare/v2.0.0...v3.0.1) --- updated-dependencies: - dependency-name: html-react-parser dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 186 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 140 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 252c459c..29a0520f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^2.0.0", + "html-react-parser": "^3.0.1", "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", @@ -5314,9 +5314,9 @@ "dev": true }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -7377,18 +7377,58 @@ } }, "node_modules/html-dom-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-2.0.0.tgz", - "integrity": "sha512-PwVjg12yfWunpH2WjwjaYNKcZyKKm20kclTfMQohiRzfgYiXX0dR7nXIIKnHneghMDvB0rKFZLEAe11ykOfpcg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.0.1.tgz", + "integrity": "sha512-BtPGWyE2XGbqQFdZE+0/YMVppz319jvvkNGcMwLRmt1Mw0tLHzZOMs1TqbxtcCdVSZwS5pEOXasaD7HHD5iwkQ==", "dependencies": { - "domhandler": "4.3.1", - "htmlparser2": "7.2.0" + "domhandler": "5.0.3", + "htmlparser2": "8.0.1" + } + }, + "node_modules/html-dom-parser/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/html-dom-parser/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/html-dom-parser/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/html-dom-parser/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", "engines": { "node": ">=0.12" }, @@ -7397,9 +7437,9 @@ } }, "node_modules/html-dom-parser/node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -7408,10 +7448,10 @@ } ], "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "node_modules/html-entities": { @@ -7486,12 +7526,12 @@ } }, "node_modules/html-react-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-2.0.0.tgz", - "integrity": "sha512-AI1lhybWGi8w4QkGtEIS3iSGAjeFGaonxl/+CzqzCeNT3g3z/yx2NKsA93trnv2BLjhe+juGLmLeTSUkyYWk9Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.1.tgz", + "integrity": "sha512-TsCwwmpqN8F2JA0EqWK/8U/cN07BfZU7agH3FY5G+RQqLs6HT2z2RNlFZI+Jp8e/nIXIsgYDvt8vqu8Dv9lr6w==", "dependencies": { - "domhandler": "4.3.1", - "html-dom-parser": "2.0.0", + "domhandler": "5.0.3", + "html-dom-parser": "3.0.1", "react-property": "2.0.0", "style-to-js": "1.1.1" }, @@ -7499,6 +7539,20 @@ "react": "0.14 || 15 || 16 || 17 || 18" } }, + "node_modules/html-react-parser/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, "node_modules/html-webpack-plugin": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", @@ -18269,9 +18323,9 @@ "dev": true }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "4.3.1", @@ -19882,28 +19936,56 @@ } }, "html-dom-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-2.0.0.tgz", - "integrity": "sha512-PwVjg12yfWunpH2WjwjaYNKcZyKKm20kclTfMQohiRzfgYiXX0dR7nXIIKnHneghMDvB0rKFZLEAe11ykOfpcg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.0.1.tgz", + "integrity": "sha512-BtPGWyE2XGbqQFdZE+0/YMVppz319jvvkNGcMwLRmt1Mw0tLHzZOMs1TqbxtcCdVSZwS5pEOXasaD7HHD5iwkQ==", "requires": { - "domhandler": "4.3.1", - "htmlparser2": "7.2.0" + "domhandler": "5.0.3", + "htmlparser2": "8.0.1" }, "dependencies": { - "entities": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" }, "htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } } } @@ -19957,14 +20039,24 @@ } }, "html-react-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-2.0.0.tgz", - "integrity": "sha512-AI1lhybWGi8w4QkGtEIS3iSGAjeFGaonxl/+CzqzCeNT3g3z/yx2NKsA93trnv2BLjhe+juGLmLeTSUkyYWk9Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.1.tgz", + "integrity": "sha512-TsCwwmpqN8F2JA0EqWK/8U/cN07BfZU7agH3FY5G+RQqLs6HT2z2RNlFZI+Jp8e/nIXIsgYDvt8vqu8Dv9lr6w==", "requires": { - "domhandler": "4.3.1", - "html-dom-parser": "2.0.0", + "domhandler": "5.0.3", + "html-dom-parser": "3.0.1", "react-property": "2.0.0", "style-to-js": "1.1.1" + }, + "dependencies": { + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + } } }, "html-webpack-plugin": { diff --git a/package.json b/package.json index 918c9f04..698da860 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "flux": "^4.0.3", "formik": "^2.2.9", - "html-react-parser": "^2.0.0", + "html-react-parser": "^3.0.1", "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", From 1d90f7588b0f1be90b13584ee91e8b079bd9793b Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Wed, 3 Aug 2022 16:29:56 +0200 Subject: [PATCH 214/824] Allow removing the room name (#702) --- src/app/molecules/room-profile/RoomProfile.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/room-profile/RoomProfile.jsx b/src/app/molecules/room-profile/RoomProfile.jsx index 96e84076..21811984 100644 --- a/src/app/molecules/room-profile/RoomProfile.jsx +++ b/src/app/molecules/room-profile/RoomProfile.jsx @@ -132,7 +132,7 @@ function RoomProfile({ roomId }) { const renderEditNameAndTopic = () => ( - {canChangeName && } + {canChangeName && } {canChangeTopic && } {(!canChangeName || !canChangeTopic) && {`You have permission to change ${room.isSpaceRoom() ? 'space' : 'room'} ${canChangeName ? 'name' : 'topic'} only.`}} { status.type === cons.status.IN_FLIGHT && {status.msg}} From 5e527e434a3b2af531d581563b9e744b189a7786 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Fri, 5 Aug 2022 15:42:25 +0200 Subject: [PATCH 215/824] Fix shortcuts on non QWERTY keyboards (#715) * Use key instead of keyCode or code * Use key for Escape --- src/app/molecules/message/Message.jsx | 6 +++--- src/app/organisms/room/RoomViewCmdBar.jsx | 4 ++-- src/app/organisms/room/RoomViewInput.jsx | 6 ++---- src/client/event/hotkeys.js | 6 +++--- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 6950cb48..c1370ec3 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -162,8 +162,8 @@ const MessageReplyWrapper = React.memo(({ roomTimeline, eventId }) => { }, []); const focusReply = (ev) => { - if (!ev.keyCode || ev.keyCode === 32 || ev.keyCode === 13) { - if (ev.keyCode) ev.preventDefault(); + if (!ev.key || ev.key === ' ' || ev.key === 'Enter') { + if (ev.key) ev.preventDefault(); if (reply?.event === null) return; if (reply?.event.isRedacted()) return; roomTimeline.loadEventTimeline(eventId); @@ -277,7 +277,7 @@ function MessageEdit({ body, onSave, onCancel }) { }, []); const handleKeyDown = (e) => { - if (e.keyCode === 13 && e.shiftKey === false) { + if (e.key === 'Enter' && e.shiftKey === false) { e.preventDefault(); onSave(editInputRef.current.value); } diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index 5bbc0aae..9c47024d 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -256,11 +256,11 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { function listenKeyboard(event) { const { activeElement } = document; const lastCmdItem = document.activeElement.parentNode.lastElementChild; - if (event.keyCode === 27) { + if (event.key === 'Escape') { if (activeElement.className !== 'cmd-item') return; viewEvent.emit('focus_msg_input'); } - if (event.keyCode === 9) { + if (event.key === 'Tab') { if (lastCmdItem.className !== 'cmd-item') return; if (lastCmdItem !== activeElement) return; if (event.shiftKey) return; diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 37e02989..704dd9af 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -128,9 +128,7 @@ function RoomViewInput({ } function firedCmd(cmdData) { const msg = textAreaRef.current.value; - textAreaRef.current.value = replaceCmdWith( - msg, cmdCursorPos, typeof cmdData?.replace !== 'undefined' ? cmdData.replace : '', - ); + textAreaRef.current.value = replaceCmdWith(msg, cmdCursorPos, typeof cmdData?.replace !== 'undefined' ? cmdData.replace : ''); deactivateCmd(); } @@ -254,7 +252,7 @@ function RoomViewInput({ }; const handleKeyDown = (e) => { - if (e.keyCode === 13 && e.shiftKey === false) { + if (e.key === 'Enter' && e.shiftKey === false) { e.preventDefault(); sendMessage(); } diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 22170653..e59ce3d7 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -31,14 +31,14 @@ function listenKeyboard(event) { // Ctrl/Cmd + if (event.ctrlKey || event.metaKey) { // open search modal - if (event.code === 'KeyK') { + if (event.key === 'k') { event.preventDefault(); if (navigation.isRawModalVisible) return; openSearch(); } // focus message field on paste - if (event.code === 'KeyV') { + if (event.key === 'v') { if (navigation.isRawModalVisible) return; const msgTextarea = document.getElementById('message-textarea'); const { activeElement } = document; @@ -52,7 +52,7 @@ function listenKeyboard(event) { if (!event.ctrlKey && !event.altKey && !event.metaKey) { if (navigation.isRawModalVisible) return; - if (event.code === 'Escape') { + if (event.key === 'Escape') { if (navigation.isRoomSettings) { toggleRoomSettings(); return; From edace3221384fa1d254d3d92d444177eb1813227 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 6 Aug 2022 09:04:23 +0530 Subject: [PATCH 216/824] Custom emoji & Sticker support (#686) * Remove comments * Show custom emoji first in suggestions * Show global image packs in emoji picker * Display emoji and sticker in room settings * Fix some pack not visible in emojiboard * WIP * Add/delete/rename images to exisitng packs * Change pack avatar, name & attribution * Add checkbox to make pack global * Bug fix * Create or delete pack * Add personal emoji in settings * Show global pack selector in settings * Show space emoji in emojiboard * Send custom emoji reaction as mxc * Render stickers as stickers * Fix sticker jump bug * Fix reaction width * Fix stretched custom emoji * Fix sending space emoji in message * Remove unnessesary comments * Send user pills * Fix pill generating regex * Add support for sending stickers --- public/res/ic/outlined/sticker.svg | 4 + src/app/atoms/button/Button.scss | 8 +- src/app/molecules/image-pack/ImagePack.jsx | 469 ++++++++++++++++++ src/app/molecules/image-pack/ImagePack.scss | 47 ++ .../molecules/image-pack/ImagePackItem.jsx | 76 +++ .../molecules/image-pack/ImagePackItem.scss | 43 ++ .../molecules/image-pack/ImagePackProfile.jsx | 125 +++++ .../image-pack/ImagePackProfile.scss | 37 ++ .../molecules/image-pack/ImagePackUpload.jsx | 73 +++ .../molecules/image-pack/ImagePackUpload.scss | 43 ++ .../image-pack/ImagePackUsageSelector.jsx | 41 ++ .../molecules/image-upload/ImageUpload.jsx | 14 +- src/app/molecules/media/Media.jsx | 46 +- src/app/molecules/media/Media.scss | 9 + src/app/molecules/message/Message.jsx | 54 +- src/app/molecules/message/Message.scss | 1 - src/app/molecules/room-emojis/RoomEmojis.jsx | 130 +++++ src/app/molecules/room-emojis/RoomEmojis.scss | 29 ++ src/app/organisms/emoji-board/EmojiBoard.jsx | 42 +- src/app/organisms/emoji-board/EmojiBoard.scss | 2 + src/app/organisms/emoji-board/custom-emoji.js | 286 +++++++---- src/app/organisms/room/RoomSettings.jsx | 14 +- src/app/organisms/room/RoomViewCmdBar.jsx | 14 +- src/app/organisms/room/RoomViewInput.jsx | 61 ++- src/app/organisms/settings/Settings.jsx | 17 + src/app/organisms/settings/Settings.scss | 3 +- .../space-settings/SpaceSettings.jsx | 8 + .../organisms/sticker-board/StickerBoard.jsx | 88 ++++ .../organisms/sticker-board/StickerBoard.scss | 60 +++ src/client/action/roomTimeline.js | 19 +- src/client/initMatrix.js | 2 +- src/client/state/RoomsInput.js | 60 +-- src/util/common.js | 59 +++ 33 files changed, 1781 insertions(+), 203 deletions(-) create mode 100644 public/res/ic/outlined/sticker.svg create mode 100644 src/app/molecules/image-pack/ImagePack.jsx create mode 100644 src/app/molecules/image-pack/ImagePack.scss create mode 100644 src/app/molecules/image-pack/ImagePackItem.jsx create mode 100644 src/app/molecules/image-pack/ImagePackItem.scss create mode 100644 src/app/molecules/image-pack/ImagePackProfile.jsx create mode 100644 src/app/molecules/image-pack/ImagePackProfile.scss create mode 100644 src/app/molecules/image-pack/ImagePackUpload.jsx create mode 100644 src/app/molecules/image-pack/ImagePackUpload.scss create mode 100644 src/app/molecules/image-pack/ImagePackUsageSelector.jsx create mode 100644 src/app/molecules/room-emojis/RoomEmojis.jsx create mode 100644 src/app/molecules/room-emojis/RoomEmojis.scss create mode 100644 src/app/organisms/sticker-board/StickerBoard.jsx create mode 100644 src/app/organisms/sticker-board/StickerBoard.scss diff --git a/public/res/ic/outlined/sticker.svg b/public/res/ic/outlined/sticker.svg new file mode 100644 index 00000000..bc486e5e --- /dev/null +++ b/public/res/ic/outlined/sticker.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/app/atoms/button/Button.scss b/src/app/atoms/button/Button.scss index 7b12195c..e1a01bb0 100644 --- a/src/app/atoms/button/Button.scss +++ b/src/app/atoms/button/Button.scss @@ -26,10 +26,10 @@ &--icon { @include dir.side(padding, var(--sp-tight), var(--sp-loose)); - .ic-raw { - @include dir.side(margin, 0, var(--sp-extra-tight)); - flex-shrink: 0; - } + } + .ic-raw { + @include dir.side(margin, 0, var(--sp-extra-tight)); + flex-shrink: 0; } } diff --git a/src/app/molecules/image-pack/ImagePack.jsx b/src/app/molecules/image-pack/ImagePack.jsx new file mode 100644 index 00000000..725291d1 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePack.jsx @@ -0,0 +1,469 @@ +import React, { + useState, useMemo, useReducer, useEffect, +} from 'react'; +import PropTypes from 'prop-types'; +import './ImagePack.scss'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableDialog } from '../../../client/action/navigation'; +import { suffixRename } from '../../../util/common'; + +import Button from '../../atoms/button/Button'; +import Text from '../../atoms/text/Text'; +import Input from '../../atoms/input/Input'; +import Checkbox from '../../atoms/button/Checkbox'; +import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; + +import { ImagePack as ImagePackBuilder } from '../../organisms/emoji-board/custom-emoji'; +import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; +import ImagePackProfile from './ImagePackProfile'; +import ImagePackItem from './ImagePackItem'; +import ImagePackUpload from './ImagePackUpload'; + +const renameImagePackItem = (shortcode) => new Promise((resolve) => { + let isCompleted = false; + + openReusableDialog( + Rename, + (requestClose) => ( +
    + { + e.preventDefault(); + const sc = e.target.shortcode.value; + if (sc.trim() === '') return; + isCompleted = true; + resolve(sc.trim()); + requestClose(); + }} + > + +
    + + +
    + ), + () => { + if (!isCompleted) resolve(null); + }, + ); +}); + +function getUsage(usage) { + if (usage.includes('emoticon') && usage.includes('sticker')) return 'both'; + if (usage.includes('emoticon')) return 'emoticon'; + if (usage.includes('sticker')) return 'sticker'; + + return 'both'; +} + +function isGlobalPack(roomId, stateKey) { + const mx = initMatrix.matrixClient; + const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent(); + if (typeof globalContent !== 'object') return false; + + const { rooms } = globalContent; + if (typeof rooms !== 'object') return false; + + return rooms[roomId]?.[stateKey] !== undefined; +} + +function useRoomImagePack(roomId, stateKey) { + const mx = initMatrix.matrixClient; + const room = mx.getRoom(roomId); + + const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); + const pack = useMemo(() => ( + ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()) + ), [room, stateKey]); + + const sendPackContent = (content) => { + mx.sendStateEvent(roomId, 'im.ponies.room_emotes', content, stateKey); + }; + + return { + pack, + sendPackContent, + }; +} + +function useUserImagePack() { + const mx = initMatrix.matrixClient; + const packEvent = mx.getAccountData('im.ponies.user_emotes'); + const pack = useMemo(() => ( + ImagePackBuilder.parsePack(mx.getUserId(), packEvent?.getContent() ?? { + pack: { display_name: 'Personal' }, + images: {}, + }) + ), []); + + const sendPackContent = (content) => { + mx.setAccountData('im.ponies.user_emotes', content); + }; + + return { + pack, + sendPackContent, + }; +} + +function useImagePackHandles(pack, sendPackContent) { + const [, forceUpdate] = useReducer((count) => count + 1, 0); + + const getNewKey = (key) => { + if (typeof key !== 'string') return undefined; + let newKey = key?.replace(/\s/g, '-'); + if (pack.getImages().get(newKey)) { + newKey = suffixRename( + newKey, + (suffixedKey) => pack.getImages().get(suffixedKey), + ); + } + return newKey; + }; + + const handleAvatarChange = (url) => { + pack.setAvatarUrl(url); + sendPackContent(pack.getContent()); + forceUpdate(); + }; + const handleEditProfile = (name, attribution) => { + pack.setDisplayName(name); + pack.setAttribution(attribution); + sendPackContent(pack.getContent()); + forceUpdate(); + }; + const handleUsageChange = (newUsage) => { + const usage = []; + if (newUsage === 'emoticon' || newUsage === 'both') usage.push('emoticon'); + if (newUsage === 'sticker' || newUsage === 'both') usage.push('sticker'); + pack.setUsage(usage); + pack.getImages().forEach((img) => pack.setImageUsage(img.shortcode, undefined)); + + sendPackContent(pack.getContent()); + forceUpdate(); + }; + + const handleRenameItem = async (key) => { + const newKey = getNewKey(await renameImagePackItem(key)); + + if (!newKey || newKey === key) return; + pack.updateImageKey(key, newKey); + + sendPackContent(pack.getContent()); + forceUpdate(); + }; + const handleDeleteItem = async (key) => { + const isConfirmed = await confirmDialog( + 'Delete', + `Are you sure that you want to delete "${key}"?`, + 'Delete', + 'danger', + ); + if (!isConfirmed) return; + pack.removeImage(key); + + sendPackContent(pack.getContent()); + forceUpdate(); + }; + const handleUsageItem = (key, newUsage) => { + const usage = []; + if (newUsage === 'emoticon' || newUsage === 'both') usage.push('emoticon'); + if (newUsage === 'sticker' || newUsage === 'both') usage.push('sticker'); + pack.setImageUsage(key, usage); + + sendPackContent(pack.getContent()); + forceUpdate(); + }; + const handleAddItem = (key, url) => { + const newKey = getNewKey(key); + if (!newKey || !url) return; + + pack.addImage(newKey, { + url, + }); + + sendPackContent(pack.getContent()); + forceUpdate(); + }; + + return { + handleAvatarChange, + handleEditProfile, + handleUsageChange, + handleRenameItem, + handleDeleteItem, + handleUsageItem, + handleAddItem, + }; +} + +function addGlobalImagePack(mx, roomId, stateKey) { + const content = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? {}; + if (!content.rooms) content.rooms = {}; + if (!content.rooms[roomId]) content.rooms[roomId] = {}; + content.rooms[roomId][stateKey] = {}; + return mx.setAccountData('im.ponies.emote_rooms', content); +} +function removeGlobalImagePack(mx, roomId, stateKey) { + const content = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? {}; + if (!content.rooms) return Promise.resolve(); + if (!content.rooms[roomId]) return Promise.resolve(); + delete content.rooms[roomId][stateKey]; + if (Object.keys(content.rooms[roomId]).length === 0) { + delete content.rooms[roomId]; + } + return mx.setAccountData('im.ponies.emote_rooms', content); +} + +function ImagePack({ roomId, stateKey, handlePackDelete }) { + const mx = initMatrix.matrixClient; + const room = mx.getRoom(roomId); + const [viewMore, setViewMore] = useState(false); + const [isGlobal, setIsGlobal] = useState(isGlobalPack(roomId, stateKey)); + + const { pack, sendPackContent } = useRoomImagePack(roomId, stateKey); + + const { + handleAvatarChange, + handleEditProfile, + handleUsageChange, + handleRenameItem, + handleDeleteItem, + handleUsageItem, + handleAddItem, + } = useImagePackHandles(pack, sendPackContent); + + const handleGlobalChange = (isG) => { + setIsGlobal(isG); + if (isG) addGlobalImagePack(mx, roomId, stateKey); + else removeGlobalImagePack(mx, roomId, stateKey); + }; + + const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; + const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); + + const handleDeletePack = async () => { + const isConfirmed = await confirmDialog( + 'Delete Pack', + `Are you sure that you want to delete "${pack.displayName}"?`, + 'Delete', + 'danger', + ); + if (!isConfirmed) return; + handlePackDelete(stateKey); + }; + + const images = [...pack.images].slice(0, viewMore ? pack.images.size : 2); + + return ( +
    + + { canChange && ( + + )} + { images.length === 0 ? null : ( +
    +
    + Image + Shortcode + Usage +
    + {images.map(([shortcode, image]) => ( + + ))} +
    + )} + {(pack.images.size > 2 || handlePackDelete) && ( +
    + {pack.images.size > 2 && ( + + )} + { handlePackDelete && } +
    + )} +
    + +
    + Use globally + Add this pack to your account to use in all rooms. +
    +
    +
    + ); +} + +ImagePack.defaultProps = { + handlePackDelete: null, +}; +ImagePack.propTypes = { + roomId: PropTypes.string.isRequired, + stateKey: PropTypes.string.isRequired, + handlePackDelete: PropTypes.func, +}; + +function ImagePackUser() { + const mx = initMatrix.matrixClient; + const [viewMore, setViewMore] = useState(false); + + const { pack, sendPackContent } = useUserImagePack(); + + const { + handleAvatarChange, + handleEditProfile, + handleUsageChange, + handleRenameItem, + handleDeleteItem, + handleUsageItem, + handleAddItem, + } = useImagePackHandles(pack, sendPackContent); + + const images = [...pack.images].slice(0, viewMore ? pack.images.size : 2); + + return ( +
    + + + { images.length === 0 ? null : ( +
    +
    + Image + Shortcode + Usage +
    + {images.map(([shortcode, image]) => ( + + ))} +
    + )} + {(pack.images.size > 2) && ( +
    + +
    + )} +
    + ); +} + +function useGlobalImagePack() { + const [, forceUpdate] = useReducer((count) => count + 1, 0); + const mx = initMatrix.matrixClient; + + const roomIdToStateKeys = new Map(); + const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? { rooms: {} }; + const { rooms } = globalContent; + + Object.keys(rooms).forEach((roomId) => { + if (typeof rooms[roomId] !== 'object') return; + const room = mx.getRoom(roomId); + const stateKeys = Object.keys(rooms[roomId]); + if (!room || stateKeys.length === 0) return; + roomIdToStateKeys.set(roomId, stateKeys); + }); + + useEffect(() => { + const handleEvent = (event) => { + if (event.getType() === 'im.ponies.emote_rooms') forceUpdate(); + }; + mx.addListener('accountData', handleEvent); + return () => { + mx.removeListener('accountData', handleEvent); + }; + }, []); + + return roomIdToStateKeys; +} + +function ImagePackGlobal() { + const mx = initMatrix.matrixClient; + const roomIdToStateKeys = useGlobalImagePack(); + + const handleChange = (roomId, stateKey) => { + removeGlobalImagePack(mx, roomId, stateKey); + }; + + return ( +
    + Global packs +
    + { + roomIdToStateKeys.size > 0 + ? [...roomIdToStateKeys].map(([roomId, stateKeys]) => { + const room = mx.getRoom(roomId); + return ( + stateKeys.map((stateKey) => { + const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); + const pack = ImagePackBuilder.parsePack(data?.getId(), data?.getContent()); + if (!pack) return null; + return ( +
    + handleChange(roomId, stateKey)} isActive /> +
    + {pack.displayName ?? 'Unknown'} + {room.name} +
    +
    + ); + }) + ); + }) + :
    No global packs
    + } +
    +
    + ); +} + +export default ImagePack; + +export { ImagePackUser, ImagePackGlobal }; diff --git a/src/app/molecules/image-pack/ImagePack.scss b/src/app/molecules/image-pack/ImagePack.scss new file mode 100644 index 00000000..91d6a185 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePack.scss @@ -0,0 +1,47 @@ +@use '../../partials/flex'; + +.image-pack { + &-item { + border-top: 1px solid var(--bg-surface-border); + } + + &__header { + padding: var(--sp-extra-tight) var(--sp-normal); + display: flex; + align-items: center; + gap: var(--sp-normal); + + & > *:nth-child(2) { + @extend .cp-fx__item-one; + } + } + + &__footer { + padding: var(--sp-normal); + display: flex; + justify-content: space-between; + gap: var(--sp-tight); + } + + &__global { + padding: var(--sp-normal); + padding-top: var(--sp-tight); + display: flex; + align-items: center; + gap: var(--sp-normal); + } +} + +.image-pack-global { + &__empty { + text-align: center; + padding: var(--sp-extra-loose) var(--sp-normal); + } + & .image-pack__global { + padding: 0 var(--sp-normal); + padding-bottom: var(--sp-normal); + &:first-child { + padding-top: var(--sp-normal); + } + } +} diff --git a/src/app/molecules/image-pack/ImagePackItem.jsx b/src/app/molecules/image-pack/ImagePackItem.jsx new file mode 100644 index 00000000..27436793 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackItem.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './ImagePackItem.scss'; + +import { openReusableContextMenu } from '../../../client/action/navigation'; +import { getEventCords } from '../../../util/common'; + +import Avatar from '../../atoms/avatar/Avatar'; +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import RawIcon from '../../atoms/system-icons/RawIcon'; +import IconButton from '../../atoms/button/IconButton'; +import ImagePackUsageSelector from './ImagePackUsageSelector'; + +import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; +import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; +import BinIC from '../../../../public/res/ic/outlined/bin.svg'; + +function ImagePackItem({ + url, shortcode, usage, onUsageChange, onDelete, onRename, +}) { + const handleUsageSelect = (event) => { + openReusableContextMenu( + 'bottom', + getEventCords(event, '.btn-surface'), + (closeMenu) => ( + { + onUsageChange(shortcode, newUsage); + closeMenu(); + }} + /> + ), + ); + }; + + return ( +
    + +
    + {shortcode} +
    +
    +
    + {onRename && onRename(shortcode)} />} + {onDelete && onDelete(shortcode)} />} +
    + +
    +
    + ); +} + +ImagePackItem.defaultProps = { + onUsageChange: null, + onDelete: null, + onRename: null, +}; +ImagePackItem.propTypes = { + url: PropTypes.string.isRequired, + shortcode: PropTypes.string.isRequired, + usage: PropTypes.oneOf(['emoticon', 'sticker', 'both']).isRequired, + onUsageChange: PropTypes.func, + onDelete: PropTypes.func, + onRename: PropTypes.func, +}; + +export default ImagePackItem; diff --git a/src/app/molecules/image-pack/ImagePackItem.scss b/src/app/molecules/image-pack/ImagePackItem.scss new file mode 100644 index 00000000..ab1be3a7 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackItem.scss @@ -0,0 +1,43 @@ +@use '../../partials/flex'; +@use '../../partials/dir'; + +.image-pack-item { + margin: 0 var(--sp-normal); + padding: var(--sp-tight) 0; + display: flex; + align-items: center; + gap: var(--sp-normal); + + & .avatar-container img { + object-fit: contain; + border-radius: 0; + } + + &__content { + @extend .cp-fx__item-one; + } + + &__usage { + display: flex; + gap: var(--sp-ultra-tight); + & button { + padding: 6px; + } + & > button.btn-surface { + padding: 6px var(--sp-tight); + min-width: 0; + @include dir.side(margin, var(--sp-ultra-tight), 0); + } + } + + &__btn { + display: none; + } + &:hover, + &:focus-within { + .image-pack-item__btn { + display: flex; + gap: var(--sp-ultra-tight); + } + } +} \ No newline at end of file diff --git a/src/app/molecules/image-pack/ImagePackProfile.jsx b/src/app/molecules/image-pack/ImagePackProfile.jsx new file mode 100644 index 00000000..b639936d --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackProfile.jsx @@ -0,0 +1,125 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import './ImagePackProfile.scss'; + +import { openReusableContextMenu } from '../../../client/action/navigation'; +import { getEventCords } from '../../../util/common'; + +import Text from '../../atoms/text/Text'; +import Avatar from '../../atoms/avatar/Avatar'; +import Button from '../../atoms/button/Button'; +import IconButton from '../../atoms/button/IconButton'; +import Input from '../../atoms/input/Input'; +import ImageUpload from '../image-upload/ImageUpload'; +import ImagePackUsageSelector from './ImagePackUsageSelector'; + +import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; +import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; + +function ImagePackProfile({ + avatarUrl, displayName, attribution, usage, + onUsageChange, onAvatarChange, onEditProfile, +}) { + const [isEdit, setIsEdit] = useState(false); + + const handleSubmit = (e) => { + e.preventDefault(); + + const { nameInput, attributionInput } = e.target; + const name = nameInput.value.trim() || undefined; + const att = attributionInput.value.trim() || undefined; + + onEditProfile(name, att); + setIsEdit(false); + }; + + const handleUsageSelect = (event) => { + openReusableContextMenu( + 'bottom', + getEventCords(event, '.btn-surface'), + (closeMenu) => ( + { + onUsageChange(newUsage); + closeMenu(); + }} + /> + ), + ); + }; + + return ( +
    + { + onAvatarChange + ? ( + onAvatarChange(undefined)} + /> + ) + : + } +
    + { + isEdit + ? ( +
    + + +
    + + +
    +
    + ) : ( + <> +
    + {displayName} + {onEditProfile && setIsEdit(true)} src={PencilIC} tooltip="Edit" />} +
    + {attribution && {attribution}} + + ) + } +
    +
    + Pack usage + +
    +
    + ); +} + +ImagePackProfile.defaultProps = { + avatarUrl: null, + attribution: null, + onUsageChange: null, + onAvatarChange: null, + onEditProfile: null, +}; +ImagePackProfile.propTypes = { + avatarUrl: PropTypes.string, + displayName: PropTypes.string.isRequired, + attribution: PropTypes.string, + usage: PropTypes.oneOf(['emoticon', 'sticker', 'both']).isRequired, + onUsageChange: PropTypes.func, + onAvatarChange: PropTypes.func, + onEditProfile: PropTypes.func, +}; + +export default ImagePackProfile; diff --git a/src/app/molecules/image-pack/ImagePackProfile.scss b/src/app/molecules/image-pack/ImagePackProfile.scss new file mode 100644 index 00000000..d21212fb --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackProfile.scss @@ -0,0 +1,37 @@ +@use '../../partials/flex'; + +.image-pack-profile { + padding: var(--sp-normal); + display: flex; + align-items: flex-start; + gap: var(--sp-tight); + + &__content { + @extend .cp-fx__item-one; + + & > div:first-child { + display: flex; + align-items: center; + gap: var(--sp-extra-tight); + + & .ic-btn { + padding: var(--sp-ultra-tight); + } + } + & > form { + display: flex; + flex-direction: column; + gap: var(--sp-extra-tight); + & > div:last-child { + margin: var(--sp-extra-tight) 0; + display: flex; + gap: var(--sp-tight); + } + } + } + &__usage { + & > *:first-child { + margin-bottom: var(--sp-ultra-tight); + } + } +} \ No newline at end of file diff --git a/src/app/molecules/image-pack/ImagePackUpload.jsx b/src/app/molecules/image-pack/ImagePackUpload.jsx new file mode 100644 index 00000000..9358856d --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackUpload.jsx @@ -0,0 +1,73 @@ +import React, { useState, useRef } from 'react'; +import PropTypes from 'prop-types'; +import './ImagePackUpload.scss'; + +import initMatrix from '../../../client/initMatrix'; +import { scaleDownImage } from '../../../util/common'; + +import Text from '../../atoms/text/Text'; +import Button from '../../atoms/button/Button'; +import Input from '../../atoms/input/Input'; +import IconButton from '../../atoms/button/IconButton'; +import CirclePlusIC from '../../../../public/res/ic/outlined/circle-plus.svg'; + +function ImagePackUpload({ onUpload }) { + const mx = initMatrix.matrixClient; + const inputRef = useRef(null); + const shortcodeRef = useRef(null); + const [imgFile, setImgFile] = useState(null); + const [progress, setProgress] = useState(false); + + const handleSubmit = async (evt) => { + evt.preventDefault(); + if (!imgFile) return; + const { shortcodeInput } = evt.target; + const shortcode = shortcodeInput.value.trim(); + if (shortcode === '') return; + + setProgress(true); + const image = await scaleDownImage(imgFile, 512, 512); + const url = await mx.uploadContent(image, { + onlyContentUri: true, + }); + + onUpload(shortcode, url); + setProgress(false); + setImgFile(null); + shortcodeRef.current.value = ''; + }; + + const handleFileChange = (evt) => { + const img = evt.target.files[0]; + if (!img) return; + setImgFile(img); + shortcodeRef.current.focus(); + }; + const handleRemove = () => { + setImgFile(null); + inputRef.current.value = null; + }; + + return ( +
    + + { + imgFile + ? ( +
    + + {imgFile.name} +
    + ) + : + } + + +
    + ); +} +ImagePackUpload.propTypes = { + onUpload: PropTypes.func.isRequired, +}; + +export default ImagePackUpload; diff --git a/src/app/molecules/image-pack/ImagePackUpload.scss b/src/app/molecules/image-pack/ImagePackUpload.scss new file mode 100644 index 00000000..75b57ed2 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackUpload.scss @@ -0,0 +1,43 @@ +@use '../../partials/dir'; +@use '../../partials/text'; + +.image-pack-upload { + padding: var(--sp-normal); + padding-top: 0; + display: flex; + gap: var(--sp-tight); + + & > .input-container { + flex-grow: 1; + input { + padding: 9px var(--sp-normal); + } + } + &__file { + display: inline-flex; + align-items: center; + background: var(--bg-surface-low); + border-radius: var(--bo-radius); + box-shadow: var(--bs-surface-border); + + & button { + --parent-height: 40px; + width: var(--parent-height); + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + & .ic-raw { + background-color: var(--bg-caution); + transform: rotate(45deg); + } + + & .text { + @extend .cp-txt__ellipsis; + @include dir.side(margin, var(--sp-ultra-tight), var(--sp-normal)); + max-width: 86px; + } + } +} \ No newline at end of file diff --git a/src/app/molecules/image-pack/ImagePackUsageSelector.jsx b/src/app/molecules/image-pack/ImagePackUsageSelector.jsx new file mode 100644 index 00000000..279b3816 --- /dev/null +++ b/src/app/molecules/image-pack/ImagePackUsageSelector.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; +import CheckIC from '../../../../public/res/ic/outlined/check.svg'; + +function ImagePackUsageSelector({ usage, onSelect }) { + return ( +
    + Usage + onSelect('emoticon')} + > + Emoji + + onSelect('sticker')} + > + Sticker + + onSelect('both')} + > + Both + +
    + ); +} + +ImagePackUsageSelector.propTypes = { + usage: PropTypes.oneOf(['emoticon', 'sticker', 'both']).isRequired, + onSelect: PropTypes.func.isRequired, +}; + +export default ImagePackUsageSelector; diff --git a/src/app/molecules/image-upload/ImageUpload.jsx b/src/app/molecules/image-upload/ImageUpload.jsx index 69564aa5..137d23bf 100644 --- a/src/app/molecules/image-upload/ImageUpload.jsx +++ b/src/app/molecules/image-upload/ImageUpload.jsx @@ -7,9 +7,13 @@ import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import Avatar from '../../atoms/avatar/Avatar'; import Spinner from '../../atoms/spinner/Spinner'; +import RawIcon from '../../atoms/system-icons/RawIcon'; + +import PlusIC from '../../../../public/res/ic/outlined/plus.svg'; function ImageUpload({ text, bgColor, imageSrc, onUpload, onRequestRemove, + size, }) { const [uploadPromise, setUploadPromise] = useState(null); const uploadImageRef = useRef(null); @@ -50,10 +54,14 @@ function ImageUpload({ imageSrc={imageSrc} text={text} bgColor={bgColor} - size="large" + size={size} />
    - {uploadPromise === null && Upload} + {uploadPromise === null && ( + size === 'large' + ? Upload + : + )} {uploadPromise !== null && }
    @@ -75,6 +83,7 @@ ImageUpload.defaultProps = { text: null, bgColor: 'transparent', imageSrc: null, + size: 'large', }; ImageUpload.propTypes = { @@ -83,6 +92,7 @@ ImageUpload.propTypes = { imageSrc: PropTypes.string, onUpload: PropTypes.func.isRequired, onRequestRemove: PropTypes.func.isRequired, + size: PropTypes.oneOf(['large', 'normal']), }; export default ImageUpload; diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index 341dcb03..c4b4a171 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -69,9 +69,8 @@ async function getUrl(link, type, decryptData) { } } -function getNativeHeight(width, height) { - const MEDIA_MAX_WIDTH = 296; - const scale = MEDIA_MAX_WIDTH / width; +function getNativeHeight(width, height, maxWidth = 296) { + const scale = maxWidth / width; return scale * height; } @@ -196,6 +195,45 @@ Image.propTypes = { type: PropTypes.string, }; +function Sticker({ + name, height, width, link, file, type, +}) { + const [url, setUrl] = useState(null); + + useEffect(() => { + let unmounted = false; + async function fetchUrl() { + const myUrl = await getUrl(link, type, file); + if (unmounted) return; + setUrl(myUrl); + } + fetchUrl(); + return () => { + unmounted = true; + }; + }, []); + + return ( +
    + { url !== null && {name}} +
    + ); +} +Sticker.defaultProps = { + file: null, + type: '', +}; +Sticker.propTypes = { + name: PropTypes.string.isRequired, + width: null, + height: null, + width: PropTypes.number, + height: PropTypes.number, + link: PropTypes.string.isRequired, + file: PropTypes.shape({}), + type: PropTypes.string, +}; + function Audio({ name, link, type, file, }) { @@ -315,5 +353,5 @@ Video.propTypes = { }; export { - File, Image, Audio, Video, + File, Image, Sticker, Audio, Video, }; diff --git a/src/app/molecules/media/Media.scss b/src/app/molecules/media/Media.scss index 7b9d6f7c..16cf8f7e 100644 --- a/src/app/molecules/media/Media.scss +++ b/src/app/molecules/media/Media.scss @@ -42,6 +42,15 @@ background-size: cover; } +.sticker-container { + display: inline-flex; + max-width: 128px; + width: 100%; + & img { + width: 100% !important; + } +} + .image-container { & img { max-width: unset !important; diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index c1370ec3..49337bdc 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -5,7 +5,6 @@ import React, { import PropTypes from 'prop-types'; import './Message.scss'; -import { getShortcodeToCustomEmoji } from '../../organisms/emoji-board/custom-emoji'; import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; @@ -322,7 +321,7 @@ function getMyEmojiEvent(emojiKey, eventId, roomTimeline) { return rEvent; } -function toggleEmoji(roomId, eventId, emojiKey, roomTimeline) { +function toggleEmoji(roomId, eventId, emojiKey, shortcode, roomTimeline) { const myAlreadyReactEvent = getMyEmojiEvent(emojiKey, eventId, roomTimeline); if (myAlreadyReactEvent) { const rId = myAlreadyReactEvent.getId(); @@ -330,17 +329,17 @@ function toggleEmoji(roomId, eventId, emojiKey, roomTimeline) { redactEvent(roomId, rId); return; } - sendReaction(roomId, eventId, emojiKey); + sendReaction(roomId, eventId, emojiKey, shortcode); } function pickEmoji(e, roomId, eventId, roomTimeline) { openEmojiBoard(getEventCords(e), (emoji) => { - toggleEmoji(roomId, eventId, emoji.unicode, roomTimeline); + toggleEmoji(roomId, eventId, emoji.mxc ?? emoji.unicode, emoji.shortcodes[0], roomTimeline); e.target.click(); }); } -function genReactionMsg(userIds, reaction) { +function genReactionMsg(userIds, reaction, shortcode) { return ( <> {userIds.map((userId, index) => ( @@ -354,24 +353,22 @@ function genReactionMsg(userIds, reaction) { ))} {' reacted with '} - {twemojify(reaction, { className: 'react-emoji' })} + {twemojify(shortcode ? `:${shortcode}:` : reaction, { className: 'react-emoji' })} ); } function MessageReaction({ - shortcodeToEmoji, reaction, count, users, isActive, onClick, + reaction, shortcode, count, users, isActive, onClick, }) { - const customEmojiMatch = reaction.match(/^:(\S+):$/); let customEmojiUrl = null; - if (customEmojiMatch) { - const customEmoji = shortcodeToEmoji.get(customEmojiMatch[1]); - customEmojiUrl = initMatrix.matrixClient.mxcUrlToHttp(customEmoji?.mxc); + if (reaction.match(/^mxc:\/\/\S+$/)) { + customEmojiUrl = initMatrix.matrixClient.mxcUrlToHttp(reaction); } return ( {users.length > 0 ? genReactionMsg(users, reaction) : 'Unable to load who has reacted'}} + content={{users.length > 0 ? genReactionMsg(users, reaction, shortcode) : 'Unable to load who has reacted'}} > + +
    + )} + { + usablePacks.length > 0 + ? usablePacks.reverse().map((mEvent) => ( + + )) : ( +
    + No emoji or sticker pack. +
    + ) + } +
    + ); +} + +RoomEmojis.propTypes = { + roomId: PropTypes.string.isRequired, +}; + +export default RoomEmojis; diff --git a/src/app/molecules/room-emojis/RoomEmojis.scss b/src/app/molecules/room-emojis/RoomEmojis.scss new file mode 100644 index 00000000..7ba2b494 --- /dev/null +++ b/src/app/molecules/room-emojis/RoomEmojis.scss @@ -0,0 +1,29 @@ +.room-emojis { + .image-pack, + .room-emojis__add-pack, + .room-emojis__empty { + margin: var(--sp-normal) 0; + background-color: var(--bg-surface); + border-radius: var(--bo-radius); + box-shadow: var(--bs-surface-border); + overflow: hidden; + + & > .context-menu__header:first-child { + margin-top: 2px; + } + } + &__add-pack { + & form { + margin: var(--sp-normal); + display: flex; + gap: var(--sp-normal); + & .input-container { + flex-grow: 1; + } + } + } + &__empty { + padding: var(--sp-extra-loose) var(--sp-normal); + text-align: center; + } +} \ No newline at end of file diff --git a/src/app/organisms/emoji-board/EmojiBoard.jsx b/src/app/organisms/emoji-board/EmojiBoard.jsx index 864a0bf6..b97cab0a 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.jsx +++ b/src/app/organisms/emoji-board/EmojiBoard.jsx @@ -70,7 +70,7 @@ const EmojiGroup = React.memo(({ name, groupEmojis }) => { unicode={`:${emoji.shortcode}:`} shortcodes={emoji.shortcode} src={initMatrix.matrixClient.mxcUrlToHttp(emoji.mxc)} - data-mx-emoticon + data-mx-emoticon={emoji.mxc} /> ) } @@ -141,10 +141,13 @@ function EmojiBoard({ onSelect, searchRef }) { function getEmojiDataFromTarget(target) { const unicode = target.getAttribute('unicode'); const hexcode = target.getAttribute('hexcode'); + const mxc = target.getAttribute('data-mx-emoticon'); let shortcodes = target.getAttribute('shortcodes'); if (typeof shortcodes === 'undefined') shortcodes = undefined; else shortcodes = shortcodes.split(','); - return { unicode, hexcode, shortcodes }; + return { + unicode, hexcode, shortcodes, mxc, + }; } function selectEmoji(e) { @@ -202,21 +205,23 @@ function EmojiBoard({ onSelect, searchRef }) { setAvailableEmojis([]); return; } - // Retrieve the packs for the new room - // Remove packs that aren't marked as emoji packs - // Remove packs without emojis - const packs = getRelevantPacks( - initMatrix.matrixClient.getRoom(selectedRoomId), - ) - .filter((pack) => pack.usage.indexOf('emoticon') !== -1) - .filter((pack) => pack.getEmojis().length !== 0); - // Set an index for each pack so that we know where to jump when the user uses the nav - for (let i = 0; i < packs.length; i += 1) { - packs[i].packIndex = i; + const mx = initMatrix.matrixClient; + const room = mx.getRoom(selectedRoomId); + const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); + const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); + if (room) { + const packs = getRelevantPacks( + room.client, + [room, ...parentRooms], + ).filter((pack) => pack.getEmojis().length !== 0); + + // Set an index for each pack so that we know where to jump when the user uses the nav + for (let i = 0; i < packs.length; i += 1) { + packs[i].packIndex = i; + } + setAvailableEmojis(packs); } - - setAvailableEmojis(packs); }; const onOpen = () => { @@ -260,7 +265,7 @@ function EmojiBoard({ onSelect, searchRef }) { { availableEmojis.map((pack) => ( { availableEmojis.map((pack) => { - const src = initMatrix.matrixClient.mxcUrlToHttp(pack.avatar ?? pack.images[0].mxc); + const src = initMatrix.matrixClient + .mxcUrlToHttp(pack.avatarUrl ?? pack.getEmojis()[0].mxc); return ( openGroup(recentOffset + pack.packIndex)} src={src} key={pack.packIndex} - tooltip={pack.displayName} + tooltip={pack.displayName ?? 'Unknown'} tooltipPlacement="right" isImage /> diff --git a/src/app/organisms/emoji-board/EmojiBoard.scss b/src/app/organisms/emoji-board/EmojiBoard.scss index 73f3ab3b..6883e18e 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.scss +++ b/src/app/organisms/emoji-board/EmojiBoard.scss @@ -84,6 +84,7 @@ .emoji { width: 32px; height: 32px; + object-fit: contain; } } & > p:last-child { @@ -123,6 +124,7 @@ & .emoji { width: 38px; height: 38px; + object-fit: contain; padding: var(--emoji-padding); cursor: pointer; &:hover { diff --git a/src/app/organisms/emoji-board/custom-emoji.js b/src/app/organisms/emoji-board/custom-emoji.js index 4147c130..1298e6ae 100644 --- a/src/app/organisms/emoji-board/custom-emoji.js +++ b/src/app/organisms/emoji-board/custom-emoji.js @@ -1,135 +1,224 @@ import { emojis } from './emoji'; -// Custom emoji are stored in one of three places: -// - User emojis, which are stored in account data -// - Room emojis, which are stored in state events in a room -// - Emoji packs, which are rooms of emojis referenced in the account data or in a room's -// cannonical space -// -// Emojis and packs referenced from within a user's account data should be available -// globally, while emojis and packs in rooms and spaces should only be available within -// those spaces and rooms +// https://github.com/Sorunome/matrix-doc/blob/soru/emotes/proposals/2545-emotes.md class ImagePack { - // Convert a raw image pack into a more maliable format - // - // Takes an image pack as per MSC 2545 (e.g. as in the Matrix spec), and converts it to a - // format used here, while filling in defaults. - // - // The room argument is the room the pack exists in, which is used as a fallback for - // missing properties - // - // Returns `null` if the rawPack is not a properly formatted image pack, although there - // is still a fair amount of tolerance for malformed packs. - static parsePack(rawPack, room) { - if (typeof rawPack.images === 'undefined') { + static parsePack(eventId, packContent) { + if (!eventId || typeof packContent?.images !== 'object') { return null; } - const pack = rawPack.pack ?? {}; + return new ImagePack(eventId, packContent); + } - const displayName = pack.display_name ?? (room ? room.name : undefined); - const avatar = pack.avatar_url ?? (room ? room.getMxcAvatarUrl() : undefined); - const usage = pack.usage ?? ['emoticon', 'sticker']; - const { attribution } = pack; - const images = Object.entries(rawPack.images).flatMap((e) => { - const data = e[1]; - const shortcode = e[0]; + constructor(eventId, content) { + this.id = eventId; + this.content = JSON.parse(JSON.stringify(content)); + + this.applyPack(content); + this.applyImages(content); + } + + applyPack(content) { + const pack = content.pack ?? {}; + + this.displayName = pack.display_name; + this.avatarUrl = pack.avatar_url; + this.usage = pack.usage ?? ['emoticon', 'sticker']; + this.attribution = pack.attribution; + } + + applyImages(content) { + this.images = new Map(); + this.emoticons = []; + this.stickers = []; + + Object.entries(content.images).forEach(([shortcode, data]) => { const mxc = data.url; const body = data.body ?? shortcode; + const usage = data.usage ?? this.usage; const { info } = data; - const usage_ = data.usage ?? usage; - if (mxc) { - return [{ - shortcode, mxc, body, info, usage: usage_, - }]; + if (!mxc) return; + const image = { + shortcode, mxc, body, usage, info, + }; + + this.images.set(shortcode, image); + if (usage.includes('emoticon')) { + this.emoticons.push(image); + } + if (usage.includes('sticker')) { + this.stickers.push(image); } - return []; }); - - return new ImagePack(displayName, avatar, usage, attribution, images); } - constructor(displayName, avatar, usage, attribution, images) { - this.displayName = displayName; - this.avatar = avatar; - this.usage = usage; - this.attribution = attribution; - this.images = images; + getImages() { + return this.images; } - // Produce a list of emoji in this image pack getEmojis() { - return this.images.filter((i) => i.usage.indexOf('emoticon') !== -1); + return this.emoticons; } - // Produce a list of stickers in this image pack getStickers() { - return this.images.filter((i) => i.usage.indexOf('sticker') !== -1); + return this.stickers; + } + + getContent() { + return this.content; + } + + _updatePackProperty(property, value) { + if (this.content.pack === undefined) { + this.content.pack = {}; + } + this.content.pack[property] = value; + this.applyPack(this.content); + } + + setAvatarUrl(avatarUrl) { + this._updatePackProperty('avatar_url', avatarUrl); + } + + setDisplayName(displayName) { + this._updatePackProperty('display_name', displayName); + } + + setAttribution(attribution) { + this._updatePackProperty('attribution', attribution); + } + + setUsage(usage) { + this._updatePackProperty('usage', usage); + } + + addImage(key, imgContent) { + this.content.images = { + [key]: imgContent, + ...this.content.images, + }; + this.applyImages(this.content); + } + + removeImage(key) { + if (this.content.images[key] === undefined) return; + delete this.content.images[key]; + this.applyImages(this.content); + } + + updateImageKey(key, newKey) { + if (this.content.images[key] === undefined) return; + const copyImages = {}; + Object.keys(this.content.images).forEach((imgKey) => { + copyImages[imgKey === key ? newKey : imgKey] = this.content.images[imgKey]; + }); + this.content.images = copyImages; + this.applyImages(this.content); + } + + _updateImageProperty(key, property, value) { + if (this.content.images[key] === undefined) return; + this.content.images[key][property] = value; + this.applyImages(this.content); + } + + setImageUrl(key, url) { + this._updateImageProperty(key, 'url', url); + } + + setImageBody(key, body) { + this._updateImageProperty(key, 'body', body); + } + + setImageInfo(key, info) { + this._updateImageProperty(key, 'info', info); + } + + setImageUsage(key, usage) { + this._updateImageProperty(key, 'usage', usage); } } -// Retrieve a list of user emojis -// -// Result is an ImagePack, or null if the user hasn't set up or has deleted their personal -// image pack. -// -// Accepts a reference to a matrix client as the only argument +function getGlobalImagePacks(mx) { + const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent(); + if (typeof globalContent !== 'object') return []; + + const { rooms } = globalContent; + if (typeof rooms !== 'object') return []; + + const roomIds = Object.keys(rooms); + + const packs = roomIds.flatMap((roomId) => { + if (typeof rooms[roomId] !== 'object') return []; + const room = mx.getRoom(roomId); + if (!room) return []; + const stateKeys = Object.keys(rooms[roomId]); + + return stateKeys.map((stateKey) => { + const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); + const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); + if (pack) { + pack.displayName ??= room.name; + pack.avatarUrl ??= room.getMxcAvatarUrl(); + } + return pack; + }).filter((pack) => pack !== null); + }); + + return packs; +} + function getUserImagePack(mx) { const accountDataEmoji = mx.getAccountData('im.ponies.user_emotes'); if (!accountDataEmoji) { return null; } - const userImagePack = ImagePack.parsePack(accountDataEmoji.event.content); - if (userImagePack) userImagePack.displayName ??= 'Your Emoji'; + const userImagePack = ImagePack.parsePack(mx.getUserId(), accountDataEmoji.event.content); + userImagePack.displayName ??= 'Personal Emoji'; return userImagePack; } -// Produces a list of all of the emoji packs in a room -// -// Returns a list of `ImagePack`s. This does not include packs in spaces that contain -// this room. -function getPacksInRoom(room) { - const packs = room.currentState.getStateEvents('im.ponies.room_emotes'); +function getRoomImagePacks(room) { + const dataEvents = room.currentState.getStateEvents('im.ponies.room_emotes'); - return packs - .map((p) => ImagePack.parsePack(p.event.content, room)) - .filter((p) => p !== null); + return dataEvents + .map((data) => { + const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); + if (pack) { + pack.displayName ??= room.name; + pack.avatarUrl ??= room.getMxcAvatarUrl(); + } + return pack; + }) + .filter((pack) => pack !== null); } -// Produce a list of all image packs which should be shown for a given room -// -// This includes packs in that room, the user's personal images, and will eventually -// include the user's enabled global image packs and space-level packs. -// -// This differs from getPacksInRoom, as the former only returns packs that are directly in -// a room, whereas this function returns all packs which should be shown to the user while -// they are in this room. -// -// Packs will be returned in the order that shortcode conflicts should be resolved, with -// higher priority packs coming first. -function getRelevantPacks(room) { +/** + * @param {MatrixClient} mx Provide if you want to include user personal/global pack + * @param {Room[]} rooms Provide rooms if you want to include rooms pack + * @returns {ImagePack[]} packs + */ +function getRelevantPacks(mx, rooms) { + const userPack = mx ? getUserImagePack(mx) : []; + const globalPacks = mx ? getGlobalImagePacks(mx) : []; + const globalPackIds = new Set(globalPacks.map((pack) => pack.id)); + const roomsPack = rooms?.flatMap(getRoomImagePacks) ?? []; + return [].concat( - getUserImagePack(room.client) ?? [], - getPacksInRoom(room), + userPack ?? [], + globalPacks, + roomsPack.filter((pack) => !globalPackIds.has(pack.id)), ); } -// Returns all user+room emojis and all standard unicode emojis -// -// Accepts a reference to a matrix client as the only argument -// -// Result is a map from shortcode to the corresponding emoji. If two emoji share a -// shortcode, only one will be presented, with priority given to custom emoji. -// -// Will eventually be expanded to include all emojis revelant to a room and the user -function getShortcodeToEmoji(room) { +function getShortcodeToEmoji(mx, rooms) { const allEmoji = new Map(); emojis.forEach((emoji) => { - if (emoji.shortcodes.constructor.name === 'Array') { + if (Array.isArray(emoji.shortcodes)) { emoji.shortcodes.forEach((shortcode) => { allEmoji.set(shortcode, emoji); }); @@ -138,7 +227,7 @@ function getShortcodeToEmoji(room) { } }); - getRelevantPacks(room).reverse() + getRelevantPacks(mx, rooms) .flatMap((pack) => pack.getEmojis()) .forEach((emoji) => { allEmoji.set(emoji.shortcode, emoji); @@ -150,7 +239,7 @@ function getShortcodeToEmoji(room) { function getShortcodeToCustomEmoji(room) { const allEmoji = new Map(); - getRelevantPacks(room).reverse() + getRelevantPacks(room.client, [room]) .flatMap((pack) => pack.getEmojis()) .forEach((emoji) => { allEmoji.set(emoji.shortcode, emoji); @@ -159,27 +248,20 @@ function getShortcodeToCustomEmoji(room) { return allEmoji; } -// Produces a special list of emoji specifically for auto-completion -// -// This list contains each emoji once, with all emoji being deduplicated by shortcode. -// However, the order of the standard emoji will have been preserved, and alternate -// shortcodes for the standard emoji will not be considered. -// -// Standard emoji are guaranteed to be earlier in the list than custom emoji -function getEmojiForCompletion(room) { +function getEmojiForCompletion(mx, rooms) { const allEmoji = new Map(); - getRelevantPacks(room).reverse() + getRelevantPacks(mx, rooms) .flatMap((pack) => pack.getEmojis()) .forEach((emoji) => { allEmoji.set(emoji.shortcode, emoji); }); - return emojis.filter((e) => !allEmoji.has(e.shortcode)) - .concat(Array.from(allEmoji.values())); + return Array.from(allEmoji.values()).concat(emojis.filter((e) => !allEmoji.has(e.shortcode))); } export { - getUserImagePack, + ImagePack, + getUserImagePack, getGlobalImagePacks, getRoomImagePacks, getShortcodeToEmoji, getShortcodeToCustomEmoji, getRelevantPacks, getEmojiForCompletion, }; diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 50c5e512..63277347 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -25,9 +25,11 @@ import RoomHistoryVisibility from '../../molecules/room-history-visibility/RoomH import RoomEncryption from '../../molecules/room-encryption/RoomEncryption'; import RoomPermissions from '../../molecules/room-permissions/RoomPermissions'; import RoomMembers from '../../molecules/room-members/RoomMembers'; +import RoomEmojis from '../../molecules/room-emojis/RoomEmojis'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; +import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import ShieldUserIC from '../../../../public/res/ic/outlined/shield-user.svg'; import LockIC from '../../../../public/res/ic/outlined/lock.svg'; @@ -42,6 +44,7 @@ const tabText = { GENERAL: 'General', SEARCH: 'Search', MEMBERS: 'Members', + EMOJIS: 'Emojis', PERMISSIONS: 'Permissions', SECURITY: 'Security', }; @@ -58,6 +61,10 @@ const tabItems = [{ iconSrc: UserIC, text: tabText.MEMBERS, disabled: false, +}, { + iconSrc: EmojiIC, + text: tabText.EMOJIS, + disabled: false, }, { iconSrc: ShieldUserIC, text: tabText.PERMISSIONS, @@ -197,6 +204,7 @@ function RoomSettings({ roomId }) { {selectedTab.text === tabText.GENERAL && } {selectedTab.text === tabText.SEARCH && } {selectedTab.text === tabText.MEMBERS && } + {selectedTab.text === tabText.EMOJIS && } {selectedTab.text === tabText.PERMISSIONS && } {selectedTab.text === tabText.SECURITY && }
    @@ -210,7 +218,5 @@ RoomSettings.propTypes = { roomId: PropTypes.string.isRequired, }; -export { - RoomSettings as default, - tabText, -}; +export default RoomSettings; +export { tabText }; diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index 9c47024d..68919aac 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -21,7 +21,7 @@ import AsyncSearch from '../../../util/AsyncSearch'; import Text from '../../atoms/text/Text'; import ScrollView from '../../atoms/scroll/ScrollView'; import FollowingMembers from '../../molecules/following-members/FollowingMembers'; -import { addRecentEmoji } from '../emoji-board/recent'; +import { addRecentEmoji, getRecentEmojis } from '../emoji-board/recent'; const commands = [{ name: 'markdown', @@ -213,9 +213,15 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { setCmd({ prefix, suggestions: commands }); }, ':': () => { - const emojis = getEmojiForCompletion(mx.getRoom(roomId)); + const parentIds = initMatrix.roomList.getAllParentSpaces(roomId); + const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); + const emojis = getEmojiForCompletion(mx, [mx.getRoom(roomId), ...parentRooms]); + const recentEmoji = getRecentEmojis(20); asyncSearch.setup(emojis, { keys: ['shortcode'], isContain: true, limit: 20 }); - setCmd({ prefix, suggestions: emojis.slice(26, 46) }); + setCmd({ + prefix, + suggestions: recentEmoji.length > 0 ? recentEmoji : emojis.slice(26, 46), + }); }, '@': () => { const members = mx.getRoom(roomId).getJoinedMembers().map((member) => ({ @@ -247,7 +253,7 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { } if (myCmd.prefix === '@') { viewEvent.emit('cmd_fired', { - replace: myCmd.result.name, + replace: `@${myCmd.result.userId}`, }); } deactivateCmd(); diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 704dd9af..4a7b2bf7 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -8,7 +8,7 @@ import TextareaAutosize from 'react-autosize-textarea'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; -import { openEmojiBoard } from '../../../client/action/navigation'; +import { openEmojiBoard, openReusableContextMenu } from '../../../client/action/navigation'; import navigation from '../../../client/state/navigation'; import { bytesToSize, getEventCords } from '../../../util/common'; import { getUsername } from '../../../util/matrixUtil'; @@ -20,9 +20,12 @@ import IconButton from '../../atoms/button/IconButton'; import ScrollView from '../../atoms/scroll/ScrollView'; import { MessageReply } from '../../molecules/message/Message'; +import StickerBoard from '../sticker-board/StickerBoard'; + import CirclePlusIC from '../../../../public/res/ic/outlined/circle-plus.svg'; import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import SendIC from '../../../../public/res/ic/outlined/send.svg'; +import StickerIC from '../../../../public/res/ic/outlined/sticker.svg'; import ShieldIC from '../../../../public/res/ic/outlined/shield.svg'; import VLCIC from '../../../../public/res/ic/outlined/vlc.svg'; import VolumeFullIC from '../../../../public/res/ic/outlined/volume-full.svg'; @@ -128,7 +131,11 @@ function RoomViewInput({ } function firedCmd(cmdData) { const msg = textAreaRef.current.value; - textAreaRef.current.value = replaceCmdWith(msg, cmdCursorPos, typeof cmdData?.replace !== 'undefined' ? cmdData.replace : ''); + textAreaRef.current.value = replaceCmdWith( + msg, + cmdCursorPos, + typeof cmdData?.replace !== 'undefined' ? cmdData.replace : '', + ); deactivateCmd(); } @@ -199,6 +206,33 @@ function RoomViewInput({ if (replyTo !== null) setReplyTo(null); }; + const handleSendSticker = async (data) => { + const { mxc: url, body, httpUrl } = data; + const info = {}; + + const img = new Image(); + img.src = httpUrl; + + try { + const res = await fetch(httpUrl); + const blob = await res.blob(); + info.w = img.width; + info.h = img.height; + info.mimetype = blob.type; + info.size = blob.size; + info.thumbnail_info = { ...info }; + info.thumbnail_url = url; + } catch { + // send sticker without info + } + + mx.sendEvent(roomId, 'm.sticker', { + body, + url, + info, + }); + }; + function processTyping(msg) { const isEmptyMsg = msg === ''; @@ -338,6 +372,29 @@ function RoomViewInput({ {isMarkdown && }
    + { + openReusableContextMenu( + 'top', + (() => { + const cords = getEventCords(e); + cords.y -= 20; + return cords; + })(), + (closeMenu) => ( + { + handleSendSticker(data); + closeMenu(); + }} + /> + ), + ); + }} + tooltip="Sticker" + src={StickerIC} + /> { const cords = getEventCords(e); diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index b0f45f41..b50c9926 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -24,6 +24,7 @@ import PopupWindow from '../../molecules/popup-window/PopupWindow'; import SettingTile from '../../molecules/setting-tile/SettingTile'; import ImportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ImportE2ERoomKeys'; import ExportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys'; +import { ImagePackUser, ImagePackGlobal } from '../../molecules/image-pack/ImagePack'; import ProfileEditor from '../profile-editor/ProfileEditor'; import CrossSigning from './CrossSigning'; @@ -31,6 +32,7 @@ import KeyBackup from './KeyBackup'; import DeviceManage from './DeviceManage'; import SunIC from '../../../../public/res/ic/outlined/sun.svg'; +import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import LockIC from '../../../../public/res/ic/outlined/lock.svg'; import BellIC from '../../../../public/res/ic/outlined/bell.svg'; import InfoIC from '../../../../public/res/ic/outlined/info.svg'; @@ -169,6 +171,15 @@ function NotificationsSection() { ); } +function EmojiSection() { + return ( + <> +
    +
    + + ); +} + function SecuritySection() { return (
    @@ -250,6 +261,7 @@ function AboutSection() { export const tabText = { APPEARANCE: 'Appearance', NOTIFICATIONS: 'Notifications', + EMOJI: 'Emoji', SECURITY: 'Security', ABOUT: 'About', }; @@ -263,6 +275,11 @@ const tabItems = [{ iconSrc: BellIC, disabled: false, render: () => , +}, { + text: tabText.EMOJI, + iconSrc: EmojiIC, + disabled: false, + render: () => , }, { text: tabText.SECURITY, iconSrc: LockIC, diff --git a/src/app/organisms/settings/Settings.scss b/src/app/organisms/settings/Settings.scss index dac53d7a..d77e634a 100644 --- a/src/app/organisms/settings/Settings.scss +++ b/src/app/organisms/settings/Settings.scss @@ -40,7 +40,8 @@ .settings-notifications, .settings-security__card, .settings-security .device-manage, -.settings-about__card { +.settings-about__card, +.settings-emoji__card { @extend .settings-window__card; } diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index 43735993..2c9d6d46 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -25,6 +25,7 @@ import RoomVisibility from '../../molecules/room-visibility/RoomVisibility'; import RoomAliases from '../../molecules/room-aliases/RoomAliases'; import RoomPermissions from '../../molecules/room-permissions/RoomPermissions'; import RoomMembers from '../../molecules/room-members/RoomMembers'; +import RoomEmojis from '../../molecules/room-emojis/RoomEmojis'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; @@ -35,6 +36,7 @@ import PinIC from '../../../../public/res/ic/outlined/pin.svg'; import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; import CategoryIC from '../../../../public/res/ic/outlined/category.svg'; import CategoryFilledIC from '../../../../public/res/ic/filled/category.svg'; +import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useForceUpdate } from '../../hooks/useForceUpdate'; @@ -42,6 +44,7 @@ import { useForceUpdate } from '../../hooks/useForceUpdate'; const tabText = { GENERAL: 'General', MEMBERS: 'Members', + EMOJIS: 'Emojis', PERMISSIONS: 'Permissions', }; @@ -53,6 +56,10 @@ const tabItems = [{ iconSrc: UserIC, text: tabText.MEMBERS, disabled: false, +}, { + iconSrc: EmojiIC, + text: tabText.EMOJIS, + disabled: false, }, { iconSrc: ShieldUserIC, text: tabText.PERMISSIONS, @@ -178,6 +185,7 @@ function SpaceSettings() {
    {selectedTab.text === tabText.GENERAL && } {selectedTab.text === tabText.MEMBERS && } + {selectedTab.text === tabText.EMOJIS && } {selectedTab.text === tabText.PERMISSIONS && }
    diff --git a/src/app/organisms/sticker-board/StickerBoard.jsx b/src/app/organisms/sticker-board/StickerBoard.jsx new file mode 100644 index 00000000..53b75635 --- /dev/null +++ b/src/app/organisms/sticker-board/StickerBoard.jsx @@ -0,0 +1,88 @@ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable jsx-a11y/no-static-element-interactions */ +import React from 'react'; +import PropTypes from 'prop-types'; +import './StickerBoard.scss'; + +import initMatrix from '../../../client/initMatrix'; +import { getRelevantPacks } from '../emoji-board/custom-emoji'; + +import Text from '../../atoms/text/Text'; +import ScrollView from '../../atoms/scroll/ScrollView'; + +function StickerBoard({ roomId, onSelect }) { + const mx = initMatrix.matrixClient; + const room = mx.getRoom(roomId); + + const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); + const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); + + const packs = getRelevantPacks( + mx, + [room, ...parentRooms], + ).filter((pack) => pack.getStickers().length !== 0); + + function isTargetNotSticker(target) { + return target.classList.contains('sticker-board__sticker') === false; + } + function getStickerData(target) { + const mxc = target.getAttribute('data-mx-sticker'); + const body = target.getAttribute('title'); + const httpUrl = target.getAttribute('src'); + return { mxc, body, httpUrl }; + } + const handleOnSelect = (e) => { + if (isTargetNotSticker(e.target)) return; + + const stickerData = getStickerData(e.target); + onSelect(stickerData); + }; + + const renderPack = (pack) => ( +
    + {pack.displayName ?? 'Unknown'} +
    + {pack.getStickers().map((sticker) => ( + {sticker.shortcode} + ))} +
    +
    + ); + + return ( +
    +
    + +
    + { + packs.length > 0 + ? packs.map(renderPack) + : ( +
    + There is no sticker pack. +
    + ) + } +
    +
    +
    +
    +
    + ); +} +StickerBoard.propTypes = { + roomId: PropTypes.string.isRequired, + onSelect: PropTypes.func.isRequired, +}; + +export default StickerBoard; diff --git a/src/app/organisms/sticker-board/StickerBoard.scss b/src/app/organisms/sticker-board/StickerBoard.scss new file mode 100644 index 00000000..be8ad35a --- /dev/null +++ b/src/app/organisms/sticker-board/StickerBoard.scss @@ -0,0 +1,60 @@ +@use '../../partials/dir'; + +.sticker-board { + --sticker-board-height: 390px; + --sticker-board-width: 286px; + display: flex; + height: var(--sticker-board-height); + + &__container { + flex-grow: 1; + min-width: 0; + width: var(--sticker-board-width); + display: flex; + } + + &__content { + min-height: 100%; + } + + &__pack { + margin-bottom: var(--sp-normal); + position: relative; + + &-header { + position: sticky; + top: 0; + z-index: 99; + background-color: var(--bg-surface); + + @include dir.side(margin, var(--sp-extra-tight), 0); + padding: var(--sp-extra-tight) var(--sp-ultra-tight); + text-transform: uppercase; + box-shadow: 0 -4px 0 0 var(--bg-surface); + border-bottom: 1px solid var(--bg-surface-border); + } + &-items { + margin: var(--sp-tight); + @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); + display: flex; + flex-wrap: wrap; + gap: var(--sp-normal) var(--sp-tight); + + img { + width: 76px; + height: 76px; + object-fit: contain; + cursor: pointer; + } + } + } + + &__empty { + width: 100%; + height: var(--sticker-board-height); + display: flex; + justify-content: center; + align-items: center; + text-align: center; + } +} \ No newline at end of file diff --git a/src/client/action/roomTimeline.js b/src/client/action/roomTimeline.js index 8297bf03..41c62d4f 100644 --- a/src/client/action/roomTimeline.js +++ b/src/client/action/roomTimeline.js @@ -11,17 +11,18 @@ async function redactEvent(roomId, eventId, reason) { } } -async function sendReaction(roomId, toEventId, reaction) { +async function sendReaction(roomId, toEventId, reaction, shortcode) { const mx = initMatrix.matrixClient; - + const content = { + 'm.relates_to': { + event_id: toEventId, + key: reaction, + rel_type: 'm.annotation', + }, + }; + if (typeof shortcode === 'string') content.shortcode = shortcode; try { - await mx.sendEvent(roomId, 'm.reaction', { - 'm.relates_to': { - event_id: toEventId, - key: reaction, - rel_type: 'm.annotation', - }, - }); + await mx.sendEvent(roomId, 'm.reaction', content); } catch (e) { throw new Error(e); } diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index aec2f3da..2118be56 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -67,7 +67,7 @@ class InitMatrix extends EventEmitter { if (prevState === null) { this.roomList = new RoomList(this.matrixClient); this.accountData = new AccountData(this.roomList); - this.roomsInput = new RoomsInput(this.matrixClient); + this.roomsInput = new RoomsInput(this.matrixClient, this.roomList); this.notifications = new Notifications(this.roomList); this.emit('init_loading_finished'); } diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 882c7bc0..2377c8d0 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -5,21 +5,10 @@ import encrypt from 'browser-encrypt-attachment'; import { math } from 'micromark-extension-math'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; +import { getImageDimension } from '../../util/common'; import cons from './cons'; import settings from './settings'; -function getImageDimension(file) { - return new Promise((resolve) => { - const img = new Image(); - img.onload = async () => { - resolve({ - w: img.width, - h: img.height, - }); - }; - img.src = URL.createObjectURL(file); - }); -} function loadVideo(videoFile) { return new Promise((resolve, reject) => { const video = document.createElement('video'); @@ -120,14 +109,13 @@ function bindReplyToContent(roomId, reply, content) { return newContent; } -// Apply formatting to a plain text message -// -// This includes inserting any custom emoji that might be relevant, and (only if the -// user has enabled it in their settings) formatting the message using markdown. -function formatAndEmojifyText(room, text) { - const allEmoji = getShortcodeToEmoji(room); +function formatAndEmojifyText(mx, roomList, roomId, text) { + const room = mx.getRoom(roomId); + const { userIdsToDisplayNames } = room.currentState; + const parentIds = roomList.getAllParentSpaces(roomId); + const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); + const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); - // Start by applying markdown formatting (if relevant) let formattedText; if (settings.isMarkdown) { formattedText = getFormattedBody(text); @@ -135,17 +123,25 @@ function formatAndEmojifyText(room, text) { formattedText = text; } - // Check to see if there are any :shortcode-style-tags: in the message - Array.from(formattedText.matchAll(/\B:([\w-]+):\B/g)) - // Then filter to only the ones corresponding to a valid emoji - .filter((match) => allEmoji.has(match[1])) - // Reversing the array ensures that indices are preserved as we start replacing + const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; + Array.from(formattedText.matchAll(MXID_REGEX)) + .filter((mxidMatch) => userIdsToDisplayNames[mxidMatch[0]]) .reverse() - // Replace each :shortcode: with an tag + .forEach((mxidMatch) => { + const tag = `${userIdsToDisplayNames[mxidMatch[0]]}`; + + formattedText = formattedText.substr(0, mxidMatch.index) + + tag + + formattedText.substr(mxidMatch.index + mxidMatch[0].length); + }); + + const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; + Array.from(formattedText.matchAll(SHORTCODE_REGEX)) + .filter((shortcodeMatch) => allEmoji.has(shortcodeMatch[1])) + .reverse() /* Reversing the array ensures that indices are preserved as we start replacing */ .forEach((shortcodeMatch) => { const emoji = allEmoji.get(shortcodeMatch[1]); - // Render the tag that will replace the shortcode let tag; if (emoji.mxc) { tag = `=15" + } + }, "node_modules/react-dnd": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", @@ -16495,15 +16515,14 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": { - "ajv": "^8.0.0" - }, + "requires": {}, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "version": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16515,7 +16534,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -16950,6 +16971,11 @@ } } }, + "blurhash": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz", + "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" + }, "bmp-js": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", @@ -22933,6 +22959,12 @@ "prop-types": "^15.5.6" } }, + "react-blurhash": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.1.3.tgz", + "integrity": "sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg==", + "requires": {} + }, "react-dnd": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", diff --git a/package.json b/package.json index 698da860..9a633d3b 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", + "blurhash": "^1.1.5", "browser-encrypt-attachment": "^0.3.0", "dateformat": "^5.0.3", "emojibase-data": "^7.0.1", @@ -40,6 +41,7 @@ "prop-types": "^15.8.1", "react": "^17.0.2", "react-autosize-textarea": "^7.1.0", + "react-blurhash": "^0.1.3", "react-dnd": "^15.1.2", "react-dnd-html5-backend": "^15.1.3", "react-dom": "^17.0.2", diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index c4b4a171..5f081b91 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -4,6 +4,7 @@ import './Media.scss'; import encrypt from 'browser-encrypt-attachment'; +import { BlurhashCanvas } from 'react-blurhash'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; import Spinner from '../../atoms/spinner/Spinner'; @@ -154,7 +155,7 @@ File.propTypes = { }; function Image({ - name, width, height, link, file, type, + name, width, height, link, file, type, blurhash, }) { const [url, setUrl] = useState(null); @@ -175,6 +176,7 @@ function Image({
    + { blurhash && } { url !== null && {name}}
    @@ -185,6 +187,7 @@ Image.defaultProps = { width: null, height: null, type: '', + blurhash: '', }; Image.propTypes = { name: PropTypes.string.isRequired, @@ -193,6 +196,7 @@ Image.propTypes = { link: PropTypes.string.isRequired, file: PropTypes.shape({}), type: PropTypes.string, + blurhash: PropTypes.string, }; function Sticker({ @@ -278,8 +282,8 @@ Audio.propTypes = { }; function Video({ - name, link, thumbnail, - width, height, file, type, thumbnailFile, thumbnailType, + name, link, thumbnail, thumbnailFile, thumbnailType, + width, height, file, type, blurhash, }) { const [isLoading, setIsLoading] = useState(false); const [url, setUrl] = useState(null); @@ -315,10 +319,14 @@ function Video({
    + { url === null && blurhash && } + { url === null && thumbUrl !== null && ( + /* eslint-disable-next-line jsx-a11y/alt-text */ + + )} { url === null && isLoading && } { url === null && !isLoading && } { url !== null && ( @@ -336,20 +344,22 @@ Video.defaultProps = { height: null, file: null, thumbnail: null, - type: '', thumbnailType: null, thumbnailFile: null, + type: '', + blurhash: null, }; Video.propTypes = { name: PropTypes.string.isRequired, link: PropTypes.string.isRequired, thumbnail: PropTypes.string, + thumbnailFile: PropTypes.shape({}), + thumbnailType: PropTypes.string, width: PropTypes.number, height: PropTypes.number, file: PropTypes.shape({}), type: PropTypes.string, - thumbnailFile: PropTypes.shape({}), - thumbnailType: PropTypes.string, + blurhash: PropTypes.string, }; export { diff --git a/src/app/molecules/media/Media.scss b/src/app/molecules/media/Media.scss index 16cf8f7e..b26b232a 100644 --- a/src/app/molecules/media/Media.scss +++ b/src/app/molecules/media/Media.scss @@ -33,6 +33,8 @@ font-size: 0; line-height: 0; + position: relative; + display: flex; justify-content: center; align-items: center; @@ -42,6 +44,19 @@ background-size: cover; } +.image-container, +.video-container { + & img, + & canvas { + position: absolute; + max-width: unset !important; + width: 100% !important; + height: 100%; + border-radius: 0 !important; + margin: 0 !important; + } +} + .sticker-container { display: inline-flex; max-width: 128px; @@ -51,25 +66,17 @@ } } -.image-container { - & img { - max-width: unset !important; - width: 100% !important; - border-radius: 0 !important; - margin: 0 !important; - } -} - .video-container { & .ic-btn-surface { background-color: var(--bg-surface-low); + position: absolute; } video { - width: 100% + width: 100%; } } .audio-container { audio { - width: 100% + width: 100%; } -} \ No newline at end of file +} diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 49337bdc..e94e5a46 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -610,6 +610,8 @@ function genMediaContent(mE) { let msgType = mE.getContent()?.msgtype; if (mE.getType() === 'm.sticker') msgType = 'm.sticker'; + const blurhash = mContent?.info?.['xyz.amorgan.blurhash']; + switch (msgType) { case 'm.file': return ( @@ -629,6 +631,7 @@ function genMediaContent(mE) { link={mx.mxcUrlToHttp(mediaMXC)} file={isEncryptedFile ? mContent.file : null} type={mContent.info?.mimetype} + blurhash={blurhash} /> ); case 'm.sticker': @@ -666,6 +669,7 @@ function genMediaContent(mE) { height={typeof mContent.info?.h === 'number' ? mContent.info?.h : null} file={isEncryptedFile ? mContent.file : null} type={mContent.info?.mimetype} + blurhash={blurhash} /> ); default: diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 2377c8d0..81425542 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -3,12 +3,34 @@ import { micromark } from 'micromark'; import { gfm, gfmHtml } from 'micromark-extension-gfm'; import encrypt from 'browser-encrypt-attachment'; import { math } from 'micromark-extension-math'; +import { encode } from 'blurhash'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; import { getImageDimension } from '../../util/common'; import cons from './cons'; import settings from './settings'; +const blurhashField = 'xyz.amorgan.blurhash'; + +function encodeBlurhash(img) { + const canvas = document.createElement('canvas'); + canvas.width = 100; + canvas.height = 100; + const context = canvas.getContext('2d'); + context.drawImage(img, 0, 0, canvas.width, canvas.height); + const data = context.getImageData(0, 0, canvas.width, canvas.height); + return encode(data.data, data.width, data.height, 4, 4); +} + +function loadImage(url) { + return new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = (err) => reject(err); + img.src = url; + }); +} + function loadVideo(videoFile) { return new Promise((resolve, reject) => { const video = document.createElement('video'); @@ -300,10 +322,11 @@ class RoomsInput extends EventEmitter { let uploadData = null; if (fileType === 'image') { - const imgDimension = await getImageDimension(file); + const img = await loadImage(URL.createObjectURL(file)); - info.w = imgDimension.w; - info.h = imgDimension.h; + info.w = img.width; + info.h = img.height; + info[blurhashField] = encodeBlurhash(img); content.msgtype = 'm.image'; content.body = file.name || 'Image'; @@ -313,8 +336,11 @@ class RoomsInput extends EventEmitter { try { const video = await loadVideo(file); + info.w = video.videoWidth; info.h = video.videoHeight; + info[blurhashField] = encodeBlurhash(video); + const thumbnailData = await getVideoThumbnail(video, video.videoWidth, video.videoHeight, 'image/jpeg'); const thumbnailUploadData = await this.uploadFile(roomId, thumbnailData.thumbnail); info.thumbnail_info = thumbnailData.info; From 21726b63f8f42f94587e5766d21ccc656f73ff3c Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sat, 6 Aug 2022 06:05:56 +0200 Subject: [PATCH 218/824] Show full timestamp on hover (#714) * Show full timestamp on hover * Not always display time * Always show full timestamp in search --- src/app/atoms/time/Time.jsx | 44 ++++++++++++++++++++ src/app/molecules/message/Message.jsx | 25 ++++++++--- src/app/molecules/message/TimelineChange.jsx | 9 ++-- src/app/molecules/room-search/RoomSearch.jsx | 3 +- src/app/organisms/room/RoomViewContent.jsx | 9 ++-- 5 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 src/app/atoms/time/Time.jsx diff --git a/src/app/atoms/time/Time.jsx b/src/app/atoms/time/Time.jsx new file mode 100644 index 00000000..750b958f --- /dev/null +++ b/src/app/atoms/time/Time.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import dateFormat from 'dateformat'; +import { isInSameDay } from '../../../util/common'; + +function Time({ timestamp, fullTime }) { + const date = new Date(timestamp); + + const formattedFullTime = dateFormat(date, 'dd mmmm yyyy, hh:MM TT'); + let formattedDate = formattedFullTime; + + if (!fullTime) { + const compareDate = new Date(); + const isToday = isInSameDay(date, compareDate); + compareDate.setDate(compareDate.getDate() - 1); + const isYesterday = isInSameDay(date, compareDate); + + formattedDate = dateFormat(date, isToday || isYesterday ? 'hh:MM TT' : 'dd/mm/yyyy'); + if (isYesterday) { + formattedDate = `Yesterday, ${formattedDate}`; + } + } + + return ( + + ); +} + +Time.defaultProps = { + fullTime: false, +}; + +Time.propTypes = { + timestamp: PropTypes.number.isRequired, + fullTime: PropTypes.bool, +}; + +export default Time; diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index e94e5a46..2f32bafa 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -24,6 +24,7 @@ import Tooltip from '../../atoms/tooltip/Tooltip'; import Input from '../../atoms/input/Input'; import Avatar from '../../atoms/avatar/Avatar'; import IconButton from '../../atoms/button/IconButton'; +import Time from '../../atoms/time/Time'; import ContextMenu, { MenuHeader, MenuItem, MenuBorder } from '../../atoms/context-menu/ContextMenu'; import * as Media from '../media/Media'; @@ -67,7 +68,7 @@ const MessageAvatar = React.memo(({ )); const MessageHeader = React.memo(({ - userId, username, time, + userId, username, timestamp, fullTime, }) => (
    {twemojify(userId)}
    - {time} + +
    )); +MessageHeader.defaultProps = { + fullTime: false, +}; MessageHeader.propTypes = { userId: PropTypes.string.isRequired, username: PropTypes.string.isRequired, - time: PropTypes.string.isRequired, + timestamp: PropTypes.number.isRequired, + fullTime: PropTypes.bool, }; function MessageReply({ name, color, body }) { @@ -690,7 +697,7 @@ function getEditedBody(editedMEvent) { } function Message({ - mEvent, isBodyOnly, roomTimeline, focus, time, + mEvent, isBodyOnly, roomTimeline, focus, fullTime, }) { const [isEditing, setIsEditing] = useState(false); const roomId = mEvent.getRoomId(); @@ -751,7 +758,12 @@ function Message({ }
    {!isBodyOnly && ( - + )} {roomTimeline && isReply && (
    - {time} + +
    ); @@ -68,7 +71,7 @@ TimelineChange.propTypes = { PropTypes.string, PropTypes.node, ]).isRequired, - time: PropTypes.string.isRequired, + timestamp: PropTypes.number.isRequired, onClick: PropTypes.func, }; diff --git a/src/app/molecules/room-search/RoomSearch.jsx b/src/app/molecules/room-search/RoomSearch.jsx index f6bdf242..bd1cdfe9 100644 --- a/src/app/molecules/room-search/RoomSearch.jsx +++ b/src/app/molecules/room-search/RoomSearch.jsx @@ -120,14 +120,13 @@ function RoomSearch({ roomId }) { const renderTimeline = (timeline) => (
    { timeline.map((mEvent) => { - const time = dateFormat(mEvent.getDate(), 'dd/mm/yyyy - hh:MM TT'); const id = mEvent.getId(); return ( diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index ab1dfbab..52199648 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -125,10 +125,7 @@ function renderEvent(roomTimeline, mEvent, prevMEvent, isFocus = false) { && prevMEvent.getType() !== 'm.room.create' && diffMinutes(mEvent.getDate(), prevMEvent.getDate()) <= MAX_MSG_DIFF_MINUTES ); - const mDate = mEvent.getDate(); - const isToday = isInSameDay(mDate, new Date()); - - const time = dateFormat(mDate, isToday ? 'hh:MM TT' : 'dd/mm/yyyy'); + const timestamp = mEvent.getTs(); if (mEvent.getType() === 'm.room.member') { const timelineChange = parseTimelineChange(mEvent); @@ -138,7 +135,7 @@ function renderEvent(roomTimeline, mEvent, prevMEvent, isFocus = false) { key={mEvent.getId()} variant={timelineChange.variant} content={timelineChange.content} - time={time} + timestamp={timestamp} /> ); } @@ -149,7 +146,7 @@ function renderEvent(roomTimeline, mEvent, prevMEvent, isFocus = false) { isBodyOnly={isBodyOnly} roomTimeline={roomTimeline} focus={isFocus} - time={time} + fullTime={false} /> ); } From 120e8de9d10e7f3944529bad49c632a695000c5c Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 6 Aug 2022 12:21:20 +0530 Subject: [PATCH 219/824] Remove unused import --- src/app/molecules/room-search/RoomSearch.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/molecules/room-search/RoomSearch.jsx b/src/app/molecules/room-search/RoomSearch.jsx index bd1cdfe9..2612aed1 100644 --- a/src/app/molecules/room-search/RoomSearch.jsx +++ b/src/app/molecules/room-search/RoomSearch.jsx @@ -2,8 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomSearch.scss'; -import dateFormat from 'dateformat'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import { selectRoom } from '../../../client/action/navigation'; From adb584623e0d69832ffa8745138a24fb3c096c22 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 6 Aug 2022 12:40:24 +0530 Subject: [PATCH 220/824] Support RTL text in messages (#717) --- src/app/molecules/message/Message.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 2f32bafa..6e3def43 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -246,7 +246,7 @@ const MessageBody = React.memo(({ return (
    -
    +
    { msgType === 'm.emote' && ( <> {'* '} From c6812b5b116966e51ce677094acac86b5bb22618 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 6 Aug 2022 12:50:23 +0530 Subject: [PATCH 221/824] Reset read receipt on sending sticker --- src/app/organisms/room/RoomViewInput.jsx | 25 +------------------- src/client/state/RoomsInput.js | 29 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 4a7b2bf7..63870131 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -207,30 +207,7 @@ function RoomViewInput({ }; const handleSendSticker = async (data) => { - const { mxc: url, body, httpUrl } = data; - const info = {}; - - const img = new Image(); - img.src = httpUrl; - - try { - const res = await fetch(httpUrl); - const blob = await res.blob(); - info.w = img.width; - info.h = img.height; - info.mimetype = blob.type; - info.size = blob.size; - info.thumbnail_info = { ...info }; - info.thumbnail_url = url; - } catch { - // send sticker without info - } - - mx.sendEvent(roomId, 'm.sticker', { - body, - url, - info, - }); + roomsInput.sendSticker(roomId, data); }; function processTyping(msg) { diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 81425542..b9215c85 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -6,7 +6,6 @@ import { math } from 'micromark-extension-math'; import { encode } from 'blurhash'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; -import { getImageDimension } from '../../util/common'; import cons from './cons'; import settings from './settings'; @@ -312,6 +311,34 @@ class RoomsInput extends EventEmitter { this.emit(cons.events.roomsInput.MESSAGE_SENT, roomId); } + async sendSticker(roomId, data) { + const { mxc: url, body, httpUrl } = data; + const info = {}; + + const img = new Image(); + img.src = httpUrl; + + try { + const res = await fetch(httpUrl); + const blob = await res.blob(); + info.w = img.width; + info.h = img.height; + info.mimetype = blob.type; + info.size = blob.size; + info.thumbnail_info = { ...info }; + info.thumbnail_url = url; + } catch { + // send sticker without info + } + + this.matrixClient.sendEvent(roomId, 'm.sticker', { + body, + url, + info, + }); + this.emit(cons.events.roomsInput.MESSAGE_SENT, roomId); + } + async sendFile(roomId, file) { const fileType = file.type.slice(0, file.type.indexOf('/')); const info = { From 91871077516cd571a5a4f5b24877f489f5c5ff3d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 14:28:49 +0530 Subject: [PATCH 222/824] Stop sending mxid in body for pills --- src/client/state/RoomsInput.js | 81 ++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index b9215c85..6b085fb3 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -10,6 +10,8 @@ import cons from './cons'; import settings from './settings'; const blurhashField = 'xyz.amorgan.blurhash'; +const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; +const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; function encodeBlurhash(img) { const canvas = document.createElement('canvas'); @@ -130,10 +132,25 @@ function bindReplyToContent(roomId, reply, content) { return newContent; } -function formatAndEmojifyText(mx, roomList, roomId, text) { - const room = mx.getRoom(roomId); +function findAndReplace(text, regex, filter, replace) { + let copyText = text; + Array.from(copyText.matchAll(regex)) + .filter(filter) + .reverse() /* to replace backward to forward */ + .forEach((match) => { + const matchText = match[0]; + const tag = replace(match); + + copyText = copyText.substr(0, match.index) + + tag + + copyText.substr(match.index + matchText.length); + }); + return copyText; +} + +function formatAndEmojifyText(mx, roomList, room, text) { const { userIdsToDisplayNames } = room.currentState; - const parentIds = roomList.getAllParentSpaces(roomId); + const parentIds = roomList.getAllParentSpaces(room.roomId); const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); @@ -144,24 +161,20 @@ function formatAndEmojifyText(mx, roomList, roomId, text) { formattedText = text; } - const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; - Array.from(formattedText.matchAll(MXID_REGEX)) - .filter((mxidMatch) => userIdsToDisplayNames[mxidMatch[0]]) - .reverse() - .forEach((mxidMatch) => { - const tag = `${userIdsToDisplayNames[mxidMatch[0]]}`; - - formattedText = formattedText.substr(0, mxidMatch.index) - + tag - + formattedText.substr(mxidMatch.index + mxidMatch[0].length); - }); - - const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; - Array.from(formattedText.matchAll(SHORTCODE_REGEX)) - .filter((shortcodeMatch) => allEmoji.has(shortcodeMatch[1])) - .reverse() /* Reversing the array ensures that indices are preserved as we start replacing */ - .forEach((shortcodeMatch) => { - const emoji = allEmoji.get(shortcodeMatch[1]); + formattedText = findAndReplace( + formattedText, + MXID_REGEX, + (match) => userIdsToDisplayNames[match[0]], + (match) => ( + `@${userIdsToDisplayNames[match[0]]}` + ), + ); + formattedText = findAndReplace( + formattedText, + SHORTCODE_REGEX, + (match) => allEmoji.has(match[1]), + (match) => { + const emoji = allEmoji.get(match[1]); let tag; if (emoji.mxc) { @@ -175,11 +188,9 @@ function formatAndEmojifyText(mx, roomList, roomId, text) { } else { tag = emoji.unicode; } - - formattedText = formattedText.substr(0, shortcodeMatch.index) - + tag - + formattedText.substr(shortcodeMatch.index + shortcodeMatch[0].length); - }); + return tag; + }, + ); return formattedText; } @@ -274,6 +285,7 @@ class RoomsInput extends EventEmitter { } async sendInput(roomId) { + const room = this.matrixClient.getRoom(roomId); const input = this.getInput(roomId); input.isSending = true; this.roomIdToInput.set(roomId, input); @@ -292,9 +304,15 @@ class RoomsInput extends EventEmitter { const formattedBody = formatAndEmojifyText( this.matrixClient, this.roomList, - roomId, + room, input.message, ); + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); if (formattedBody !== input.message) { // Formatting was applied, and we need to switch to custom HTML content.format = 'org.matrix.custom.html'; @@ -446,6 +464,7 @@ class RoomsInput extends EventEmitter { } async sendEditedMessage(roomId, mEvent, editedBody) { + const room = this.matrixClient.getRoom(roomId); const isReply = typeof mEvent.getWireContent()['m.relates_to']?.['m.in_reply_to'] !== 'undefined'; const content = { @@ -465,9 +484,15 @@ class RoomsInput extends EventEmitter { const formattedBody = formatAndEmojifyText( this.matrixClient, this.roomList, - roomId, + room, editedBody, ); + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); if (formattedBody !== editedBody) { content.formatted_body = ` * ${formattedBody}`; content.format = 'org.matrix.custom.html'; From 96b22eb55714e29f939589813361f8b28e487b0d Mon Sep 17 00:00:00 2001 From: anyone00 <41706133+anyone00@users.noreply.github.com> Date: Sun, 7 Aug 2022 12:11:56 +0300 Subject: [PATCH 223/824] Support RTL text in the input fields (#720) * Support RTL text in the room input field set the correct direction for text according to the language written in * Make all input RTLable Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- src/app/atoms/input/Input.jsx | 2 ++ src/app/organisms/room/RoomViewInput.jsx | 1 + 2 files changed, 3 insertions(+) diff --git a/src/app/atoms/input/Input.jsx b/src/app/atoms/input/Input.jsx index d9f79eb0..96c94967 100644 --- a/src/app/atoms/input/Input.jsx +++ b/src/app/atoms/input/Input.jsx @@ -16,6 +16,7 @@ function Input({ { resizable ? ( ) : ( Date: Sun, 7 Aug 2022 14:51:56 +0530 Subject: [PATCH 224/824] Bump matrix-js-sdk from 18.1.0 to 19.2.0 (#711) * Bump matrix-js-sdk from 18.1.0 to 19.2.0 Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 18.1.0 to 19.2.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v18.1.0...v19.2.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Remove session store Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 56 ++++++++++++++++++---------------------- package.json | 2 +- src/client/initMatrix.js | 1 - 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index abc3d330..8094108e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", - "matrix-js-sdk": "^18.1.0", + "matrix-js-sdk": "^19.2.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", @@ -3469,12 +3469,9 @@ "dev": true }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -3821,11 +3818,11 @@ } }, "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "dependencies": { - "base-x": "^3.0.2" + "base-x": "^4.0.0" } }, "node_modules/buffer": { @@ -9111,18 +9108,18 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.1.0.tgz", - "integrity": "sha512-O5D36paIsY7a2M2mOo7KKU7v1Mb3PVkmYKupXYcXd9gB/Ki1K4mds+vSDEhgkKyKwk6MK1AV/vgvp0xJCsttvg==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.2.0.tgz", + "integrity": "sha512-alvTasCTCo/XXSIkKEj8xKe1NMsyiVDDVIQdU9ZHI1aePq+DrAcx8CqB7L/dgjk842v+63Eke1f/jZuFWvjn4w==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", "browser-request": "^0.3.3", - "bs58": "^4.0.1", + "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", "matrix-events-sdk": "^0.0.1-beta.7", - "p-retry": "^4.5.0", + "p-retry": "4", "qs": "^6.9.6", "request": "^2.88.2", "unhomoglyph": "^1.0.6" @@ -16897,12 +16894,9 @@ "dev": true }, "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, "base64-js": { "version": "1.5.1", @@ -17184,11 +17178,11 @@ } }, "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "requires": { - "base-x": "^3.0.2" + "base-x": "^4.0.0" } }, "buffer": { @@ -21259,18 +21253,18 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-18.1.0.tgz", - "integrity": "sha512-O5D36paIsY7a2M2mOo7KKU7v1Mb3PVkmYKupXYcXd9gB/Ki1K4mds+vSDEhgkKyKwk6MK1AV/vgvp0xJCsttvg==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.2.0.tgz", + "integrity": "sha512-alvTasCTCo/XXSIkKEj8xKe1NMsyiVDDVIQdU9ZHI1aePq+DrAcx8CqB7L/dgjk842v+63Eke1f/jZuFWvjn4w==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", "browser-request": "^0.3.3", - "bs58": "^4.0.1", + "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", "matrix-events-sdk": "^0.0.1-beta.7", - "p-retry": "^4.5.0", + "p-retry": "4", "qs": "^6.9.6", "request": "^2.88.2", "unhomoglyph": "^1.0.6" diff --git a/package.json b/package.json index 9a633d3b..cb84111e 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "katex": "^0.16.0", "linkify-html": "^4.0.0-beta.5", "linkifyjs": "^4.0.0-beta.5", - "matrix-js-sdk": "^18.1.0", + "matrix-js-sdk": "^19.2.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", "micromark-extension-math": "^2.0.2", diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index 2118be56..936334ce 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -33,7 +33,6 @@ class InitMatrix extends EventEmitter { accessToken: secret.accessToken, userId: secret.userId, store: indexedDBStore, - sessionStore: new sdk.WebStorageSessionStore(global.localStorage), cryptoStore: new sdk.IndexedDBCryptoStore(global.indexedDB, 'crypto-store'), deviceId: secret.deviceId, timelineSupport: true, From d23fc228d7dc1fe97abb8913c303e62b6c8d38e8 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:04:38 +0530 Subject: [PATCH 225/824] Release v2.1.0 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8094108e..0b4ac3cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.0.4", + "version": "2.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.0.4", + "version": "2.1.0", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.11", diff --git a/package.json b/package.json index cb84111e..cf13846d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.0.4", + "version": "2.1.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 49d32a84..c63ec3e7 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.0.4', + version: '2.1.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 542ac4f4e128cc7fafb882d942d2e763eb8695b2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 20:01:31 +0530 Subject: [PATCH 226/824] Update olm --- olm.wasm | Bin 158683 -> 159054 bytes package-lock.json | 31 +++++++++++++------------------ package.json | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) mode change 100644 => 100755 olm.wasm diff --git a/olm.wasm b/olm.wasm old mode 100644 new mode 100755 index 3e308efc4f1d2f1f5c84e2aa21103ed7aad16217..eb0f50ad4de15cbd0cf9a399d2967ad868fdee24 GIT binary patch delta 36278 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 diff --git a/package-lock.json b/package-lock.json index 0b4ac3cc..3b298dd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@fontsource/inter": "^4.5.11", "@fontsource/roboto": "^4.5.7", - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", + "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", "blurhash": "^1.1.5", @@ -2425,9 +2425,9 @@ "dev": true }, "node_modules/@matrix-org/olm": { - "version": "3.2.8", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", - "integrity": "sha512-yCJzEYY2aG1z+7nxKYZC4DFYwQO/5iG019qgotJhauYJRhEG9gLrKTvXO6lRHS8TjnZzsZFZyO/hQUlI4Dryig==", + "version": "3.2.12", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", + "integrity": "sha512-muHkYUAXyRDg88YVFlmFY35vgLPovK2YPkuEtBfgnmBcxJvLpV9UMcMMxNkf8opjMV1k/NJ4niFQMzwd4UQOiA==", "license": "Apache-2.0" }, "node_modules/@nodelib/fs.scandir": { @@ -3016,8 +3016,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3033,9 +3031,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -15989,8 +15985,8 @@ "dev": true }, "@matrix-org/olm": { - "version": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", - "integrity": "sha512-yCJzEYY2aG1z+7nxKYZC4DFYwQO/5iG019qgotJhauYJRhEG9gLrKTvXO6lRHS8TjnZzsZFZyO/hQUlI4Dryig==" + "version": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", + "integrity": "sha512-muHkYUAXyRDg88YVFlmFY35vgLPovK2YPkuEtBfgnmBcxJvLpV9UMcMMxNkf8opjMV1k/NJ4niFQMzwd4UQOiA==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -16512,14 +16508,15 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": {}, + "requires": { + "ajv": "^8.0.0" + }, "dependencies": { "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16531,9 +16528,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true + "dev": true } } }, diff --git a/package.json b/package.json index cf13846d..4ce2b922 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "@fontsource/inter": "^4.5.11", "@fontsource/roboto": "^4.5.7", - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", + "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", "blurhash": "^1.1.5", From 728c5434bb6cd87f5823c3f1ca8804f702bd0a3b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 20:14:47 +0530 Subject: [PATCH 227/824] Fix blurhash visible under transparent img (#721) --- src/app/molecules/media/Media.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index 5f081b91..b272ea11 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -158,6 +158,7 @@ function Image({ name, width, height, link, file, type, blurhash, }) { const [url, setUrl] = useState(null); + const [blur, setBlur] = useState(true); useEffect(() => { let unmounted = false; @@ -176,8 +177,8 @@ function Image({

    - { blurhash && } - { url !== null && {name}} + { blurhash && blur && } + { url !== null && setBlur(false)} src={url || link} alt={name} />}
    ); From 20e1df43d02d0089f7fe46dbd6e4bf84d8d6e2a3 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 20:21:16 +0530 Subject: [PATCH 228/824] Release v2.1.1 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b298dd0..f808e3f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.1.0", + "version": "2.1.1", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.11", diff --git a/package.json b/package.json index 4ce2b922..1b7ac1ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.1.0", + "version": "2.1.1", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index c63ec3e7..1d962836 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.1.0', + version: '2.1.1', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 9f99320fdad1a89387057dcd6ddb9b995a65d3dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Aug 2022 09:30:34 +0530 Subject: [PATCH 229/824] Bump docker/build-push-action from 3.1.0 to 3.1.1 (#725) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 5e4f2fc5..1e7a71f3 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Build Docker image - uses: docker/build-push-action@v3.1.0 + uses: docker/build-push-action@v3.1.1 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 857f9363..7147c759 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -86,7 +86,7 @@ jobs: with: images: ajbura/cinny - name: Build and push Docker image - uses: docker/build-push-action@v3.1.0 + uses: docker/build-push-action@v3.1.1 with: context: . platforms: linux/amd64,linux/arm64 From ce1e263d5730e768929bc75e6376df2e42daccca Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:33:54 +0530 Subject: [PATCH 230/824] Only scale image bigger than 512px (#731) --- src/app/molecules/image-pack/ImagePackUpload.jsx | 2 ++ src/util/common.js | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/app/molecules/image-pack/ImagePackUpload.jsx b/src/app/molecules/image-pack/ImagePackUpload.jsx index 9358856d..0b7c23b7 100644 --- a/src/app/molecules/image-pack/ImagePackUpload.jsx +++ b/src/app/molecules/image-pack/ImagePackUpload.jsx @@ -41,11 +41,13 @@ function ImagePackUpload({ onUpload }) { const img = evt.target.files[0]; if (!img) return; setImgFile(img); + shortcodeRef.current.value = img.name.slice(0, img.name.indexOf('.')); shortcodeRef.current.focus(); }; const handleRemove = () => { setImgFile(null); inputRef.current.value = null; + shortcodeRef.current.value = ''; }; return ( diff --git a/src/util/common.js b/src/util/common.js index 57891a9d..83fd20fe 100644 --- a/src/util/common.js +++ b/src/util/common.js @@ -166,6 +166,9 @@ export function scaleDownImage(imageFile, width, height) { img.onload = () => { let newWidth = img.width; let newHeight = img.height; + if (newHeight <= height && newWidth <= width) { + resolve(imageFile); + } if (newHeight > height) { newWidth = Math.floor(newWidth * (height / newHeight)); From 1692098d5d8254eb9241527f23673762586e72e9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:41:07 +0530 Subject: [PATCH 231/824] Fix logout not working when server offline --- src/client/action/logout.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/client/action/logout.js b/src/client/action/logout.js index 3c7b8486..c4047bb7 100644 --- a/src/client/action/logout.js +++ b/src/client/action/logout.js @@ -1,13 +1,16 @@ import initMatrix from '../initMatrix'; -function logout() { +async function logout() { const mx = initMatrix.matrixClient; mx.stopClient(); - mx.logout().then(() => { - mx.clearStores(); - window.localStorage.clear(); - window.location.reload(); - }); + try { + await mx.logout(); + } catch { + // ignore if failed to logout + } + mx.clearStores(); + window.localStorage.clear(); + window.location.reload(); } export default logout; From 3c1cc59d599bb5dcb2adf327d059601ada5bb5e4 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:28:39 +0530 Subject: [PATCH 232/824] Escape html with markdown off (#732) --- src/app/molecules/message/Message.jsx | 8 +++- src/client/state/RoomsInput.js | 63 +++++++++++++-------------- src/util/sanitize.js | 10 ++--- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 6e3def43..e4b68834 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -206,7 +206,13 @@ const MessageBody = React.memo(({ let content = null; if (isCustomHTML) { try { - content = twemojify(sanitizeCustomHtml(body), undefined, true, false, true); + content = twemojify( + sanitizeCustomHtml(initMatrix.matrixClient, body), + undefined, + true, + false, + true, + ); } catch { console.error('Malformed custom html: ', body); content = twemojify(body, undefined); diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 6b085fb3..e1d3acf9 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -6,6 +6,7 @@ import { math } from 'micromark-extension-math'; import { encode } from 'blurhash'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; +import { sanitizeText } from '../../util/sanitize'; import cons from './cons'; import settings from './settings'; @@ -148,29 +149,25 @@ function findAndReplace(text, regex, filter, replace) { return copyText; } -function formatAndEmojifyText(mx, roomList, room, text) { +function formatUserPill(room, text) { const { userIdsToDisplayNames } = room.currentState; - const parentIds = roomList.getAllParentSpaces(room.roomId); - const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); - const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); - - let formattedText; - if (settings.isMarkdown) { - formattedText = getFormattedBody(text); - } else { - formattedText = text; - } - - formattedText = findAndReplace( - formattedText, + return findAndReplace( + text, MXID_REGEX, (match) => userIdsToDisplayNames[match[0]], (match) => ( `@${userIdsToDisplayNames[match[0]]}` ), ); - formattedText = findAndReplace( - formattedText, +} + +function formatEmoji(mx, room, roomList, text) { + const parentIds = roomList.getAllParentSpaces(room.roomId); + const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); + const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); + + return findAndReplace( + text, SHORTCODE_REGEX, (match) => allEmoji.has(match[1]), (match) => { @@ -191,8 +188,6 @@ function formatAndEmojifyText(mx, roomList, room, text) { return tag; }, ); - - return formattedText; } class RoomsInput extends EventEmitter { @@ -295,25 +290,27 @@ class RoomsInput extends EventEmitter { } if (this.getMessage(roomId).trim() !== '') { + const rawMessage = input.message; let content = { - body: input.message, + body: rawMessage, msgtype: 'm.text', }; // Apply formatting if relevant - const formattedBody = formatAndEmojifyText( - this.matrixClient, - this.roomList, - room, - input.message, - ); + let formattedBody = settings.isMarkdown + ? getFormattedBody(rawMessage) + : sanitizeText(rawMessage); + + formattedBody = formatUserPill(room, formattedBody); + formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + content.body = findAndReplace( content.body, MXID_REGEX, (match) => room.currentState.userIdsToDisplayNames[match[0]], (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, ); - if (formattedBody !== input.message) { + if (formattedBody !== sanitizeText(rawMessage)) { // Formatting was applied, and we need to switch to custom HTML content.format = 'org.matrix.custom.html'; content.formatted_body = formattedBody; @@ -481,19 +478,19 @@ class RoomsInput extends EventEmitter { }; // Apply formatting if relevant - const formattedBody = formatAndEmojifyText( - this.matrixClient, - this.roomList, - room, - editedBody, - ); + let formattedBody = settings.isMarkdown + ? getFormattedBody(editedBody) + : sanitizeText(editedBody); + formattedBody = formatUserPill(room, formattedBody); + formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + content.body = findAndReplace( content.body, MXID_REGEX, (match) => room.currentState.userIdsToDisplayNames[match[0]], (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, ); - if (formattedBody !== editedBody) { + if (formattedBody !== sanitizeText(editedBody)) { content.formatted_body = ` * ${formattedBody}`; content.format = 'org.matrix.custom.html'; content['m.new_content'].formatted_body = formattedBody; diff --git a/src/util/sanitize.js b/src/util/sanitize.js index 5351a1a0..ade47ffc 100644 --- a/src/util/sanitize.js +++ b/src/util/sanitize.js @@ -1,7 +1,7 @@ import sanitizeHtml from 'sanitize-html'; -import initMatrix from '../client/initMatrix'; const MAX_TAG_NESTING = 100; +let mx = null; const permittedHtmlTags = [ 'font', 'del', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', @@ -54,7 +54,7 @@ function transformATag(tagName, attribs) { 'data-mx-pill': userId, }, }; - if (userId === initMatrix.matrixClient.getUserId()) { + if (userId === mx?.getUserId()) { pill.attribs['data-mx-ping'] = undefined; } return pill; @@ -76,17 +76,17 @@ function transformATag(tagName, attribs) { function transformImgTag(tagName, attribs) { const { src } = attribs; - const mx = initMatrix.matrixClient; return { tagName, attribs: { ...attribs, - src: src.startsWith('mxc://') ? mx.mxcUrlToHttp(src) : src, + src: src.startsWith('mxc://') ? mx?.mxcUrlToHttp(src) : src, }, }; } -export function sanitizeCustomHtml(body) { +export function sanitizeCustomHtml(matrixClient, body) { + mx = matrixClient; return sanitizeHtml(body, { allowedTags: permittedHtmlTags, allowedAttributes: permittedTagToAttributes, From 1da3d252e8f4ed7e1a6573f87e6275ead403b1c1 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 16:13:53 +0530 Subject: [PATCH 233/824] Add navigation bar to sticker board --- src/app/organisms/emoji-board/EmojiBoard.jsx | 104 +++++++++--------- src/app/organisms/emoji-board/EmojiBoard.scss | 9 +- .../organisms/sticker-board/StickerBoard.jsx | 31 +++++- .../organisms/sticker-board/StickerBoard.scss | 16 +++ 4 files changed, 103 insertions(+), 57 deletions(-) diff --git a/src/app/organisms/emoji-board/EmojiBoard.jsx b/src/app/organisms/emoji-board/EmojiBoard.jsx index b97cab0a..d9762323 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.jsx +++ b/src/app/organisms/emoji-board/EmojiBoard.jsx @@ -252,6 +252,58 @@ function EmojiBoard({ onSelect, searchRef }) { return (
    + +
    + {recentEmojis.length > 0 && ( + openGroup(0)} + src={RecentClockIC} + tooltip="Recent" + tooltipPlacement="left" + /> + )} +
    + { + availableEmojis.map((pack) => { + const src = initMatrix.matrixClient + .mxcUrlToHttp(pack.avatarUrl ?? pack.getEmojis()[0].mxc); + return ( + openGroup(recentOffset + pack.packIndex)} + src={src} + key={pack.packIndex} + tooltip={pack.displayName ?? 'Unknown'} + tooltipPlacement="left" + isImage + /> + ); + }) + } +
    +
    + { + [ + [0, EmojiIC, 'Smilies'], + [1, DogIC, 'Animals'], + [2, CupIC, 'Food'], + [3, BallIC, 'Activities'], + [4, PhotoIC, 'Travel'], + [5, BulbIC, 'Objects'], + [6, PeaceIC, 'Symbols'], + [7, FlagIC, 'Flags'], + ].map(([indx, ico, name]) => ( + openGroup(recentOffset + availableEmojis.length + indx)} + key={indx} + src={ico} + tooltip={name} + tooltipPlacement="left" + /> + )) + } +
    +
    +
    @@ -285,58 +337,6 @@ function EmojiBoard({ onSelect, searchRef }) { :slight_smile:
    - -
    - {recentEmojis.length > 0 && ( - openGroup(0)} - src={RecentClockIC} - tooltip="Recent" - tooltipPlacement="right" - /> - )} -
    - { - availableEmojis.map((pack) => { - const src = initMatrix.matrixClient - .mxcUrlToHttp(pack.avatarUrl ?? pack.getEmojis()[0].mxc); - return ( - openGroup(recentOffset + pack.packIndex)} - src={src} - key={pack.packIndex} - tooltip={pack.displayName ?? 'Unknown'} - tooltipPlacement="right" - isImage - /> - ); - }) - } -
    -
    - { - [ - [0, EmojiIC, 'Smilies'], - [1, DogIC, 'Animals'], - [2, CupIC, 'Food'], - [3, BallIC, 'Activities'], - [4, PhotoIC, 'Travel'], - [5, BulbIC, 'Objects'], - [6, PeaceIC, 'Symbols'], - [7, FlagIC, 'Flags'], - ].map(([indx, ico, name]) => ( - openGroup(recentOffset + availableEmojis.length + indx)} - key={indx} - src={ico} - tooltip={name} - tooltipPlacement="right" - /> - )) - } -
    -
    -
    ); } diff --git a/src/app/organisms/emoji-board/EmojiBoard.scss b/src/app/organisms/emoji-board/EmojiBoard.scss index 6883e18e..7bdaa066 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.scss +++ b/src/app/organisms/emoji-board/EmojiBoard.scss @@ -26,7 +26,7 @@ min-height: 100%; padding: 4px 6px; background-color: var(--bg-surface-low); - @include dir.side(border, 1px solid var(--bg-surface-border), none); + @include dir.side(border, none, 1px solid var(--bg-surface-border)); position: relative; @@ -122,8 +122,11 @@ @include dir.side(margin, var(--left-margin), var(--right-margin)); } & .emoji { - width: 38px; - height: 38px; + max-width: 38px; + max-height: 38px; + width: 100%; + height: 100%; + overflow: hidden; object-fit: contain; padding: var(--emoji-padding); cursor: pointer; diff --git a/src/app/organisms/sticker-board/StickerBoard.jsx b/src/app/organisms/sticker-board/StickerBoard.jsx index 53b75635..91e25918 100644 --- a/src/app/organisms/sticker-board/StickerBoard.jsx +++ b/src/app/organisms/sticker-board/StickerBoard.jsx @@ -1,6 +1,6 @@ /* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/no-static-element-interactions */ -import React from 'react'; +import React, { useRef } from 'react'; import PropTypes from 'prop-types'; import './StickerBoard.scss'; @@ -9,10 +9,12 @@ import { getRelevantPacks } from '../emoji-board/custom-emoji'; import Text from '../../atoms/text/Text'; import ScrollView from '../../atoms/scroll/ScrollView'; +import IconButton from '../../atoms/button/IconButton'; function StickerBoard({ roomId, onSelect }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); + const scrollRef = useRef(null); const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); @@ -38,6 +40,11 @@ function StickerBoard({ roomId, onSelect }) { onSelect(stickerData); }; + const openGroup = (groupIndex) => { + const scrollContent = scrollRef.current.firstElementChild; + scrollContent.children[groupIndex].scrollIntoView(); + }; + const renderPack = (pack) => (
    {pack.displayName ?? 'Unknown'} @@ -50,6 +57,7 @@ function StickerBoard({ roomId, onSelect }) { alt={sticker.shortcode} title={sticker.body ?? sticker.shortcode} data-mx-sticker={sticker.mxc} + loading="lazy" /> ))}
    @@ -58,8 +66,27 @@ function StickerBoard({ roomId, onSelect }) { return (
    + {packs.length > 0 && ( + +
    + {packs.map((pack, index) => { + const src = mx.mxcUrlToHttp(pack.avatarUrl ?? pack.getStickers()[0].mxc); + return ( + openGroup(index)} + src={src} + tooltip={pack.displayName || 'Unknown'} + tooltipPlacement="left" + isImage + /> + ); + })} +
    +
    + )}
    - +
    .scrollbar { + width: initial; + height: var(--sticker-board-height); + } + + &__sidebar { + display: flex; + flex-direction: column; + min-height: 100%; + padding: 4px 6px; + + background-color: var(--bg-surface-low); + @include dir.side(border, none, 1px solid var(--bg-surface-border)); + } &__container { flex-grow: 1; From 59fd34a4b4a7ec1c2628d18db5fa622f495c13be Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 16:24:22 +0530 Subject: [PATCH 234/824] Replace space by underscore in emoji shortcodes --- src/app/molecules/image-pack/ImagePack.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/image-pack/ImagePack.jsx b/src/app/molecules/image-pack/ImagePack.jsx index 725291d1..f88886c1 100644 --- a/src/app/molecules/image-pack/ImagePack.jsx +++ b/src/app/molecules/image-pack/ImagePack.jsx @@ -118,7 +118,7 @@ function useImagePackHandles(pack, sendPackContent) { const getNewKey = (key) => { if (typeof key !== 'string') return undefined; - let newKey = key?.replace(/\s/g, '-'); + let newKey = key?.replace(/\s/g, '_'); if (pack.getImages().get(newKey)) { newKey = suffixRename( newKey, From 0cf5aac591028ccb5ed760bd25853e7ad7dd023c Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 16:31:02 +0530 Subject: [PATCH 235/824] Fix emoji board style --- src/app/organisms/emoji-board/EmojiBoard.scss | 1 - src/app/organisms/sticker-board/StickerBoard.scss | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/app/organisms/emoji-board/EmojiBoard.scss b/src/app/organisms/emoji-board/EmojiBoard.scss index 7bdaa066..7f2e2384 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.scss +++ b/src/app/organisms/emoji-board/EmojiBoard.scss @@ -25,7 +25,6 @@ min-height: 100%; padding: 4px 6px; - background-color: var(--bg-surface-low); @include dir.side(border, none, 1px solid var(--bg-surface-border)); position: relative; diff --git a/src/app/organisms/sticker-board/StickerBoard.scss b/src/app/organisms/sticker-board/StickerBoard.scss index 524ceeae..b4e55130 100644 --- a/src/app/organisms/sticker-board/StickerBoard.scss +++ b/src/app/organisms/sticker-board/StickerBoard.scss @@ -17,8 +17,6 @@ flex-direction: column; min-height: 100%; padding: 4px 6px; - - background-color: var(--bg-surface-low); @include dir.side(border, none, 1px solid var(--bg-surface-border)); } From 258afec39134e33319a68c7839fe2248c6b58465 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 17:20:55 +0530 Subject: [PATCH 236/824] Only render mxc images in markdown --- src/util/sanitize.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/util/sanitize.js b/src/util/sanitize.js index ade47ffc..0f88c62b 100644 --- a/src/util/sanitize.js +++ b/src/util/sanitize.js @@ -76,11 +76,22 @@ function transformATag(tagName, attribs) { function transformImgTag(tagName, attribs) { const { src } = attribs; + if (src.startsWith('mxc://') === false) { + return { + tagName: 'a', + attribs: { + href: src, + rel: 'noopener', + target: '_blank', + }, + text: attribs.alt || src, + }; + } return { tagName, attribs: { ...attribs, - src: src.startsWith('mxc://') ? mx?.mxcUrlToHttp(src) : src, + src: mx?.mxcUrlToHttp(src), }, }; } From 820d08017a98bc314982cd3f30c2e73f28f25c2f Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 18:41:09 +0530 Subject: [PATCH 237/824] Fix image not loading without h/w data (#738) --- src/app/molecules/media/Media.jsx | 35 ++++++++++++++++-------------- src/app/molecules/media/Media.scss | 25 +++++++++++---------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index b272ea11..5ef25ecb 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -178,7 +178,7 @@ function Image({
    { blurhash && blur && } - { url !== null && setBlur(false)} src={url || link} alt={name} />} + { url !== null && setBlur(false)} src={url || link} alt={name} />}
    ); @@ -227,11 +227,11 @@ function Sticker({ Sticker.defaultProps = { file: null, type: '', + width: null, + height: null, }; Sticker.propTypes = { name: PropTypes.string.isRequired, - width: null, - height: null, width: PropTypes.number, height: PropTypes.number, link: PropTypes.string.isRequired, @@ -289,6 +289,7 @@ function Video({ const [isLoading, setIsLoading] = useState(false); const [url, setUrl] = useState(null); const [thumbUrl, setThumbUrl] = useState(null); + const [blur, setBlur] = useState(true); useEffect(() => { let unmounted = false; @@ -303,16 +304,16 @@ function Video({ }; }, []); - async function loadVideo() { + const loadVideo = async () => { const myUrl = await getUrl(link, type, file); setUrl(myUrl); setIsLoading(false); - } + }; - function handlePlayVideo() { + const handlePlayVideo = () => { setIsLoading(true); loadVideo(); - } + }; return (
    @@ -323,15 +324,17 @@ function Video({ }} className="video-container" > - { url === null && blurhash && } - { url === null && thumbUrl !== null && ( - /* eslint-disable-next-line jsx-a11y/alt-text */ - - )} - { url === null && isLoading && } - { url === null && !isLoading && } - { url !== null && ( - /* eslint-disable-next-line jsx-a11y/media-has-caption */ + { url === null ? ( + <> + { blurhash && blur && } + { thumbUrl !== null && ( + setBlur(false)} alt={name} /> + )} + {isLoading && } + {!isLoading && } + + ) : ( + /* eslint-disable-next-line jsx-a11y/media-has-caption */ diff --git a/src/app/molecules/media/Media.scss b/src/app/molecules/media/Media.scss index b26b232a..7c73305a 100644 --- a/src/app/molecules/media/Media.scss +++ b/src/app/molecules/media/Media.scss @@ -27,14 +27,21 @@ white-space: initial; } +.sticker-container { + display: inline-flex; + max-width: 128px; + width: 100%; + & img { + width: 100% !important; + } +} + .image-container, .video-container, .audio-container { font-size: 0; line-height: 0; - position: relative; - display: flex; justify-content: center; align-items: center; @@ -48,7 +55,6 @@ .video-container { & img, & canvas { - position: absolute; max-width: unset !important; width: 100% !important; height: 100%; @@ -57,18 +63,13 @@ } } -.sticker-container { - display: inline-flex; - max-width: 128px; - width: 100%; - & img { - width: 100% !important; - } -} - .video-container { + position: relative; & .ic-btn-surface { background-color: var(--bg-surface-low); + } + & .ic-btn-surface, + & .donut-spinner { position: absolute; } video { From 74a20a0e14f56ebfeda49ad19256bd64395ecb5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 18:43:31 +0530 Subject: [PATCH 238/824] Bump sass from 1.54.1 to 1.54.3 (#728) Bumps [sass](https://github.com/sass/dart-sass) from 1.54.1 to 1.54.3. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.54.1...1.54.3) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f808e3f9..0b0890d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.54.1", + "sass": "^1.54.3", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -12181,9 +12181,9 @@ } }, "node_modules/sass": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.1.tgz", - "integrity": "sha512-GHJJr31Me32RjjUBagyzx8tzjKBUcDwo5239XANIRBq0adDu5iIG0aFO0i/TBb/4I9oyxkEv44nq/kL1DxdDhA==", + "version": "1.54.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz", + "integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23442,9 +23442,9 @@ } }, "sass": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.1.tgz", - "integrity": "sha512-GHJJr31Me32RjjUBagyzx8tzjKBUcDwo5239XANIRBq0adDu5iIG0aFO0i/TBb/4I9oyxkEv44nq/kL1DxdDhA==", + "version": "1.54.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz", + "integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 1b7ac1ac..d7e18dbb 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", "path-browserify": "^1.0.1", - "sass": "^1.54.1", + "sass": "^1.54.3", "sass-loader": "^13.0.2", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", From 5de6a1bea646f0c1bb33228a39988f1293ad3f87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 18:44:00 +0530 Subject: [PATCH 239/824] Bump @fontsource/roboto from 4.5.7 to 4.5.8 (#727) Bumps [@fontsource/roboto](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/roboto) from 4.5.7 to 4.5.8. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/roboto) --- updated-dependencies: - dependency-name: "@fontsource/roboto" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b0890d9..8c147398 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.11", - "@fontsource/roboto": "^4.5.7", + "@fontsource/roboto": "^4.5.8", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", @@ -1842,9 +1842,9 @@ "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" }, "node_modules/@fontsource/roboto": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.7.tgz", - "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", + "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.4", @@ -15531,9 +15531,9 @@ "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" }, "@fontsource/roboto": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.7.tgz", - "integrity": "sha512-m57UMER23Mk6Drg9OjtHW1Y+0KPGyZfE5XJoPTOsLARLar6013kJj4X2HICt+iFLJqIgTahA/QAvSn9lwF1EEw==" + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", + "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "@humanwhocodes/config-array": { "version": "0.10.4", diff --git a/package.json b/package.json index d7e18dbb..4afecc42 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.11", - "@fontsource/roboto": "^4.5.7", + "@fontsource/roboto": "^4.5.8", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", "babel-polyfill": "^6.26.0", From c4e36a1f9745173cd41b5368dbef888f06dddf38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 18:46:19 +0530 Subject: [PATCH 240/824] Bump @fontsource/inter from 4.5.11 to 4.5.12 (#726) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.11 to 4.5.12. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c147398..925cfaf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.1.1", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.11", + "@fontsource/inter": "^4.5.12", "@fontsource/roboto": "^4.5.8", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", @@ -1837,9 +1837,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.11.tgz", - "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.12.tgz", + "integrity": "sha512-bGKk4/8tube/nCk8hav0ZDBVbzJzc7m0Vt4xF5p15IN4YImwGdtKG38Oq5bU8xHNS+VfvbFFCepgQNj7Pr/Lvg==" }, "node_modules/@fontsource/roboto": { "version": "4.5.8", @@ -15526,9 +15526,9 @@ } }, "@fontsource/inter": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.11.tgz", - "integrity": "sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.12.tgz", + "integrity": "sha512-bGKk4/8tube/nCk8hav0ZDBVbzJzc7m0Vt4xF5p15IN4YImwGdtKG38Oq5bU8xHNS+VfvbFFCepgQNj7Pr/Lvg==" }, "@fontsource/roboto": { "version": "4.5.8", diff --git a/package.json b/package.json index 4afecc42..023c60e9 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.11", + "@fontsource/inter": "^4.5.12", "@fontsource/roboto": "^4.5.8", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", "@tippyjs/react": "^4.2.6", From 214d49f1d973814a2a9f29378232aae7027832b6 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Aug 2022 19:10:12 +0530 Subject: [PATCH 241/824] Release v2.1.2 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 925cfaf5..08eda3c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.1.1", + "version": "2.1.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.1.1", + "version": "2.1.2", "license": "MIT", "dependencies": { "@fontsource/inter": "^4.5.12", diff --git a/package.json b/package.json index 023c60e9..b9d9cd70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.1.1", + "version": "2.1.2", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 1d962836..0dc01d49 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.1.1', + version: '2.1.2', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From af6995580179275f8969a6fec4f8ccc37bcc2a17 Mon Sep 17 00:00:00 2001 From: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com> Date: Fri, 12 Aug 2022 11:33:56 +0100 Subject: [PATCH 242/824] Fix grammar of read receipt text (#744) 'other' should be plural in this context. --- src/app/organisms/room/common.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/room/common.jsx b/src/app/organisms/room/common.jsx index 12b9f2ba..28974a85 100644 --- a/src/app/organisms/room/common.jsx +++ b/src/app/organisms/room/common.jsx @@ -164,7 +164,7 @@ function getUsersActionJsx(roomId, userIds, actionStr) { const othersCount = userIds.length - MAX_VISIBLE_COUNT; // eslint-disable-next-line react/jsx-one-expression-per-line - return <>{u1Jsx}, {u2Jsx}, {u3Jsx} and {othersCount} other are {actionStr}; + return <>{u1Jsx}, {u2Jsx}, {u3Jsx} and {othersCount} others are {actionStr}; } function parseTimelineChange(mEvent) { From a417980a81c1b0ec97a0891e11b5b893c9dcce55 Mon Sep 17 00:00:00 2001 From: James Date: Sun, 14 Aug 2022 12:01:17 +0100 Subject: [PATCH 243/824] Improve MIME type handling on File Upload and in Message Component (#688) * move allowed MIME types to own util file * add check for safe MIME type before choosing how to upload * check for allowed blob type to decide what component to load * re-add check for safe mimetype * fix bracket positioning --- src/app/molecules/media/Media.jsx | 37 +-------------------------- src/app/molecules/message/Message.jsx | 8 +++++- src/client/state/RoomsInput.js | 3 ++- src/util/mimetypes.js | 37 +++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 38 deletions(-) create mode 100644 src/util/mimetypes.js diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index 5ef25ecb..d7ba3854 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -13,42 +13,7 @@ import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; import PlaySVG from '../../../../public/res/ic/outlined/play.svg'; -// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts#L73 -const ALLOWED_BLOB_MIMETYPES = [ - 'image/jpeg', - 'image/gif', - 'image/png', - 'image/apng', - 'image/webp', - 'image/avif', - - 'video/mp4', - 'video/webm', - 'video/ogg', - 'video/quicktime', - - 'audio/mp4', - 'audio/webm', - 'audio/aac', - 'audio/mpeg', - 'audio/ogg', - 'audio/wave', - 'audio/wav', - 'audio/x-wav', - 'audio/x-pn-wav', - 'audio/flac', - 'audio/x-flac', -]; -function getBlobSafeMimeType(mimetype) { - if (!ALLOWED_BLOB_MIMETYPES.includes(mimetype)) { - return 'application/octet-stream'; - } - // Required for Chromium browsers - if (mimetype === 'video/quicktime') { - return 'video/mp4'; - } - return mimetype; -} +import { getBlobSafeMimeType } from '../../../util/mimetypes'; async function getDecryptedBlob(response, type, decryptData) { const arrayBuffer = await response.arrayBuffer(); diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index e4b68834..1e5a006e 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -37,6 +37,7 @@ import CmdIC from '../../../../public/res/ic/outlined/cmd.svg'; import BinIC from '../../../../public/res/ic/outlined/bin.svg'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; +import { getBlobSafeMimeType } from '../../../util/mimetypes'; function PlaceholderMessage() { return ( @@ -621,7 +622,12 @@ function genMediaContent(mE) { if (typeof mediaMXC === 'undefined' || mediaMXC === '') return Malformed event; let msgType = mE.getContent()?.msgtype; - if (mE.getType() === 'm.sticker') msgType = 'm.sticker'; + const safeMimetype = getBlobSafeMimeType(mContent.info?.mimetype); + if (mE.getType() === 'm.sticker') { + msgType = 'm.sticker'; + } else if (safeMimetype === 'application/octet-stream') { + msgType = 'm.file'; + } const blurhash = mContent?.info?.['xyz.amorgan.blurhash']; diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index e1d3acf9..9b662880 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -6,6 +6,7 @@ import { math } from 'micromark-extension-math'; import { encode } from 'blurhash'; import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; import { mathExtensionHtml, spoilerExtension, spoilerExtensionHtml } from '../../util/markdown'; +import { getBlobSafeMimeType } from '../../util/mimetypes'; import { sanitizeText } from '../../util/sanitize'; import cons from './cons'; import settings from './settings'; @@ -355,7 +356,7 @@ class RoomsInput extends EventEmitter { } async sendFile(roomId, file) { - const fileType = file.type.slice(0, file.type.indexOf('/')); + const fileType = getBlobSafeMimeType(file.type).slice(0, file.type.indexOf('/')); const info = { mimetype: file.type, size: file.size, diff --git a/src/util/mimetypes.js b/src/util/mimetypes.js new file mode 100644 index 00000000..121ae069 --- /dev/null +++ b/src/util/mimetypes.js @@ -0,0 +1,37 @@ +// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts +export const ALLOWED_BLOB_MIMETYPES = [ + 'image/jpeg', + 'image/gif', + 'image/png', + 'image/apng', + 'image/webp', + 'image/avif', + + 'video/mp4', + 'video/webm', + 'video/ogg', + 'video/quicktime', + + 'audio/mp4', + 'audio/webm', + 'audio/aac', + 'audio/mpeg', + 'audio/ogg', + 'audio/wave', + 'audio/wav', + 'audio/x-wav', + 'audio/x-pn-wav', + 'audio/flac', + 'audio/x-flac', +]; + +export function getBlobSafeMimeType(mimetype) { + if (!ALLOWED_BLOB_MIMETYPES.includes(mimetype)) { + return 'application/octet-stream'; + } + // Required for Chromium browsers + if (mimetype === 'video/quicktime') { + return 'video/mp4'; + } + return mimetype; +} From 4cd8f4a94cad5bc5e8fe8c456c87eefbcf692a84 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 19 Aug 2022 12:15:22 +0530 Subject: [PATCH 244/824] Open image in lightbox (#767) * Add lightbox * Fix vertical media height (#467) * Update dialog animation * Fix overlay opacity * Fix dialog animation * Update open in new tab icon --- public/res/ic/outlined/external.svg | 14 ++--- src/app/atoms/modal/RawModal.jsx | 1 - src/app/atoms/modal/RawModal.scss | 51 ++++++++++--------- .../image-lightbox/ImageLightbox.jsx | 47 +++++++++++++++++ .../image-lightbox/ImageLightbox.scss | 50 ++++++++++++++++++ src/app/molecules/media/Media.jsx | 42 ++++++++++++--- src/app/molecules/media/Media.scss | 7 +++ src/index.scss | 5 +- 8 files changed, 173 insertions(+), 44 deletions(-) create mode 100644 src/app/molecules/image-lightbox/ImageLightbox.jsx create mode 100644 src/app/molecules/image-lightbox/ImageLightbox.scss diff --git a/public/res/ic/outlined/external.svg b/public/res/ic/outlined/external.svg index 92b007cc..adade1bd 100644 --- a/public/res/ic/outlined/external.svg +++ b/public/res/ic/outlined/external.svg @@ -1,12 +1,4 @@ - - - - - - - - - - + + + diff --git a/src/app/atoms/modal/RawModal.jsx b/src/app/atoms/modal/RawModal.jsx index 306d7d1b..450be0e0 100644 --- a/src/app/atoms/modal/RawModal.jsx +++ b/src/app/atoms/modal/RawModal.jsx @@ -42,7 +42,6 @@ function RawModal({ shouldCloseOnEsc={closeFromOutside} shouldCloseOnOverlayClick={closeFromOutside} shouldReturnFocusAfterClose={false} - closeTimeoutMS={300} > {children} diff --git a/src/app/atoms/modal/RawModal.scss b/src/app/atoms/modal/RawModal.scss index 72a64d76..80458752 100644 --- a/src/app/atoms/modal/RawModal.scss +++ b/src/app/atoms/modal/RawModal.scss @@ -1,27 +1,3 @@ -.ReactModal__Overlay { - opacity: 0; - transition: opacity 200ms var(--fluid-slide-up); -} -.ReactModal__Overlay--after-open{ - opacity: 1; -} -.ReactModal__Overlay--before-close{ - opacity: 0; -} - -.ReactModal__Content { - transform: translateY(100%); - transition: transform 200ms var(--fluid-slide-up); -} - -.ReactModal__Content--after-open{ - transform: translateY(0); -} - -.ReactModal__Content--before-close{ - transform: translateY(100%); -} - .raw-modal { --small-modal-width: 525px; --medium-modal-width: 712px; @@ -60,4 +36,31 @@ height: 100%; background-color: var(--bg-overlay); } +} + +.ReactModal__Overlay { + animation: raw-modal--overlay 150ms; +} + +.ReactModal__Content { + animation: raw-modal--content 150ms; +} + +@keyframes raw-modal--content { + 0% { + transform: translateY(100px); + opacity: .5; + } + 100% { + transform: translateY(0); + opacity: 1; + } +} +@keyframes raw-modal--overlay { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } } \ No newline at end of file diff --git a/src/app/molecules/image-lightbox/ImageLightbox.jsx b/src/app/molecules/image-lightbox/ImageLightbox.jsx new file mode 100644 index 00000000..c1c45db8 --- /dev/null +++ b/src/app/molecules/image-lightbox/ImageLightbox.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './ImageLightbox.scss'; +import FileSaver from 'file-saver'; + +import Text from '../../atoms/text/Text'; +import RawModal from '../../atoms/modal/RawModal'; +import IconButton from '../../atoms/button/IconButton'; + +import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; +import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; + +function ImageLightbox({ + url, alt, isOpen, onRequestClose, +}) { + const handleDownload = () => { + FileSaver.saveAs(url, alt); + }; + + return ( + +
    + {alt} + window.open(url)} size="small" src={ExternalSVG} /> + +
    +
    + {alt} +
    + + ); +} + +ImageLightbox.propTypes = { + url: PropTypes.string.isRequired, + alt: PropTypes.string.isRequired, + isOpen: PropTypes.bool.isRequired, + onRequestClose: PropTypes.func.isRequired, +}; + +export default ImageLightbox; diff --git a/src/app/molecules/image-lightbox/ImageLightbox.scss b/src/app/molecules/image-lightbox/ImageLightbox.scss new file mode 100644 index 00000000..5a900b98 --- /dev/null +++ b/src/app/molecules/image-lightbox/ImageLightbox.scss @@ -0,0 +1,50 @@ +@use '../../partials/flex'; +@use '../../partials/text'; + +.image-lightbox__modal { + box-shadow: none; + width: unset; + gap: var(--sp-normal); + + border-radius: 0; + pointer-events: none; + + & .text { + color: white; + } + & .ic-raw { + background-color: white; + } +} + +.image-lightbox__overlay { + background-color: var(--bg-overlay-low); +} + + +.image-lightbox__header > *, +.image-lightbox__content > * { + pointer-events: all; +} +.image-lightbox__header { + display: flex; + align-items: center; + + & > .text { + @extend .cp-fx__item-one; + @extend .cp-txt__ellipsis; + } +} +.image-lightbox__content { + display: flex; + justify-content: center; + max-height: 90vh; + + & img { + background-color: black; + object-fit: contain; + max-width: 100%; + max-height: 100%; + border-radius: var(--bo-radius); + } +} \ No newline at end of file diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx index d7ba3854..e2b61775 100644 --- a/src/app/molecules/media/Media.jsx +++ b/src/app/molecules/media/Media.jsx @@ -8,6 +8,7 @@ import { BlurhashCanvas } from 'react-blurhash'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; import Spinner from '../../atoms/spinner/Spinner'; +import ImageLightbox from '../image-lightbox/ImageLightbox'; import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; @@ -124,6 +125,7 @@ function Image({ }) { const [url, setUrl] = useState(null); const [blur, setBlur] = useState(true); + const [lightbox, setLightbox] = useState(false); useEffect(() => { let unmounted = false; @@ -138,14 +140,42 @@ function Image({ }; }, []); + const toggleLightbox = () => { + if (!url) return; + setLightbox(!lightbox); + }; + return ( -
    - -
    - { blurhash && blur && } - { url !== null && setBlur(false)} src={url || link} alt={name} />} + <> +
    +
    + { blurhash && blur && } + { url !== null && ( + setBlur(false)} + src={url || link} + alt={name} + /> + )} +
    -
    + {url && ( + + )} + ); } Image.defaultProps = { diff --git a/src/app/molecules/media/Media.scss b/src/app/molecules/media/Media.scss index 7c73305a..8d98c428 100644 --- a/src/app/molecules/media/Media.scss +++ b/src/app/molecules/media/Media.scss @@ -62,6 +62,13 @@ margin: 0 !important; } } +.image-container { + max-height: 460px; + img { + cursor: pointer; + object-fit: cover; + } +} .video-container { position: relative; diff --git a/src/index.scss b/src/index.scss index 3a4707ca..39d0612b 100644 --- a/src/index.scss +++ b/src/index.scss @@ -105,7 +105,7 @@ /* shadow and overlay */ --bg-overlay: rgba(0, 0, 0, 20%); - --bg-overlay-low: rgba(0, 0, 0, 85%); + --bg-overlay-low: rgba(0, 0, 0, 50%); --bs-popup: 0 0 16px rgba(0, 0, 0, 10%); @@ -264,7 +264,8 @@ } /* shadow and overlay */ - --bg-overlay: rgba(0, 0, 0, 50%); + --bg-overlay: rgba(0, 0, 0, 60%); + --bg-overlay-low: rgba(0, 0, 0, 80%); --bs-popup: 0 0 16px rgba(0, 0, 0, 25%); From 2f2680be3ccf90171dfcaec4f0aefed6ab45059f Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 19 Aug 2022 13:57:24 +0530 Subject: [PATCH 245/824] Fix minor css bugs --- src/app/molecules/image-lightbox/ImageLightbox.scss | 2 +- src/app/organisms/room/RoomViewInput.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/molecules/image-lightbox/ImageLightbox.scss b/src/app/molecules/image-lightbox/ImageLightbox.scss index 5a900b98..05520c86 100644 --- a/src/app/molecules/image-lightbox/ImageLightbox.scss +++ b/src/app/molecules/image-lightbox/ImageLightbox.scss @@ -41,7 +41,7 @@ max-height: 90vh; & img { - background-color: black; + background-color: var(--bg-surface-low); object-fit: contain; max-width: 100%; max-height: 100%; diff --git a/src/app/organisms/room/RoomViewInput.scss b/src/app/organisms/room/RoomViewInput.scss index 598c5274..9fb7c4de 100644 --- a/src/app/organisms/room/RoomViewInput.scss +++ b/src/app/organisms/room/RoomViewInput.scss @@ -70,6 +70,7 @@ &__preview > img { max-height: 40px; border-radius: var(--bo-radius); + max-width: 150px; } &__icon { padding: var(--sp-extra-tight); From 6f7934badc2f2e25ed681fea3523d6a0244dca1b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 19 Aug 2022 15:19:12 +0530 Subject: [PATCH 246/824] Fix more css bugs --- src/app/atoms/modal/RawModal.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/atoms/modal/RawModal.scss b/src/app/atoms/modal/RawModal.scss index 80458752..d612a4bc 100644 --- a/src/app/atoms/modal/RawModal.scss +++ b/src/app/atoms/modal/RawModal.scss @@ -3,7 +3,7 @@ --medium-modal-width: 712px; --large-modal-width: 1024px; - + position: relative; width: 100%; max-height: 100%; border-radius: var(--bo-radius); @@ -63,4 +63,4 @@ 100% { opacity: 1; } -} \ No newline at end of file +} From 1deef51df0c92d4c8394cb6d4c76aaf2ea473f32 Mon Sep 17 00:00:00 2001 From: jameskitt616 <52933658+jameskitt616@users.noreply.github.com> Date: Sat, 20 Aug 2022 15:26:37 +0200 Subject: [PATCH 247/824] Add cancel edit-message on Escape Key press (#765) --- src/app/molecules/message/Message.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 1e5a006e..42344d75 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -290,6 +290,11 @@ function MessageEdit({ body, onSave, onCancel }) { }, []); const handleKeyDown = (e) => { + if (e.key === 'Escape') { + e.preventDefault(); + onCancel(); + } + if (e.key === 'Enter' && e.shiftKey === false) { e.preventDefault(); onSave(editInputRef.current.value); From 7e28aa1474ffc7a074e7d6e784d1dfcb22743c66 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 20 Aug 2022 20:51:37 +0530 Subject: [PATCH 248/824] Update sidebar on room/space switch (#768) * Select last room on space/tab change (#353) * Update sidbar on room select from search (#374) * Select last room on space/tab change (#353) * Update sidbar on room select from search (#374) * Fix wrong space gets selected with some rooms * Fix auto select room in categorized space * Fix room remain selected on leave * Fix leaved room appear in category & search * Remove globally exposed vars * Hide pin spaces from home * Fix selecting dm always open dm tab * Order category by AtoZ (#769) Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- .../molecules/space-options/SpaceOptions.jsx | 4 +- src/app/organisms/join-alias/JoinAlias.jsx | 4 +- .../organisms/navigation/DrawerBreadcrumb.jsx | 7 +- src/app/organisms/navigation/Home.jsx | 6 +- src/client/event/roomList.js | 13 + src/client/initMatrix.js | 7 + src/client/state/RoomList.js | 2 +- src/client/state/navigation.js | 260 +++++++++++++++--- 8 files changed, 261 insertions(+), 42 deletions(-) diff --git a/src/app/molecules/space-options/SpaceOptions.jsx b/src/app/molecules/space-options/SpaceOptions.jsx index 56fdfd3f..0c166c6a 100644 --- a/src/app/molecules/space-options/SpaceOptions.jsx +++ b/src/app/molecules/space-options/SpaceOptions.jsx @@ -38,10 +38,10 @@ function SpaceOptions({ roomId, afterOptionSelect }) { const handleMarkAsRead = () => { const spaceChildren = roomList.getCategorizedSpaces([roomId]); - spaceChildren?.forEach((childIds, spaceId) => { + spaceChildren?.forEach((childIds) => { childIds?.forEach((childId) => { markAsRead(childId); - }) + }); }); afterOptionSelect(); }; diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx index 9e7f6df1..bb90bf35 100644 --- a/src/app/organisms/join-alias/JoinAlias.jsx +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -6,7 +6,7 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { join } from '../../../client/action/room'; -import { selectRoom, selectSpace } from '../../../client/action/navigation'; +import { selectRoom, selectTab } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; @@ -32,7 +32,7 @@ function JoinAliasContent({ term, requestClose }) { const openRoom = (roomId) => { const room = mx.getRoom(roomId); if (!room) return; - if (room.isSpaceRoom()) selectSpace(roomId); + if (room.isSpaceRoom()) selectTab(roomId); else selectRoom(roomId); requestClose(); }; diff --git a/src/app/organisms/navigation/DrawerBreadcrumb.jsx b/src/app/organisms/navigation/DrawerBreadcrumb.jsx index ca9ab6a0..be5b345b 100644 --- a/src/app/organisms/navigation/DrawerBreadcrumb.jsx +++ b/src/app/organisms/navigation/DrawerBreadcrumb.jsx @@ -6,7 +6,7 @@ import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; -import { selectSpace } from '../../../client/action/navigation'; +import { selectTab, selectSpace } from '../../../client/action/navigation'; import navigation from '../../../client/state/navigation'; import { abbreviateNumber } from '../../../util/common'; @@ -107,7 +107,10 @@ function DrawerBreadcrumb({ spaceId }) { { index !== 0 && } + )} + content={Default notification settings for all direct message.} + /> + onSelect(evt, ENC_DM)} iconSrc={ChevronBottomIC}> + {typeToLabel[rulesToType[ENC_DM]]} + + )} + content={Default notification settings for all encrypted direct message.} + /> + onSelect(evt, ROOM)} iconSrc={ChevronBottomIC}> + {typeToLabel[rulesToType[ROOM]]} + + )} + content={Default notification settings for all room message.} + /> + onSelect(evt, ENC_ROOM)} iconSrc={ChevronBottomIC}> + {typeToLabel[rulesToType[ENC_ROOM]]} + + )} + content={Default notification settings for all encrypted room message.} + /> +
    + ); +} + +export default GlobalNotification; diff --git a/src/app/molecules/global-notification/KeywordNotification.jsx b/src/app/molecules/global-notification/KeywordNotification.jsx new file mode 100644 index 00000000..c44ffc46 --- /dev/null +++ b/src/app/molecules/global-notification/KeywordNotification.jsx @@ -0,0 +1,239 @@ +import React from 'react'; +import './KeywordNotification.scss'; + +import initMatrix from '../../../client/initMatrix'; +import { openReusableContextMenu } from '../../../client/action/navigation'; +import { getEventCords } from '../../../util/common'; + +import Text from '../../atoms/text/Text'; +import Chip from '../../atoms/chip/Chip'; +import Input from '../../atoms/input/Input'; +import Button from '../../atoms/button/Button'; +import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; +import SettingTile from '../setting-tile/SettingTile'; + +import NotificationSelector from './NotificationSelector'; + +import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; + +import { useAccountData } from '../../hooks/useAccountData'; +import { + notifType, typeToLabel, getActionType, getTypeActions, +} from './GlobalNotification'; + +const DISPLAY_NAME = '.m.rule.contains_display_name'; +const ROOM_PING = '.m.rule.roomnotif'; +const USERNAME = '.m.rule.contains_user_name'; +const KEYWORD = 'keyword'; + +function useKeywordNotif() { + const mx = initMatrix.matrixClient; + const pushRules = useAccountData('m.push_rules'); + const override = pushRules?.global?.override ?? []; + const content = pushRules?.global?.content ?? []; + + const rulesToType = { + [DISPLAY_NAME]: notifType.NOISY, + [ROOM_PING]: notifType.NOISY, + [USERNAME]: notifType.NOISY, + }; + + const setRule = (rule, type) => { + const evtContent = pushRules ?? {}; + if (!evtContent.global) evtContent.global = {}; + if (!evtContent.global.override) evtContent.global.override = []; + if (!evtContent.global.content) evtContent.global.content = []; + const or = evtContent.global.override; + const ct = evtContent.global.content; + + if (rule === DISPLAY_NAME || rule === ROOM_PING) { + let orRule = or.find((r) => r?.rule_id === rule); + if (!orRule) { + orRule = { + conditions: [], + actions: [], + rule_id: rule, + default: true, + enabled: true, + }; + or.push(orRule); + } + if (rule === DISPLAY_NAME) { + orRule.conditions = [{ kind: 'contains_display_name' }]; + orRule.actions = getTypeActions(type, true); + } else { + orRule.conditions = [ + { kind: 'event_match', key: 'content.body', pattern: '@room' }, + { kind: 'sender_notification_permission', key: 'room' }, + ]; + orRule.actions = getTypeActions(type, true); + } + } else if (rule === USERNAME) { + let usernameRule = ct.find((r) => r?.rule_id === rule); + if (!usernameRule) { + const userId = mx.getUserId(); + const username = userId.match(/^@?(\S+):(\S+)$/)?.[1] ?? userId; + usernameRule = { + actions: [], + default: true, + enabled: true, + pattern: username, + rule_id: rule, + }; + ct.push(usernameRule); + } + usernameRule.actions = getTypeActions(type, true); + } else { + const keyRules = ct.filter((r) => r.rule_id !== USERNAME); + keyRules.forEach((r) => { + // eslint-disable-next-line no-param-reassign + r.actions = getTypeActions(type, true); + }); + } + + mx.setAccountData('m.push_rules', evtContent); + }; + + const addKeyword = (keyword) => { + if (content.find((r) => r.rule_id === keyword)) return; + content.push({ + rule_id: keyword, + pattern: keyword, + enabled: true, + default: false, + actions: getTypeActions(rulesToType[KEYWORD] ?? notifType.NOISY, true), + }); + mx.setAccountData('m.push_rules', pushRules); + }; + const removeKeyword = (rule) => { + pushRules.global.content = content.filter((r) => r.rule_id !== rule.rule_id); + mx.setAccountData('m.push_rules', pushRules); + }; + + const dsRule = override.find((rule) => rule.rule_id === DISPLAY_NAME); + const roomRule = override.find((rule) => rule.rule_id === ROOM_PING); + const usernameRule = content.find((rule) => rule.rule_id === USERNAME); + const keywordRule = content.find((rule) => rule.rule_id !== USERNAME); + + if (dsRule) rulesToType[DISPLAY_NAME] = getActionType(dsRule); + if (roomRule) rulesToType[ROOM_PING] = getActionType(roomRule); + if (usernameRule) rulesToType[USERNAME] = getActionType(usernameRule); + if (keywordRule) rulesToType[KEYWORD] = getActionType(keywordRule); + + return { + rulesToType, + pushRules, + setRule, + addKeyword, + removeKeyword, + }; +} + +function GlobalNotification() { + const { + rulesToType, + pushRules, + setRule, + addKeyword, + removeKeyword, + } = useKeywordNotif(); + + const keywordRules = pushRules?.global?.content.filter((r) => r.rule_id !== USERNAME) ?? []; + + const onSelect = (evt, rule) => { + openReusableContextMenu( + 'bottom', + getEventCords(evt, '.btn-surface'), + (requestClose) => ( + { + if (rulesToType[rule] !== value) setRule(rule, value); + requestClose(); + }} + /> + ), + ); + }; + + const handleSubmit = (evt) => { + evt.preventDefault(); + const { keywordInput } = evt.target.elements; + const value = keywordInput.value.trim(); + if (value === '') return; + addKeyword(value); + keywordInput.value = ''; + }; + + return ( +
    + Mentions & keywords + onSelect(evt, DISPLAY_NAME)} iconSrc={ChevronBottomIC}> + { typeToLabel[rulesToType[DISPLAY_NAME]] } + + )} + content={Default notification settings for all message containing your display name.} + /> + onSelect(evt, USERNAME)} iconSrc={ChevronBottomIC}> + { typeToLabel[rulesToType[USERNAME]] } + + )} + content={Default notification settings for all message containing your username.} + /> + onSelect(evt, ROOM_PING)} iconSrc={ChevronBottomIC}> + {typeToLabel[rulesToType[ROOM_PING]]} + + )} + content={Default notification settings for all messages containing @room.} + /> + { rulesToType[KEYWORD] && ( + onSelect(evt, KEYWORD)} iconSrc={ChevronBottomIC}> + {typeToLabel[rulesToType[KEYWORD]]} + + )} + content={Default notification settings for all message containing keywords.} + /> + )} + + Get notification when a message contains keyword. +
    + + +
    + {keywordRules.length > 0 && ( +
    + {keywordRules.map((rule) => ( + removeKeyword(rule)} + /> + ))} +
    + )} +
    + )} + /> +
    + ); +} + +export default GlobalNotification; diff --git a/src/app/molecules/global-notification/KeywordNotification.scss b/src/app/molecules/global-notification/KeywordNotification.scss new file mode 100644 index 00000000..a5870020 --- /dev/null +++ b/src/app/molecules/global-notification/KeywordNotification.scss @@ -0,0 +1,16 @@ +.keyword-notification { + &__keyword { + & form, + & > div:last-child { + display: flex; + gap: var(--sp-tight); + } + + & form { + margin: var(--sp-ultra-tight) 0 var(--sp-normal); + .input-container { + flex-grow: 1; + } + } + } +} \ No newline at end of file diff --git a/src/app/molecules/global-notification/NotificationSelector.jsx b/src/app/molecules/global-notification/NotificationSelector.jsx new file mode 100644 index 00000000..b2a8f4ec --- /dev/null +++ b/src/app/molecules/global-notification/NotificationSelector.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; + +import CheckIC from '../../../../public/res/ic/outlined/check.svg'; + +function NotificationSelector({ + value, onSelect, +}) { + return ( +
    + Notification + onSelect('off')}>Off + onSelect('on')}>On + onSelect('noisy')}>Noisy +
    + ); +} + +NotificationSelector.propTypes = { + value: PropTypes.oneOf(['off', 'on', 'noisy']).isRequired, + onSelect: PropTypes.func.isRequired, +}; + +export default NotificationSelector; diff --git a/src/app/organisms/navigation/Drawer.jsx b/src/app/organisms/navigation/Drawer.jsx index a8b7f1f4..fb75ee5b 100644 --- a/src/app/organisms/navigation/Drawer.jsx +++ b/src/app/organisms/navigation/Drawer.jsx @@ -56,7 +56,9 @@ function Drawer() { useEffect(() => { requestAnimationFrame(() => { - scrollRef.current.scrollTop = 0; + if (scrollRef.current) { + scrollRef.current.scrollTop = 0; + } }); }, [selectedTab]); diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index d40d8615..64c898bf 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -168,7 +168,7 @@ function Search() { } }; - const notifs = initMatrix.notifications; + const noti = initMatrix.notifications; const renderRoomSelector = (item) => { let imageSrc = null; let iconSrc = null; @@ -178,9 +178,6 @@ function Search() { iconSrc = joinRuleToIconSrc(item.room.getJoinRule(), item.type === 'space'); } - const isUnread = notifs.hasNoti(item.roomId); - const noti = notifs.getNoti(item.roomId); - return ( 0} + isUnread={noti.hasNoti(item.roomId)} + notificationCount={noti.getTotalNoti(item.roomId)} + isAlert={noti.getHighlightNoti(item.roomId) > 0} onClick={() => openItem(item.roomId, item.type)} /> ); @@ -207,7 +204,7 @@ function Search() { size="small" >
    -
    { e.preventDefault(); openFirstResult()}}> + { e.preventDefault(); openFirstResult(); }}> - Notification & Sound - Show desktop notification when new messages arrive.} - /> - { toggleNotificationSounds(); updateState({}); }} - /> - )} - content={Play sound when new messages arrive.} - /> -
    + <> +
    + Notification & Sound + Show desktop notification when new messages arrive.} + /> + { toggleNotificationSounds(); updateState({}); }} + /> + )} + content={Play sound when new messages arrive.} + /> +
    + + + ); } diff --git a/src/app/organisms/settings/Settings.scss b/src/app/organisms/settings/Settings.scss index d77e634a..aa455700 100644 --- a/src/app/organisms/settings/Settings.scss +++ b/src/app/organisms/settings/Settings.scss @@ -38,6 +38,8 @@ } .settings-appearance__card, .settings-notifications, +.global-notification, +.keyword-notification, .settings-security__card, .settings-security .device-manage, .settings-about__card, diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index e219a777..fccfe514 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -67,7 +67,7 @@ class InitMatrix extends EventEmitter { }, PREPARED: (prevState) => { console.log('PREPARED state'); - console.log('previous state: ', prevState); + console.log('Previous state: ', prevState); // TODO: remove global.initMatrix at end global.initMatrix = this; if (prevState === null) { @@ -76,6 +76,9 @@ class InitMatrix extends EventEmitter { this.roomsInput = new RoomsInput(this.matrixClient, this.roomList); this.notifications = new Notifications(this.roomList); this.emit('init_loading_finished'); + this.notifications._initNoti(); + } else { + this.notifications._initNoti(); } }, RECONNECTING: () => { diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index f0f7a8c2..c3ec90cf 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -5,6 +5,11 @@ import { selectRoom } from '../action/navigation'; import cons from './cons'; import navigation from './navigation'; import settings from './settings'; +import { setFavicon } from '../../util/common'; + +import LogoSVG from '../../../public/res/svg/cinny.svg'; +import LogoUnreadSVG from '../../../public/res/svg/cinny-unread.svg'; +import LogoHighlightSVG from '../../../public/res/svg/cinny-highlight.svg'; function isNotifEvent(mEvent) { const eType = mEvent.getType(); @@ -37,17 +42,16 @@ class Notifications extends EventEmitter { this.roomIdToNoti = new Map(); - this._initNoti(); + // this._initNoti(); this._listenEvents(); // Ask for permission by default after loading window.Notification?.requestPermission(); - - // TODO: - window.notifications = this; } - _initNoti() { + async _initNoti() { + this.roomIdToNoti = new Map(); + const addNoti = (roomId) => { const room = this.matrixClient.getRoom(roomId); if (this.getNotiType(room.roomId) === cons.notifs.MUTE) return; @@ -59,6 +63,7 @@ class Notifications extends EventEmitter { }; [...this.roomList.rooms].forEach(addNoti); [...this.roomList.directs].forEach(addNoti); + this._updateFavicon(); } doesRoomHaveUnread(room) { @@ -104,7 +109,8 @@ class Notifications extends EventEmitter { } getTotalNoti(roomId) { - const { total } = this.getNoti(roomId); + const { total, highlight } = this.getNoti(roomId); + if (highlight > total) return highlight; return total; } @@ -129,6 +135,24 @@ class Notifications extends EventEmitter { } } + async _updateFavicon() { + let unread = false; + let highlight = false; + [...this.roomIdToNoti.values()].find((noti) => { + if (!unread) { + unread = noti.total > 0 || noti.highlight > 0; + } + highlight = noti.highlight > 0; + if (unread && highlight) return true; + return false; + }); + if (!unread) { + setFavicon(LogoSVG); + return; + } + setFavicon(highlight ? LogoHighlightSVG : LogoUnreadSVG); + } + _setNoti(roomId, total, highlight) { const addNoti = (id, t, h, fromId) => { const prevTotal = this.roomIdToNoti.get(id)?.total ?? null; @@ -155,6 +179,7 @@ class Notifications extends EventEmitter { allParentSpaces.forEach((spaceId) => { addNoti(spaceId, addT, addH, roomId); }); + this._updateFavicon(); } _deleteNoti(roomId, total, highlight) { @@ -187,6 +212,7 @@ class Notifications extends EventEmitter { allParentSpaces.forEach((spaceId) => { removeNoti(spaceId, total, highlight, roomId); }); + this._updateFavicon(); } async _displayPopupNoti(mEvent, room) { diff --git a/src/util/common.js b/src/util/common.js index 83fd20fe..c2a17cbf 100644 --- a/src/util/common.js +++ b/src/util/common.js @@ -115,6 +115,19 @@ export function avatarInitials(text) { return [...text][0]; } +export function cssVar(name) { + return getComputedStyle(document.body).getPropertyValue(name); +} + +export function setFavicon(url) { + const oldFav = document.querySelector('[rel=icon]'); + oldFav.parentElement.removeChild(oldFav); + const fav = document.createElement('link'); + fav.rel = 'icon'; + fav.href = url; + document.head.appendChild(fav); +} + export function copyToClipboard(text) { if (navigator.clipboard) { navigator.clipboard.writeText(text); From bdc10fb7296bd44f33bb59e61f0c2b7adfd03520 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Sep 2022 13:33:41 +0530 Subject: [PATCH 274/824] Fix multiple favicon changing request --- src/client/state/Notifications.js | 19 +++++++++++++++---- src/util/common.js | 7 +------ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index c3ec90cf..90f9b4ad 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -37,6 +37,8 @@ class Notifications extends EventEmitter { constructor(roomList) { super(); + this.initialized = false; + this.favicon = LogoSVG; this.matrixClient = roomList.matrixClient; this.roomList = roomList; @@ -50,6 +52,7 @@ class Notifications extends EventEmitter { } async _initNoti() { + this.initialized = false; this.roomIdToNoti = new Map(); const addNoti = (roomId) => { @@ -63,6 +66,8 @@ class Notifications extends EventEmitter { }; [...this.roomList.rooms].forEach(addNoti); [...this.roomList.directs].forEach(addNoti); + + this.initialized = true; this._updateFavicon(); } @@ -136,6 +141,7 @@ class Notifications extends EventEmitter { } async _updateFavicon() { + if (!this.initialized) return; let unread = false; let highlight = false; [...this.roomIdToNoti.values()].find((noti) => { @@ -146,11 +152,16 @@ class Notifications extends EventEmitter { if (unread && highlight) return true; return false; }); - if (!unread) { - setFavicon(LogoSVG); - return; + let newFavicon = LogoSVG; + if (unread && !highlight) { + newFavicon = LogoUnreadSVG; } - setFavicon(highlight ? LogoHighlightSVG : LogoUnreadSVG); + if (unread && highlight) { + newFavicon = LogoHighlightSVG; + } + if (newFavicon === this.favicon) return; + this.favicon = newFavicon; + setFavicon(this.favicon); } _setNoti(roomId, total, highlight) { diff --git a/src/util/common.js b/src/util/common.js index c2a17cbf..87b0b7eb 100644 --- a/src/util/common.js +++ b/src/util/common.js @@ -120,12 +120,7 @@ export function cssVar(name) { } export function setFavicon(url) { - const oldFav = document.querySelector('[rel=icon]'); - oldFav.parentElement.removeChild(oldFav); - const fav = document.createElement('link'); - fav.rel = 'icon'; - fav.href = url; - document.head.appendChild(fav); + document.querySelector('[rel=icon]').href = url; } export function copyToClipboard(text) { From 678e0dc6accae03399e89d35d81cb193ca3f772a Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 4 Sep 2022 15:45:07 +0200 Subject: [PATCH 275/824] Allow mimetypes with suffix in safe check (#808) --- src/util/mimetypes.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/util/mimetypes.js b/src/util/mimetypes.js index 121ae069..7a94e0c8 100644 --- a/src/util/mimetypes.js +++ b/src/util/mimetypes.js @@ -26,12 +26,13 @@ export const ALLOWED_BLOB_MIMETYPES = [ ]; export function getBlobSafeMimeType(mimetype) { - if (!ALLOWED_BLOB_MIMETYPES.includes(mimetype)) { + const [type] = mimetype.split(';'); + if (!ALLOWED_BLOB_MIMETYPES.includes(type)) { return 'application/octet-stream'; } // Required for Chromium browsers - if (mimetype === 'video/quicktime') { + if (type === 'video/quicktime') { return 'video/mp4'; } - return mimetype; + return type; } From e6661d3b0d355ae1ff35879b1fc22fc3b6dffae9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Sep 2022 19:23:02 +0530 Subject: [PATCH 276/824] Remove favicons-webpack-plugin (#811) * Remove favicons-webpack-plugin * Copy android/* icons to dist * Add favicon ico --- package-lock.json | 3419 +---------------- package.json | 2 - public/favicon.ico | Bin 0 -> 33310 bytes public/index.html | 22 + public/manifest.json | 59 + public/res/android/android-chrome-144x144.png | Bin 0 -> 4499 bytes public/res/android/android-chrome-192x192.png | Bin 0 -> 6264 bytes public/res/android/android-chrome-256x256.png | Bin 0 -> 8384 bytes public/res/android/android-chrome-36x36.png | Bin 0 -> 1073 bytes public/res/android/android-chrome-384x384.png | Bin 0 -> 13069 bytes public/res/android/android-chrome-48x48.png | Bin 0 -> 1487 bytes public/res/android/android-chrome-512x512.png | Bin 0 -> 17829 bytes public/res/android/android-chrome-72x72.png | Bin 0 -> 2216 bytes public/res/android/android-chrome-96x96.png | Bin 0 -> 2991 bytes public/res/apple/apple-touch-icon-114x114.png | Bin 0 -> 4902 bytes public/res/apple/apple-touch-icon-120x120.png | Bin 0 -> 5100 bytes public/res/apple/apple-touch-icon-144x144.png | Bin 0 -> 6075 bytes public/res/apple/apple-touch-icon-152x152.png | Bin 0 -> 6665 bytes public/res/apple/apple-touch-icon-167x167.png | Bin 0 -> 7325 bytes public/res/apple/apple-touch-icon-180x180.png | Bin 0 -> 7889 bytes public/res/apple/apple-touch-icon-57x57.png | Bin 0 -> 2347 bytes public/res/apple/apple-touch-icon-60x60.png | Bin 0 -> 2482 bytes public/res/apple/apple-touch-icon-72x72.png | Bin 0 -> 2951 bytes public/res/apple/apple-touch-icon-76x76.png | Bin 0 -> 3124 bytes src/util/common.js | 4 +- webpack.common.js | 18 +- 26 files changed, 106 insertions(+), 3418 deletions(-) create mode 100644 public/favicon.ico create mode 100644 public/manifest.json create mode 100644 public/res/android/android-chrome-144x144.png create mode 100644 public/res/android/android-chrome-192x192.png create mode 100644 public/res/android/android-chrome-256x256.png create mode 100644 public/res/android/android-chrome-36x36.png create mode 100644 public/res/android/android-chrome-384x384.png create mode 100644 public/res/android/android-chrome-48x48.png create mode 100644 public/res/android/android-chrome-512x512.png create mode 100644 public/res/android/android-chrome-72x72.png create mode 100644 public/res/android/android-chrome-96x96.png create mode 100644 public/res/apple/apple-touch-icon-114x114.png create mode 100644 public/res/apple/apple-touch-icon-120x120.png create mode 100644 public/res/apple/apple-touch-icon-144x144.png create mode 100644 public/res/apple/apple-touch-icon-152x152.png create mode 100644 public/res/apple/apple-touch-icon-167x167.png create mode 100644 public/res/apple/apple-touch-icon-180x180.png create mode 100644 public/res/apple/apple-touch-icon-57x57.png create mode 100644 public/res/apple/apple-touch-icon-60x60.png create mode 100644 public/res/apple/apple-touch-icon-72x72.png create mode 100644 public/res/apple/apple-touch-icon-76x76.png diff --git a/package-lock.json b/package-lock.json index 46015fd3..db8a73be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,8 +59,6 @@ "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.31.1", "eslint-plugin-react-hooks": "^4.6.0", - "favicons": "^6.2.2", - "favicons-webpack-plugin": "^5.0.2", "html-loader": "^4.1.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", @@ -1887,500 +1885,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@jimp/bmp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", - "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "bmp-js": "^0.1.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/core": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", - "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } - }, - "node_modules/@jimp/core/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/@jimp/core/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@jimp/custom": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", - "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.1" - } - }, - "node_modules/@jimp/gif": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", - "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/jpeg": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", - "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "jpeg-js": "0.4.2" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blit": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", - "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blur": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", - "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-circle": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", - "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-color": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", - "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "tinycolor2": "^1.4.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-contain": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", - "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-cover": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", - "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-crop": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", - "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-displace": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", - "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-dither": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", - "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-fisheye": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", - "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-flip": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", - "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-rotate": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-gaussian": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", - "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-invert": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", - "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-mask": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", - "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-normalize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", - "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-print": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", - "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "load-bmfont": "^1.4.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-resize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", - "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-rotate": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", - "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-scale": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", - "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-shadow": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", - "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blur": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-threshold": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", - "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-color": ">=0.8.0", - "@jimp/plugin-resize": ">=0.8.0" - } - }, - "node_modules/@jimp/plugins": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", - "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.1", - "@jimp/plugin-blur": "^0.16.1", - "@jimp/plugin-circle": "^0.16.1", - "@jimp/plugin-color": "^0.16.1", - "@jimp/plugin-contain": "^0.16.1", - "@jimp/plugin-cover": "^0.16.1", - "@jimp/plugin-crop": "^0.16.1", - "@jimp/plugin-displace": "^0.16.1", - "@jimp/plugin-dither": "^0.16.1", - "@jimp/plugin-fisheye": "^0.16.1", - "@jimp/plugin-flip": "^0.16.1", - "@jimp/plugin-gaussian": "^0.16.1", - "@jimp/plugin-invert": "^0.16.1", - "@jimp/plugin-mask": "^0.16.1", - "@jimp/plugin-normalize": "^0.16.1", - "@jimp/plugin-print": "^0.16.1", - "@jimp/plugin-resize": "^0.16.1", - "@jimp/plugin-rotate": "^0.16.1", - "@jimp/plugin-scale": "^0.16.1", - "@jimp/plugin-shadow": "^0.16.1", - "@jimp/plugin-threshold": "^0.16.1", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/png": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", - "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "pngjs": "^3.3.3" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/tiff": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", - "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", - "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.1", - "@jimp/gif": "^0.16.1", - "@jimp/jpeg": "^0.16.1", - "@jimp/png": "^0.16.1", - "@jimp/tiff": "^0.16.1", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/utils": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", - "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" - } - }, - "node_modules/@jimp/utils/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -2620,15 +2124,6 @@ "@types/range-parser": "*" } }, - "node_modules/@types/favicons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz", - "integrity": "sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -2682,7 +2177,7 @@ "version": "16.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", - "devOptional": true + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -3105,12 +2600,6 @@ "node": ">=4" } }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", - "dev": true - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -3124,52 +2613,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3267,15 +2710,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3338,15 +2772,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "node_modules/author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/autosize": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", @@ -3537,15 +2962,6 @@ "node": "*" } }, - "node_modules/bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3587,12 +3003,6 @@ "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz", "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" }, - "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", - "dev": true - }, "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -3870,37 +3280,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4085,24 +3464,6 @@ "webpack": ">=4.0.0 <6.0.0" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -4117,72 +3478,6 @@ "node": ">=6" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/cloneable-readable/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -4198,16 +3493,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "node_modules/color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/colord": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", @@ -4220,15 +3505,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "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", @@ -4370,12 +3646,6 @@ "node": ">=0.8" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4982,27 +4252,6 @@ } } }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5147,12 +4396,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -5178,18 +4421,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -5287,12 +4518,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -5389,16 +4614,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/emojibase": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/emojibase/-/emojibase-6.0.2.tgz", - "integrity": "sha512-2h2eblOm86tj+lsJLgLYmEni13H74KNNu1NI1ZgMOX9ByWuvjFZLhETEUH1edpcd8srAlzhfJSD892UbpxfwsA==", - "peer": true, - "funding": { - "type": "ko-fi", - "url": "https://ko-fi.com/milesjohnson" - } - }, "node_modules/emojibase-data": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", @@ -5429,15 +4644,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -5558,12 +4764,6 @@ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6256,21 +5456,6 @@ "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" }, - "node_modules/exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", - "dev": true - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.17.3", "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", @@ -6437,52 +5622,6 @@ "reusify": "^1.0.4" } }, - "node_modules/favicons": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.2.2.tgz", - "integrity": "sha512-qhvFqbhlXA/JYIDYuxTrE4uT9rcpTCrWvF3UG0GxBoLl/XgFBBTrZkQvASrkMebSwDCJ9kKGypRWIbvoRZLBsw==", - "dev": true, - "dependencies": { - "clone": "^2.1.2", - "colors": "^1.4.0", - "image-size": "^0.8.3", - "jimp": "^0.16.1", - "jsontoxml": "^1.0.1", - "lodash.defaultsdeep": "^4.6.1", - "require-directory": "^2.1.1", - "sharp": "^0.28.2", - "through2": "^4.0.2", - "tinycolor2": "^1.4.2", - "to-ico": "^1.1.5", - "vinyl": "^2.2.1", - "xml2js": "^0.4.23" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/favicons-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg==", - "dev": true, - "dependencies": { - "@types/favicons": "5.5.0", - "find-root": "^1.1.0", - "parse-author": "^2.0.0", - "parse5": "^6.0.1" - }, - "engines": { - "node": ">=10.13.0" - }, - "optionalDependencies": { - "html-webpack-plugin": ">=5.0.0" - }, - "peerDependencies": { - "favicons": ">= 6.2.0", - "webpack": "^5.0.0" - } - }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -6539,15 +5678,6 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, - "node_modules/file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6683,12 +5813,6 @@ "node": ">=8" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, "node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -6825,12 +5949,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -6943,43 +6061,6 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7002,19 +6083,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -7039,22 +6107,6 @@ "assert-plus": "^1.0.0" } }, - "node_modules/gifwrap": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", - "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", - "dev": true, - "dependencies": { - "image-q": "^1.1.1", - "omggif": "^1.0.10" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -7093,16 +6145,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7236,12 +6278,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -7722,30 +6758,6 @@ "node": ">= 4" } }, - "node_modules/image-q": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", - "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", - "dev": true, - "engines": { - "node": ">=0.9.0" - } - }, - "node_modules/image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "dev": true, - "dependencies": { - "queue": "6.0.1" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -7888,12 +6900,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", @@ -8059,24 +7065,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -8407,31 +7395,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jimp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", - "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.1", - "@jimp/plugins": "^0.16.1", - "@jimp/types": "^0.16.1", - "regenerator-runtime": "^0.13.3" - } - }, - "node_modules/jimp/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/jpeg-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", - "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8516,15 +7479,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsontoxml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", - "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -8860,31 +7814,6 @@ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" }, - "node_modules/load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "dev": true, - "dependencies": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "node_modules/load-bmfont/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -8937,12 +7866,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9192,27 +8115,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", @@ -9315,12 +8217,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9351,12 +8247,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -9388,30 +8278,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "dev": true, - "dependencies": { - "semver": "^5.4.1" - } - }, - "node_modules/node-abi/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/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -9479,18 +8345,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -9503,15 +8357,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9652,12 +8497,6 @@ "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", "dev": true }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "dev": true - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -9806,12 +8645,6 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -9847,69 +8680,11 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dev": true, - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", - "dev": true - }, - "node_modules/parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", - "dev": true - }, - "node_modules/parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dev": true, - "dependencies": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "node_modules/parse-headers": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz", - "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==", - "dev": true - }, - "node_modules/parse-png": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", - "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", - "dev": true, - "dependencies": { - "pngjs": "^3.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" }, - "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/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10010,12 +8785,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -10063,27 +8832,6 @@ "node": ">=0.10.0" } }, - "node_modules/pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "dependencies": { - "pngjs": "^3.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -10590,33 +9338,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10636,15 +9357,6 @@ "renderkid": "^3.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10713,16 +9425,6 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -10755,15 +9457,6 @@ "node": ">=0.4.x" } }, - "node_modules/queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10836,30 +9529,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -11007,15 +9676,6 @@ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, - "node_modules/read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -11176,12 +9836,6 @@ "node": ">= 0.10" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -11195,15 +9849,6 @@ "strip-ansi": "^6.0.1" } }, - "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -11243,15 +9888,6 @@ "node": ">=0.6" } }, - "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/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11267,99 +9903,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "node_modules/resize-img": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", - "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", - "dev": true, - "dependencies": { - "bmp-js": "0.0.1", - "file-type": "^3.8.0", - "get-stream": "^2.0.0", - "jimp": "^0.2.21", - "jpeg-js": "^0.1.1", - "parse-png": "^1.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resize-img/node_modules/bmp-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", - "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", - "dev": true - }, - "node_modules/resize-img/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resize-img/node_modules/jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "dev": true, - "dependencies": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - } - }, - "node_modules/resize-img/node_modules/jimp/node_modules/bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", - "dev": true - }, - "node_modules/resize-img/node_modules/jimp/node_modules/jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", - "dev": true - }, - "node_modules/resize-img/node_modules/jpeg-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", - "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", - "dev": true - }, - "node_modules/resize-img/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/resize-img/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -11578,12 +10121,6 @@ } } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -11767,12 +10304,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -11809,44 +10340,6 @@ "node": ">=8" } }, - "node_modules/sharp": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.28.3.tgz", - "integrity": "sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "color": "^3.1.3", - "detect-libc": "^1.0.3", - "node-addon-api": "^3.2.0", - "prebuild-install": "^6.1.2", - "semver": "^7.3.5", - "simple-get": "^3.1.0", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "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", @@ -11887,52 +10380,6 @@ "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "dev": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -12071,27 +10518,6 @@ "readable-stream": "^3.5.0" } }, - "node_modules/stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "dev": true, - "dependencies": { - "stream-to": "~0.2.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -12127,41 +10553,6 @@ "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", "dev": true }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -12362,75 +10753,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/terser": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", @@ -12530,41 +10852,17 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", - "dev": true - }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -12582,34 +10880,6 @@ "node": ">=4" } }, - "node_modules/to-ico": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", - "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "buffer-alloc": "^1.1.0", - "image-size": "^0.5.0", - "parse-png": "^1.0.0", - "resize-img": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-ico/node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12898,42 +11168,12 @@ "querystring": "0.2.0" } }, - "node_modules/url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "dependencies": { - "ip-regex": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/url-regex/node_modules/ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, - "node_modules/utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dev": true, - "dependencies": { - "pako": "^1.0.5" - } - }, "node_modules/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -13000,23 +11240,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -13480,15 +11703,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -13531,55 +11745,6 @@ } } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", - "dev": true - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/xtend": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", @@ -14875,387 +13040,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "@jimp/bmp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", - "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "bmp-js": "^0.1.0" - } - }, - "@jimp/core": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", - "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "@jimp/custom": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", - "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.1" - } - }, - "@jimp/gif": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", - "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" - } - }, - "@jimp/jpeg": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", - "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "jpeg-js": "0.4.2" - } - }, - "@jimp/plugin-blit": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", - "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-blur": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", - "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-circle": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", - "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-color": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", - "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/plugin-contain": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", - "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-cover": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", - "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-crop": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", - "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-displace": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", - "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-dither": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", - "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-fisheye": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", - "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-flip": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", - "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-gaussian": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", - "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-invert": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", - "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-mask": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", - "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-normalize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", - "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-print": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", - "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "load-bmfont": "^1.4.0" - } - }, - "@jimp/plugin-resize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", - "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-rotate": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", - "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-scale": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", - "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-shadow": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", - "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-threshold": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", - "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugins": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", - "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.1", - "@jimp/plugin-blur": "^0.16.1", - "@jimp/plugin-circle": "^0.16.1", - "@jimp/plugin-color": "^0.16.1", - "@jimp/plugin-contain": "^0.16.1", - "@jimp/plugin-cover": "^0.16.1", - "@jimp/plugin-crop": "^0.16.1", - "@jimp/plugin-displace": "^0.16.1", - "@jimp/plugin-dither": "^0.16.1", - "@jimp/plugin-fisheye": "^0.16.1", - "@jimp/plugin-flip": "^0.16.1", - "@jimp/plugin-gaussian": "^0.16.1", - "@jimp/plugin-invert": "^0.16.1", - "@jimp/plugin-mask": "^0.16.1", - "@jimp/plugin-normalize": "^0.16.1", - "@jimp/plugin-print": "^0.16.1", - "@jimp/plugin-resize": "^0.16.1", - "@jimp/plugin-rotate": "^0.16.1", - "@jimp/plugin-scale": "^0.16.1", - "@jimp/plugin-shadow": "^0.16.1", - "@jimp/plugin-threshold": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", - "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", - "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", - "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.1", - "@jimp/gif": "^0.16.1", - "@jimp/jpeg": "^0.16.1", - "@jimp/png": "^0.16.1", - "@jimp/tiff": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", - "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - } - } - }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -15460,15 +13244,6 @@ "@types/range-parser": "*" } }, - "@types/favicons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz", - "integrity": "sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -15522,7 +13297,7 @@ "version": "16.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", - "devOptional": true + "dev": true }, "@types/prop-types": { "version": "15.7.5", @@ -15748,8 +13523,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.5.0", @@ -15764,8 +13538,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -15816,8 +13589,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.12.6", @@ -15863,8 +13635,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "another-json": { "version": "0.2.0", @@ -15892,12 +13663,6 @@ "color-convert": "^1.9.0" } }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", - "dev": true - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -15908,54 +13673,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -16026,12 +13743,6 @@ "es-shim-unscopables": "^1.0.0" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -16093,12 +13804,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "dev": true - }, "autosize": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", @@ -16246,12 +13951,6 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", - "dev": true - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -16292,12 +13991,6 @@ "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz", "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", - "dev": true - }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -16517,34 +14210,6 @@ "ieee754": "^1.2.1" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -16683,18 +14348,6 @@ "del": "^4.1.1" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -16706,71 +14359,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -16786,16 +14374,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "colord": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", @@ -16808,12 +14386,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -16941,12 +14513,6 @@ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -17166,8 +14732,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true, - "requires": {} + "dev": true }, "css-loader": { "version": "6.7.1", @@ -17338,8 +14903,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "4.2.0", @@ -17383,21 +14947,6 @@ "ms": "2.1.2" } }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -17510,12 +15059,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -17538,12 +15081,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -17631,12 +15168,6 @@ "entities": "^2.0.0" } }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, "domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -17720,17 +15251,10 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "emojibase": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/emojibase/-/emojibase-6.0.2.tgz", - "integrity": "sha512-2h2eblOm86tj+lsJLgLYmEni13H74KNNu1NI1ZgMOX9ByWuvjFZLhETEUH1edpcd8srAlzhfJSD892UbpxfwsA==", - "peer": true - }, "emojibase-data": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", - "integrity": "sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ==", - "requires": {} + "integrity": "sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ==" }, "emojis-list": { "version": "3.0.0", @@ -17744,15 +15268,6 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -17846,12 +15361,6 @@ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -18229,8 +15738,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -18372,18 +15880,6 @@ "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", - "dev": true - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, "express": { "version": "4.17.3", "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", @@ -18522,40 +16018,6 @@ "reusify": "^1.0.4" } }, - "favicons": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.2.2.tgz", - "integrity": "sha512-qhvFqbhlXA/JYIDYuxTrE4uT9rcpTCrWvF3UG0GxBoLl/XgFBBTrZkQvASrkMebSwDCJ9kKGypRWIbvoRZLBsw==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "colors": "^1.4.0", - "image-size": "^0.8.3", - "jimp": "^0.16.1", - "jsontoxml": "^1.0.1", - "lodash.defaultsdeep": "^4.6.1", - "require-directory": "^2.1.1", - "sharp": "^0.28.2", - "through2": "^4.0.2", - "tinycolor2": "^1.4.2", - "to-ico": "^1.1.5", - "vinyl": "^2.2.1", - "xml2js": "^0.4.23" - } - }, - "favicons-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg==", - "dev": true, - "requires": { - "@types/favicons": "5.5.0", - "find-root": "^1.1.0", - "html-webpack-plugin": ">=5.0.0", - "parse-author": "^2.0.0", - "parse5": "^6.0.1" - } - }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -18606,12 +16068,6 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -18718,12 +16174,6 @@ } } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -18818,12 +16268,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -18921,39 +16365,6 @@ } } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -18970,16 +16381,6 @@ "has-symbols": "^1.0.1" } }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -18998,22 +16399,6 @@ "assert-plus": "^1.0.0" } }, - "gifwrap": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", - "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", - "dev": true, - "requires": { - "image-q": "^1.1.1", - "omggif": "^1.0.10" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -19043,16 +16428,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -19146,12 +16521,6 @@ "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -19476,8 +16845,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "idb-wrapper": { "version": "1.7.2", @@ -19497,21 +16865,6 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "image-q": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", - "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", - "dev": true - }, - "image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "dev": true, - "requires": { - "queue": "6.0.1" - } - }, "immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -19620,12 +16973,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", @@ -19734,21 +17081,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -19979,33 +17311,6 @@ } } }, - "jimp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", - "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.1", - "@jimp/plugins": "^0.16.1", - "@jimp/types": "^0.16.1", - "regenerator-runtime": "^0.13.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - } - } - }, - "jpeg-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", - "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -20073,12 +17378,6 @@ "universalify": "^0.1.2" } }, - "jsontoxml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", - "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -20368,38 +17667,13 @@ "linkify-html": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0-beta.5.tgz", - "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==", - "requires": {} + "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==" }, "linkifyjs": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" }, - "load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - } - } - }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -20443,12 +17717,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -20645,21 +17913,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, "mini-css-extract-plugin": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", @@ -20737,12 +17990,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -20764,12 +18011,6 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -20798,29 +18039,6 @@ "tslib": "^2.0.3" } }, - "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "dev": true, - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -20862,18 +18080,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -20883,12 +18089,6 @@ "boolbase": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -20987,12 +18187,6 @@ "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", "dev": true }, - "omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "dev": true - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -21101,12 +18295,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -21139,63 +18327,11 @@ "safe-buffer": "^5.1.1" } }, - "parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dev": true, - "requires": { - "author-regex": "^1.0.0" - } - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", - "dev": true - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", - "dev": true - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dev": true, - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-headers": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz", - "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==", - "dev": true - }, - "parse-png": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", - "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", - "dev": true, - "requires": { - "pngjs": "^3.2.0" - } - }, "parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -21278,12 +18414,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -21316,21 +18446,6 @@ "pinkie": "^2.0.0" } }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "requires": { - "pngjs": "^3.0.0" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, "postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -21377,29 +18492,25 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-merge-longhand": { "version": "5.1.5", @@ -21467,8 +18578,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -21503,8 +18613,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -21644,27 +18753,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -21681,12 +18769,6 @@ "renderkid": "^3.0.0" } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -21754,16 +18836,6 @@ } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -21783,15 +18855,6 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -21843,26 +18906,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, "react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -21894,8 +18937,7 @@ "react-blurhash": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.1.3.tgz", - "integrity": "sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg==", - "requires": {} + "integrity": "sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg==" }, "react-dnd": { "version": "15.1.2", @@ -21967,12 +19009,6 @@ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", - "dev": true - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -22099,12 +19135,6 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -22118,12 +19148,6 @@ "strip-ansi": "^6.0.1" } }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -22158,12 +19182,6 @@ } } }, - "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 - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -22176,93 +19194,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "resize-img": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", - "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", - "dev": true, - "requires": { - "bmp-js": "0.0.1", - "file-type": "^3.8.0", - "get-stream": "^2.0.0", - "jimp": "^0.2.21", - "jpeg-js": "^0.1.1", - "parse-png": "^1.1.1" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", - "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", - "dev": true - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "dev": true, - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", - "dev": true - }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", - "dev": true - } - } - }, - "jpeg-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", - "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", - "dev": true - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } - } - }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -22397,12 +19328,6 @@ "neo-async": "^2.6.2" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -22567,12 +19492,6 @@ "send": "0.17.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -22603,33 +19522,6 @@ "kind-of": "^6.0.2" } }, - "sharp": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.28.3.tgz", - "integrity": "sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA==", - "dev": true, - "requires": { - "color": "^3.1.3", - "detect-libc": "^1.0.3", - "node-addon-api": "^3.2.0", - "prebuild-install": "^6.1.2", - "semver": "^7.3.5", - "simple-get": "^3.1.0", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "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", @@ -22661,40 +19553,6 @@ "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -22806,21 +19664,6 @@ "readable-stream": "^3.5.0" } }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", - "dev": true - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "dev": true, - "requires": { - "stream-to": "~0.2.0" - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -22844,34 +19687,6 @@ "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -22941,8 +19756,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} + "dev": true }, "style-to-js": { "version": "1.1.1", @@ -23014,62 +19828,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, "terser": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", @@ -23128,38 +19886,17 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", - "dev": true - }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", - "dev": true - }, "tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -23174,27 +19911,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-ico": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", - "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "buffer-alloc": "^1.1.0", - "image-size": "^0.5.0", - "parse-png": "^1.0.0", - "resize-img": "^1.1.0" - }, - "dependencies": { - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -23416,32 +20132,6 @@ } } }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - }, - "dependencies": { - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - } - } - }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dev": true, - "requires": { - "pako": "^1.0.5" - } - }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -23495,20 +20185,6 @@ "extsprintf": "^1.2.0" } }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, "warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -23577,8 +20253,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "schema-utils": { "version": "3.1.1", @@ -23837,15 +20512,6 @@ "is-typed-array": "^1.1.7" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -23868,49 +20534,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} - }, - "xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - } - } - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, "xtend": { diff --git a/package.json b/package.json index 2ec2a79c..5f3485e6 100644 --- a/package.json +++ b/package.json @@ -65,8 +65,6 @@ "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.31.1", "eslint-plugin-react-hooks": "^4.6.0", - "favicons": "^6.2.2", - "favicons-webpack-plugin": "^5.0.2", "html-loader": "^4.1.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^2.6.1", diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..916713065b069f0e59a63d520178ea8101818913 GIT binary patch literal 33310 zcmds=39uDKmWD41Zh#;vi?Te&jSgf)fe5#7iEs_K7-bc0ca0fVQQL(<(1~z#P}xOo zffki;3)exq8(Txi1sUl<9R+3_z%4`&ci_Dz@8N_@)vbGhJ`v|--mH`7 zoII6#o~&0Wv?{bIbnIAASXb!Xx=2=oYpw6#Dh^e;-mP z{JBS=aPrCiZ-rYY~UjHYwh?%PzZ^Hf`E0QrzRAupr%Lj~h3Ry!A~@O{Srt zf&Au^Pd+J%ug!1u*a{C{53=_kFkrwokvDGJwyg*%ZqXce*kLwbm`@{R!5*^J%sF%B zAg<`kEeiN;(B+IX&an9j;Xz1Q3^v_opMBQNm@xx#FB6#s{Py75Yp?b4OP1vm=)rrD z&FgpFbyqWV=+NSqUw-LjR2hur@xlu)*nH?~sB*r)F{)hUq5s3!3P&* zdoRCVuV#^7_VjFW=9y;}*RNk6$euQBnpwPfvAOQL>&&gU-da5R=%dlWqupbVJ-j-} zyHHvKc2HP6<&;y34?XmddFrXB%-wh2ZQ8bN>!tHdNZfmW3cdQQ=d-C3`n}cXVd)9I zI5PZqZtD+vTWCj}^z94pCSegfDcuW2h|UeA^;hjIXg{*cY-ETo5_yKMdfu%4gm@Gr zbAamAEZ&P`H-NsKBik?igu0r7x)ZPeQBWwT&q)bAML$Zimgt?Vkqx(i#Fh3(JsT

    2R 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 j*?{u}e9Z0;a@O`|A?J>z-vJ + + + + + + + + + + + + + + + + + + + + + +

    diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 00000000..21ae4f0d --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,59 @@ +{ + "name": "Cinny", + "short_name": "Cinny", + "description": "Yet another matrix client", + "dir": "auto", + "lang": "en-US", + "display": "standalone", + "orientation": "portrait", + "start_url": "/", + "background_color": "#fff", + "theme_color": "#fff", + "icons": [ + { + "src": "android-chrome-36x36.png", + "sizes": "36x36", + "type": "image/png" + }, + { + "src": "android-chrome-48x48.png", + "sizes": "48x48", + "type": "image/png" + }, + { + "src": "android-chrome-72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "android-chrome-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "android-chrome-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/public/res/android/android-chrome-144x144.png b/public/res/android/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8c2668b3259748889da147c356e654e3606e58 GIT binary patch literal 4499 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 literal 0 HcmV?d00001 diff --git a/public/res/android/android-chrome-256x256.png b/public/res/android/android-chrome-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..57378b413191cabc6c5f86714ffdff47a60ad16c GIT binary patch literal 8384 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 z zA$U@>ln8_OA=bXvAt>S~!o(70L4*qvmvYftUq;&s{dgL1dhONhYKT09c2}5dUbvT% z!yLTPj%_ztja{Oo+f*l-{cfk;ejSk#Nr-t8$P`xPCTLnRBimM*_R6SIMcauDl`+a> z?sola9($h1m{Qv7wY1ldl?jmw;1xULl9Xphf)rC2Ot2~0h8Jq}-z#=X@QNMAY?pt7 zOo^Zx@uIq;83_is|K85aeq(c_E~pNN&5S6$sBXQq4-Fi+_460a&v>VXCQ1aeScSQ) zYWz2@DJOYB_k<|3fY|;@GFEm12&($<3QzgvtlwMt**fr_3D;B}YbumIvO@hIlr1g9 literal 0 HcmV?d00001 diff --git a/public/res/android/android-chrome-36x36.png b/public/res/android/android-chrome-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..507c443941225e2c73003d85eeac2fba6cc78285 GIT binary patch literal 1073 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 KSv3!_dhkEtONq1q literal 0 HcmV?d00001 diff --git a/public/res/android/android-chrome-48x48.png b/public/res/android/android-chrome-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..489cfd32175ddeaba504eee8aba83de8bb97811a GIT binary patch literal 1487 zcmV;=1u*)FP)un^=@nsT7@BBf`Cv<9e@_OyQ)-xr9+FYzi~ z#4~sT*?2^odeq_+zQF*F5I>+YuFXft)lIQj%+{@2O`0@G zR|*OWtXZ?hfB^%%^2#fwOqpW$?%i&A>ZzxU7%@V2cDDNZdN*#|kcJ%mCB#TPFAcM2 z&sJDis5=sggj*7cgj>Qew15A8@pxQERaI5W%gdFQmpgm*tS*eh@Hl>h-%7*g&70-q zf3L>b?n$N=gyszmzQVZ!iDnl^Bp~U)Rik& zbRxi^5HCu@m@#9F9XnQcjT$w|s8OSIbo%sZYuBz-QBmQ-g$p_g!_afjJts3W)Aj4u zb>gKEPfNr2@#FPYNlA%St5#`fXwaFKmKH~j9MOfRLp&)BIXO9cW97<~ii?Xyh*+adELlix%mL%a<=(x^$_C4GML`%$YNlmX^xN z$^VVB$>5ZD28lQdknLcnW#1#zHK~YhWl9Ccb zhYr$>uNI8H0yt1+~Q8|A6xIXY#T#^!V+gdb9dGEdVR99DvLS<#8h&AE^?P6~G z9&4psyLQdu#fv4ANxjkB-0aYyLn8J*&S)2Nw_==-vUBH7t5>hq8x<858XFr$=omh5 zhq$}7;0r83zc0W1Qf_Xp7hZTlPrUQaJ5HTCB_d6D1Lxc!?&mJy3}ztMwQHA=BS#uH zZk%+SIB~+e@4hRUOo~7f^RY(*!oos95a^D1^XB>PyYEEg z_xRX7#C7fP(w9O(K!dOAT0nGWQYJwJL1Gt9bOsAAhuC#||4eZglhJ zO?i2FGBPsU(%RZ;)~s0$9z3X*j^TCuQx^i=mx1M2feh{X_wR4=40}Hub2%X?%kN*ozB#>3^cO!d3`W4xRu2002ovPDHLkV1hnv;Qasq literal 0 HcmV?d00001 diff --git a/public/res/android/android-chrome-512x512.png b/public/res/android/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..d312b532c57b74fa511e6045500d9a83bb5deec4 GIT binary patch literal 17829 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 literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-114x114.png b/public/res/apple/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..418f883395b22e4d4368fe4ca0769d76c98eec5c GIT binary patch literal 4902 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℞ZfYDRMD;XuxOAmQZJsVwXID#UB9|}Babu=M>*h@% zQRD0xK-nKy6+kLD-EIdBfDq28@*kt$El32WrYY4>ik6O! zCrw4<@zDq`tGPF|9YU=8L#36!PI)tTBpXGP# zg=F@rtIHWir;~bl@Ey2!4GmR6o6bPCcLA$BDMFi4APVo_t6e$THX~!Dtxc(MFy80w z>zh{v2?BvYkVl&DXf|Do*H$e6a|_%i$cgA`sm2pwV~|Lh!Py~86;xKrKk^FNn4usS zI6vtMLRFQw)FLiFA1U*GExf1 z;XzhF!`$55(aX-xZg1%Mv5uWxc8+PW>_y?D55vQ0K>hN7Rhz+~pKCEbjS(UuPgE6E*+&=L9^05UxW`SV#Y2 zxuI2D7P``2+tsnu*nECONj+BOb~bQ*`eQad?;!rg~XgT3A||P+zY?fB+8;HbWvkE-8^DBSjz( vU__dqpN~pPN>X(HA_fLeb(|Dobf^()Arj5Q&s_ocUndN7jdk8=IY#~;A=-B7n8AB6^~FF3 z|5Y88h7KL#sKsHl&4X!H+E^_g#?H2`ukKQquw=dvwA}#>S3-AjiScQdx#^+IcZjDK zO@#+DFY1c*qy1U4{(bUF;>_K7_TV>)Wl-!%)`a%b%WZmge)o2olr*b5Q9q{`CwJeu zY@R#dDS6g96*{-UJ}-%yd_5f@&3*hhQ)g$VA0Dr|u&{8w!B6*DX=!0ijhPZ(Qq;I- zmn+)uQCXR^jEqcuW8-@=nH;4@Z0qYY+}hge>h7kuwY9x5(;7+n&qPC_zz50Xzq{p? zEU4Z!NW`iJ{^Hr*-ln|r7)2cD%(O6~9ngGod`Xk_zB=`O3ry1-fBzv^Sy@#@M6?(f z8Bd6dBPuNJqY_Z@F^3;MdX%1;s%>n{62~gsL6rbX0a`b$mCZY) zXYmwAG~cl;{r2RZnhyv2y9@L4j`9i$wCTMuO=(U9A~uByn%K zrInSBg2(>#Un0CFbU*qrg zwl`vHYUBk{+w4SOy&WBx6LNB?)ehbEN0EZ%MMW{H{)=nlF8S*%1?A<5Yim9ibabw^ zL^SN>OiBma>E4*ByC zQgG(W^Z$$(eIHPURe;Y+-t7bYL^?+Oc}0a&S0XRvh4mYR+CF#fxRIylX*?e9`L!2pbZVq#HwxlzIAa8iI8RA9W;h1IGevrclT%g^7Rk%i?cY{t04;Ve(^Y%KR! z%k35;ehxRC&_86S-#-VxjEoGCX1@#%%Q=7GnO(j8Pu&Ywm{e}tk_W{Q>66bD>d#dV z%2M$ay?psHym3=4EL{yK%M7=L@uUqpV z)!56UH%+44`b}oH1cfI+O|aHw;P}rkGWHG*I1`f}zW2@*PEKBzG|IZuY5(NE-3LyD z-t?3HGp#g289ibu;X7!D?&MBSrO(g9ryBg@*5|tY7eDX{#rEhl`p(g%rlwB5#itt! z5}!W33pI3icMrA{Wp&&6O?sG-G5FkpmzmDy_WmtGoH&JTq~colx28~%BR`2mYM(yX zQYOTS3>n16#=hP7s2)&L@%mecVb8!o$t#Rin=4xW=A;TdvRuzTPbCg6uGn$UOgGw8 z3w?e4neUzV18P{gWv<)xXDc4A5TP8BkdP?9T6@=c%W2_#1`jix5N4ic@ni1&UdO`p zaFFkZJdGTB_J$OV(5*F6N&ZmpdFX~J@9FboY)8V*P6+;BZ#$sIySlm>jYiug#c&DV z-mAW3VR2VuV{J_Yjecl*KzZc)$|?`P$O}!SS&!e4RK7V`(Abz=SSZTG#H8Z;9f3_2 zc+%V~gta@%qi<;FK$-7-i7BK#em{1&?21E*xfGYFsi{%kIYMiz7PWcwDlCW=Wu)OU zZqP|Q$4S2{w{9ushfx@xKY#vnGvwh-*a}8h_e6qdKklW7m{{~tZW%k1>(eSuuPkfSK-yv_-kr zsXFgzaI#IO8!F~^%~RV60*u)>YuE4G8Cj#niW6wW40m*PhhX)kTj&-OJbi{BhY_8n&GK^((QqRw3xt@<`J8@SU^v9Sns; zV#D%sWsCDbo<>ngNqT<1NoZexzl5aZ-8Y!*$>#8!cX6x^(j1aTcApBg17c{89{=<> zCx^eXX^U@V0lLK*BI2>yt%SY3uy4V0$6(nj60)+a_dDCIjn^--2|d3~+QfbB)> ze9j+Yr#r?Mlaj&;S)0}G3_Biw<-y(D+#GxxFQ zvqzScoJ3ws7Sc$lVCGj!%>TFdBcSN#PghvG8>=2MH7yNUT2>~P(+`n)gqxc?FZeqn z_0@Q5`R?o2%I>eSsj1{Ka$3pzo6&^}hp$xH6j#hIF3P)p5)sc9P!D9jwmr2P5to(= z`vAYAP$(!As-UniYQ!ffsKmA}`Q;S-&>GyRz@YHSlgRFjoSeRE-c7NX zbl5yETUF#08$50CHu=q}J`Q(dd8Fccy-y_8^y*cdlas{1oza%R+SAS9+nurzZ4hW6 z(I38#&*9DJ5TuD$9{l*Mv!llcX zV*|E+U8UjYRr2I9SnuSvrKY)zZF8d8V~x<`&+F?g=@6c+qodrRC;Q}ATmGHz%RED@ zu4b1wB_pFJB`e!)@wTa{+6BCapx{!2-*A5T48ke%{rmS-T(7K>sQC|>wK0eleqs*U zd2jTEHAht{^tyee#f$5`SmE%PH0!32%WN&XWOYwnPTgOFkw@t7-M_CxDlIK#D=RH^ z^wi?irSip7DB`ncC_a9E)5g+LsiLp1y^jW*g&o#;j$gQRiEXRHzWVH~C37ihX)6@Y?r1cI zY)Zi=Rgksgi5PYNz`(_+plPS|@0}{@>JF91Pg`n%uO#dF1qK2?4GO)qI`g&8%c1AN ziLqKR=fGcMkwo~qwx6$W8(hx>BL*j(Z~F6%2s|+Mrr7Y2eYK?z8o*EA`b}Vlhr2ss zqGxUP-FTfB|G~ilN*jk`d=s?V#r}NQT|6i#Xg0^YdDgd~u@TA5-Tl?OB`H0f!=T!! z@A&ECN0ar5gCcHdKA|hHb!hBjkQNFT9b{iDPf^3g5ncLk*wI4~r68{#=qGviZcB>Fyn>`KLlhKg

    @dAFv$W*lSH4*UY=@f4kiK%3hgn5lQ&UsC z!lEy_zM-KyWYgXGLslg5FQre`H(=oW?&-8QZ`AYh@+go~v{q*!cfs-3*4A26AD<8B z!!9l?NO++6w2OK_J<*{pw`>Yg6cQ3r$%dX3xT>XfM~fp>vaPMn(tmA6TL4;tH~F-< zcnnxe%-y^8{U9433>O!dO3i}@Y-FTc;jlXikoL^r@+L&>jO)_Ul8-sSHsub@k$S_T zcvJ#{mUb|0X~`Y1$rt_l=2W{WEj_(hf@n~Dm@JU9M<97JUaZ>kG?vn?{vfPGhN6J9cK)oI7(&loed)?>5C}*n5Z}_GS^1X2bcWq65|wb;vg(ir(BAm? zI4X6}wWz+H2V3LVi^P}~Nr+k)WutLh>+5aV%F|&SP_Q9RPR>tbWA}(_8ygPoF^raC z_PUQ`tYd)9%R#ua`+ugfZofk`lINpY&$ssWGJ0Uh4!_2#V`5`(^e+vU_4f7Y;HcL{ z&z*Z*Rdtq(ou@g!x26NFb_Sl5QU3Ydi3zKRtuSK!{%I-@31imn{bgG`TPpp}udiiS zn|EbK9%g3BJ9JS)^c%35ojkz@ai3cjCa*YpcDLA|Z+L9PBEhA~8LSE#$8Pn1Wv~XZ z*A_)9Um-HYB$Z*HZ(@QiHoMWECSlm~{(Za66u>DAQ4fua%|Hk&*I^2=(k{xNW9Dgv zh;b>Wt}PoKpMKKBK4s|hXBgQ~Q*pu(C|03!StCe11F*8Bl$1eN0<7L9V%sSpA)!jy zWAueC$tHaBG9Jc)!>ro#C%ne0w5j_TF}JXw3>nIr!V_=$w7mIP)t^pc14;_+e3%tC ze`5b{w&;;V zb}_xRg-5pbhTSQ`C#9v276afoIy=kTwH^W(7h_^!kp%29<*Z)Z*<4QKQ%rzudpgaw z$5K%+zOV--RR(6}c~h8pX4yAar-e;SOjM<%4O< z7BSC9URd`5%;5zf<%5}Z;#jyE14vOel|Ld5wg+zektbF4lK5f`iVK?v{mv1)U#HEk zUX4dqz#xdo>P4K?JPnvGg6w^!8D*1dvDW_U5(#c1C?41HY?o>slTlgzVmw)O6~mbU?2KDcef#8UrjymS3yC+9awn5plk4T z5GGZJsQCPRVO3RCDzelqa!$u6Es{vRze%4@ojH@yva=)|Nna1$%dg})GyU&CIhyX+ z1>)cu>iq661yDg!8U}-TkdYA!0JG9|s+n=6wX-u8EQb;7mGUG1whS1gk7mv3|IE!h zx{~|D@>Eg?`R&?#u;cNtb$UAg_THRuqL7AFK`wPN z&V{I=>?~J8zI<$l{()cZ0O>mn@{r!Z*lfC~!f?jmQQ1T-<<`gH;f(rv z6(H^fA&n4*fJ53hFVIV!IkV8OJnaa0bdE_`Ss8|UUR6JFutG;Tde|eG+;0DtB&be3 z4uCuU)Q_4(@Q=Or7KV`w<~acZR9ZM}jpoLU8)H#1Nr}7)cc=Fjl^q=&*&u`){D1g} z!^q+Sf~Ss5IAopZ4V^-ie8gTbR1RxlalG%5?4uN6O_>5aXe`jD-2We8sEaThcIZmH z0i@mzX$4@H`iDFv4PtxP3Ol)Xj{!gN(yjfzZ1X*h)GDfZJI?o{MnS{C5zWfi*Xil$ zIyyQ>wlHjnyR5=8Cb?=EFo`j_zp`p&!Hu1|a^*@_itqr80u5o?@@l!s|A(K?UcBf! zJ~=hDFf(Hp6&)Q5lT66(pC{~oh;tUW4CHlmbg*%7M0eWH{u-|ZkS!ctR>f0_!WQ0h zMF!45BGV%f3@1*UfQ+Sjz!OFT(I;mMQIM{K?yow!x`r^+!>y{S2awW0ee)EG-xClG z#47OHv$8TG&~0O*8riIDSVdKJohZD|kff&r`z8$%>47=?^3R9IMC|X#`OIiF2Cd2z c`23@95(&yCI&J)hQ@lesU1Q9P3wBZe15=6F-T(jq literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-144x144.png b/public/res/apple/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a731eba6e00ff3a70fd3d660c9ec3857200284 GIT binary patch literal 6075 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 Wvb$fUaT12|$F$WkYR^<{!u}66`NA&% literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-152x152.png b/public/res/apple/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..968ae2f01e93c14da064c885111549a06f4c4a9a GIT binary patch literal 6665 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 dUG@*xy6@Y=+Ev%5@DIr$R3fsi|j(#L{=oT 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 YmO1|=A>%K6?RZW_K~ug|&cyeB0DR9&6#xJL literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-180x180.png b/public/res/apple/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..a651cd1c8b2d26a4af969c22b43f7076f6f9bf2c GIT binary patch literal 7889 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 REPwz2002ovPDHLkV1hplh-Lr) literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-60x60.png b/public/res/apple/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..47fafb07aacb8c427095194e8c4cee18e2268e5a GIT binary patch literal 2482 zcmV;j2~GBiP)_A_ONl| zMr=i8m86uEmX>nj#0jokxq_4uE5RyEOiWN+T`j7stNHTFF9{D1CnY6C#>B)3R!Li0RaIVIdTL|(^x5$75Mkxe>rsM5T&K1IMU6VH`%>= zH=3rAm6gTj&6`;+m1R0}=8QBL4C2wFNBmzYDJh}6yqv78ED{qFSq_yY8X6iRDJe-_ zxNt%63>Y09B`GP1ii!%ElanJ{TwGWRl_luu=|R&pX)>7v&zQWtJYhDQ6G?`C*-n1v`TAUQc%-nemt=S^*Gtw>Bvlq^8u z3C^53BlGg|1kb4p7cPi%=g#pY3iGtIv|un81kbrchYn$}SeQ>?9)rQaqeqW;-i?lq zVlWt(PhpOtq9RI4O8EbxxVV^-k`m@pnIWYlJv|*;@$&Lw-@bi>hldjw7|8nd>zSIG zqOY%y=H_OuU%$@9ix;V`uEw4+GBTv5X@VIlGfGQKxpnIntL5(QPG)8%Nl8hpUAvaK z6h*<)(-TimPlAJkNl8h;WHRyDXP;p*nXretx;jx-RwkpOq6AiJ(yg#cPEN*Rv9KCD zcI@Ey-+w1OJRDV3S&EGtH}dhvA0vd|+O=!gLuY5F*tc&V(-f@k-@nh5D_2;J@bGZT z%gb56emzU^`0-=P%F1YMZADQO($mxV_Sj7D_;{Lg&w)=jE4Q zW;w23zs|IQfdT&h`)@XE*ub=7$Bq#nAJ5jUTXA=HXWIDqI2|1wG&eU>QBgr|ZY~y! zh2)6B)l!4|tmT`g)<7&1P0guh-+@ z;ejn#EEeM97|#jmEPW7G)<$uy&Ze$=;#p2;NT!D;q2_pyYIe>tt2NWW3gDUr@_HN)RB=9 zmg}vz-s0T3bLjPYY@xWgn1X@=>}_~>7?ovkb#>+IufHZaIT;}YwlF$6%7Ft1a1>Ri z(=j$S#$tBu+Qr$kXW6uA6Snl@k3Z7U(SaklxVWIYxw+BT*T+IUJUlpl{5T(d^btY` zY)MMVH{X1Nqqw=bq5Amv$h&v%3Z6jIG;(rs@b&e@9{&9EPZ}E=ag=rI)=Aah-(S?! z)G(KahX+TG9_5oyKEa+YU%reZ>GgV{>h*f&djI|RId$q3K0ZF!TSY|$j`Z4Vuc2() zwoNieW@aWnK0Y|YojZ4Mr0v_cOC=;EL^wG)F{`Mk2uJDc?8H%=oSX;=2@#5`t1H{L zZFL2ygb*YoBrr|E%GcMIu&^*@oj!e3|2fq{X{I(qadot>T7%O8LI zfg=P21P~b+DVU)!M@B{lvwC}b`SjCIu@{rcgd=?Q)mKso!7PP2G)+U(G-h4Ac#%t& zE@5j^Q&ZH|)?#n5v9ZL�ch4m?tYMix*#fky!^09N_lt+t`xPXk=hu0DE$FcIM>C zlgy_u&*sgW$;!%N)`JHRh>nh?tE&rJ`R=>#u(#8vPqS&$CgxLkg2co`_U_#)nbFeH zLR?%Nqobp&R(E$dMMXu})BgSY`S8OJc@l*MFHrLva_=p z8ymx3f`fx)c6K%kQCNVBiwmWtrDDsLEzGK_s$$2E9hl8#R^q?^{^QuOW7x~9uf9rA zQ4!A0&MZXXDZISAC@U+&-`}5EEiEmCgoJSE(j}Jbi!Z)lWMl+;*s^5{moHz&+uK|4 z6l>D0cnWuScjDvYWkp2=ZEbA=tA`ICQczGpLqh}ayz>q&E-ozQ>eZ`!{`u$FLvV1g zG#ZU!-MV!wW=*;ki_qzGA|W9`+`D&A{`J>if*FmCjeP(8_Xr`_x^*jS*RJJBdV70` zj*ezvU;ta&zkfdk1qH(0-JPXalWxTlyzs&c#Kpx4KR-Wy`|UR-CMK9RIy#EcXe2v3 zn}LA=UVr^{TwPt6H90xS2OoSuU0ofvl9MM-^6Rg^($mv}mzNirnVIC~=3+~+v9bL8^Us8ahO%5jTCqYU zB_*V#rE%lN4ICjTC`cYTa)jvUXu%4ptb(R#XqrY@S(!Y3{J1b0jYui6B}Gw)h=}0u z;lpy*u3dsvQn7)ks3;K?6-8@nEBX2P6c!fB+S*z%K0eM$I5{~H6ci-m;^IU?LIN8$ zY`{uj11dJ;>+4HuYAUIzsbY9|n99mZSzli-nwy*X=bwLMS67$l>+9p;!-q`M>2!E_ wc;MsXBlUW{(ChUC1_sKIkPxBM=>&H0KRpG-3*k<+?f?J)07*qoM6N<$g5_W982|tP literal 0 HcmV?d00001 diff --git a/public/res/apple/apple-touch-icon-72x72.png b/public/res/apple/apple-touch-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5b13c4f30392f082696c2eab12cc127fdc7b02 GIT binary patch literal 2951 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 Date: Sun, 4 Sep 2022 19:51:58 +0530 Subject: [PATCH 277/824] Pin all deps for greatest reliability/predictability (#812) --- .npmrc | 4 +- package-lock.json | 4814 ++++++++++++++++++++++++--------------------- package.json | 124 +- 3 files changed, 2618 insertions(+), 2324 deletions(-) diff --git a/.npmrc b/.npmrc index e9ee3cb4..c2b764b2 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,3 @@ -legacy-peer-deps=true \ No newline at end of file +legacy-peer-deps=true +save-exact = true +@matrix-org:registry=https://gitlab.matrix.org/api/v4/projects/27/packages/npm/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index db8a73be..6ffd934e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,70 +9,70 @@ "version": "2.1.3", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.12", - "@fontsource/roboto": "^4.5.8", - "@khanacademy/simple-markdown": "^0.8.3", - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "@tippyjs/react": "^4.2.6", - "babel-polyfill": "^6.26.0", - "blurhash": "^1.1.5", - "browser-encrypt-attachment": "^0.3.0", - "dateformat": "^5.0.3", - "emojibase-data": "^7.0.1", - "file-saver": "^2.0.5", - "flux": "^4.0.3", - "formik": "^2.2.9", - "html-react-parser": "^3.0.4", - "katex": "^0.16.2", - "linkify-html": "^4.0.0-beta.5", - "linkifyjs": "^4.0.0-beta.5", - "matrix-js-sdk": "^19.4.0", - "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-autosize-textarea": "^7.1.0", - "react-blurhash": "^0.1.3", - "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.3", - "react-dom": "^17.0.2", - "react-google-recaptcha": "^2.1.0", - "react-modal": "^3.15.1", - "sanitize-html": "^2.7.1", - "tippy.js": "^6.3.7", - "twemoji": "^14.0.2" + "@fontsource/inter": "4.5.12", + "@fontsource/roboto": "4.5.8", + "@khanacademy/simple-markdown": "0.8.3", + "@matrix-org/olm": "3.2.12", + "@tippyjs/react": "4.2.6", + "babel-polyfill": "6.26.0", + "blurhash": "1.1.5", + "browser-encrypt-attachment": "0.3.0", + "dateformat": "5.0.3", + "emojibase-data": "7.0.1", + "file-saver": "2.0.5", + "flux": "4.0.3", + "formik": "2.2.9", + "html-react-parser": "3.0.4", + "katex": "0.16.2", + "linkify-html": "4.0.0-beta.5", + "linkifyjs": "4.0.0-beta.5", + "matrix-js-sdk": "19.4.0", + "prop-types": "15.8.1", + "react": "17.0.2", + "react-autosize-textarea": "7.1.0", + "react-blurhash": "0.1.3", + "react-dnd": "15.1.2", + "react-dnd-html5-backend": "15.1.3", + "react-dom": "17.0.2", + "react-google-recaptcha": "2.1.0", + "react-modal": "3.15.1", + "sanitize-html": "2.7.1", + "tippy.js": "6.3.7", + "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.13", - "@babel/preset-env": "^7.18.10", - "@babel/preset-react": "^7.18.6", - "assert": "^2.0.0", - "babel-loader": "^8.2.5", - "browserify-fs": "^1.0.0", - "buffer": "^6.0.3", - "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^11.0.0", - "crypto-browserify": "^3.12.0", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.23.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-react": "^7.31.1", - "eslint-plugin-react-hooks": "^4.6.0", - "html-loader": "^4.1.0", - "html-webpack-plugin": "^5.3.1", - "mini-css-extract-plugin": "^2.6.1", - "path-browserify": "^1.0.1", - "sass": "^1.54.5", - "sass-loader": "^13.0.2", - "stream-browserify": "^3.0.0", - "style-loader": "^3.3.1", - "url": "^0.11.0", - "util": "^0.12.4", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.10.1", - "webpack-merge": "^5.7.3" + "@babel/core": "7.18.13", + "@babel/preset-env": "7.18.10", + "@babel/preset-react": "7.18.6", + "assert": "2.0.0", + "babel-loader": "8.2.5", + "browserify-fs": "1.0.0", + "buffer": "6.0.3", + "clean-webpack-plugin": "4.0.0", + "copy-webpack-plugin": "11.0.0", + "crypto-browserify": "3.12.0", + "css-loader": "6.7.1", + "css-minimizer-webpack-plugin": "4.0.0", + "eslint": "8.23.0", + "eslint-config-airbnb": "19.0.4", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-jsx-a11y": "6.6.1", + "eslint-plugin-react": "7.31.1", + "eslint-plugin-react-hooks": "4.6.0", + "html-loader": "4.1.0", + "html-webpack-plugin": "5.3.1", + "mini-css-extract-plugin": "2.6.1", + "path-browserify": "1.0.1", + "sass": "1.54.5", + "sass-loader": "13.0.2", + "stream-browserify": "3.0.0", + "style-loader": "3.3.1", + "url": "0.11.0", + "util": "0.12.4", + "webpack": "5.74.0", + "webpack-cli": "4.10.0", + "webpack-dev-server": "4.10.1", + "webpack-merge": "5.7.3" }, "engines": { "node": ">=14.15.0", @@ -80,12 +80,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -104,9 +105,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -156,6 +157,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", @@ -169,13 +184,13 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -200,17 +215,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", + "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -461,14 +476,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", - "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", + "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", + "@babel/traverse": "^7.18.11", "@babel/types": "^7.18.10" }, "engines": { @@ -1103,9 +1118,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" @@ -1389,16 +1404,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", - "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", + "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" @@ -1713,12 +1728,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", - "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", + "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", "dev": true, "dependencies": { - "core-js-pure": "^3.16.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -1786,9 +1801,9 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -1886,23 +1901,22 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1917,16 +1931,40 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -1946,16 +1984,15 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, "node_modules/@matrix-org/olm": { "version": "3.2.12", "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha512-muHkYUAXyRDg88YVFlmFY35vgLPovK2YPkuEtBfgnmBcxJvLpV9UMcMMxNkf8opjMV1k/NJ4niFQMzwd4UQOiA==", - "license": "Apache-2.0" + "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -1993,9 +2030,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", - "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==", + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2076,9 +2113,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2086,9 +2123,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2114,9 +2151,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.30", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", + "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -2135,48 +2172,48 @@ } }, "node_modules/@types/html-minifier-terser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz", - "integrity": "sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "dependencies": { "@types/node": "*" } }, "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==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "18.7.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", + "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", "dev": true }, "node_modules/@types/prop-types": { @@ -2197,9 +2234,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "18.0.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", + "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2207,9 +2244,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/scheduler": { "version": "0.16.2", @@ -2226,12 +2263,12 @@ } }, "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dev": true, "dependencies": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -2450,7 +2487,7 @@ "node_modules/abstract-leveldown": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", "dev": true, "dependencies": { "xtend": "~3.0.0" @@ -2459,7 +2496,7 @@ "node_modules/abstract-leveldown/node_modules/xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -2490,6 +2527,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2532,9 +2578,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2565,7 +2611,7 @@ "node_modules/another-json": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha1-tfQBnJc7bdXGUGotk0acttMq7tw=" + "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" }, "node_modules/ansi-html-community": { "version": "0.0.8", @@ -2658,32 +2704,36 @@ } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2713,12 +2763,12 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } @@ -2756,7 +2806,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { "node": ">=0.8" } @@ -2764,13 +2814,13 @@ "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autosize": { "version": "4.0.4", @@ -2792,7 +2842,7 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { "node": "*" } @@ -2887,7 +2937,7 @@ "node_modules/babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", "dependencies": { "babel-runtime": "^6.26.0", "core-js": "^2.5.0", @@ -2897,7 +2947,7 @@ "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -2942,13 +2992,13 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } @@ -2974,7 +3024,7 @@ "node_modules/bl": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", "dev": true, "dependencies": { "readable-stream": "~1.0.26" @@ -2983,7 +3033,7 @@ "node_modules/bl/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -2995,7 +3045,7 @@ "node_modules/bl/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/blurhash": { @@ -3004,30 +3054,33 @@ "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" }, "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { @@ -3051,14 +3104,17 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/body-parser/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -3067,21 +3123,21 @@ } }, "node_modules/bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "node_modules/brace-expansion": { @@ -3109,18 +3165,18 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "node_modules/browser-encrypt-attachment": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", - "integrity": "sha1-IFqUyq3w3H6BQTlBgS9lW9GQ/xw=" + "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, "node_modules/browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=", + "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==", "engines": [ "node" ] @@ -3165,7 +3221,7 @@ "node_modules/browserify-fs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", + "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", "dev": true, "dependencies": { "level-filesystem": "^1.0.1", @@ -3289,13 +3345,13 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, "engines": { "node": ">= 0.8" @@ -3332,6 +3388,12 @@ "tslib": "^2.0.3" } }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -3345,9 +3407,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "version": "1.0.30001388", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", + "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", "dev": true, "funding": [ { @@ -3363,7 +3425,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chalk": { "version": "2.4.2", @@ -3438,9 +3500,9 @@ } }, "node_modules/clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -3464,6 +3526,15 @@ "webpack": ">=4.0.0 <6.0.0" } }, + "node_modules/clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -3478,6 +3549,18 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3490,19 +3573,19 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "node_modules/combined-stream": { @@ -3527,7 +3610,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/compressible": { @@ -3572,18 +3655,18 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ=" + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" }, "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=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/concat-stream": { @@ -3604,7 +3687,7 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/concat-stream/node_modules/readable-stream": { @@ -3696,9 +3779,9 @@ } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -3707,7 +3790,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "node_modules/copy-webpack-plugin": { @@ -3735,9 +3818,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3791,13 +3874,13 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", + "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", "dev": true, "dependencies": { "browserslist": "^4.21.3", @@ -3818,9 +3901,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", - "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", + "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", "dev": true, "hasInstallScript": true, "funding": { @@ -3831,7 +3914,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/create-ecdh": { "version": "4.0.4", @@ -3921,9 +4004,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "dev": true, "engines": { "node": "^10 || ^12 || >=14" @@ -3959,9 +4042,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4012,9 +4095,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4065,21 +4148,73 @@ } }, "node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -4094,9 +4229,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -4118,12 +4253,12 @@ } }, "node_modules/cssnano": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", - "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.9", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -4139,36 +4274,36 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", - "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.1", - "postcss-discard-comments": "^5.1.1", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", - "postcss-merge-rules": "^5.1.1", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.0", + "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -4219,7 +4354,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -4236,9 +4371,9 @@ } }, "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==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -4281,7 +4416,7 @@ "node_modules/deferred-leveldown": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", + "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", "dev": true, "dependencies": { "abstract-leveldown": "~0.12.1" @@ -4330,22 +4465,10 @@ "node": ">=6" } }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/del/node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "dependencies": { "array-union": "^1.0.1", @@ -4361,48 +4484,27 @@ "node_modules/del/node_modules/globby/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/del/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "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=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/des.js": { @@ -4416,10 +4518,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-node": { "version": "2.1.0", @@ -4469,13 +4575,13 @@ "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "node_modules/dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -4506,13 +4612,13 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -4530,11 +4636,11 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -4544,13 +4650,13 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -4566,10 +4672,16 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4578,13 +4690,13 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.206", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", - "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", + "version": "1.4.241", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz", + "integrity": "sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==", "dev": true }, "node_modules/elliptic": { @@ -4638,7 +4750,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "engines": { "node": ">= 0.8" @@ -4658,9 +4770,12 @@ } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -4690,16 +4805,16 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -4711,9 +4826,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -4761,7 +4876,7 @@ "node_modules/es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", "dev": true }, "node_modules/escalade": { @@ -4776,7 +4891,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "node_modules/escape-string-regexp": { @@ -4865,7 +4980,7 @@ "eslint-plugin-react-hooks": "^4.3.0" } }, - "node_modules/eslint-config-airbnb/node_modules/eslint-config-airbnb-base": { + "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", @@ -4904,16 +5019,20 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -4976,7 +5095,7 @@ "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/eslint-plugin-jsx-a11y": { @@ -5059,38 +5178,33 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/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": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-utils": { @@ -5144,6 +5258,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/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/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5190,39 +5313,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "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/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5263,45 +5357,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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/eslint/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5385,7 +5440,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -5439,56 +5494,45 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/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/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -5500,7 +5544,7 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/express/node_modules/debug": { @@ -5515,14 +5559,17 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -5558,7 +5605,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ] @@ -5604,14 +5651,17 @@ "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=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } }, "node_modules/fastq": { "version": "1.13.0", @@ -5643,11 +5693,11 @@ } }, "node_modules/fbjs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.1.tgz", - "integrity": "sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", "dependencies": { - "cross-fetch": "^3.0.4", + "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", @@ -5691,17 +5741,17 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -5720,7 +5770,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/find-cache-dir": { @@ -5740,91 +5790,22 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-cache-dir/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==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/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/find-cache-dir/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" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -5838,10 +5819,25 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/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/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/flux": { @@ -5857,9 +5853,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true, "funding": [ { @@ -5876,16 +5872,25 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } @@ -5926,11 +5931,6 @@ "react": ">=16.8.0" } }, - "node_modules/formik/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5943,7 +5943,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" @@ -5965,7 +5965,7 @@ "node_modules/fs-extra/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5979,7 +5979,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { @@ -6022,7 +6022,7 @@ "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=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "node_modules/functions-have-names": { @@ -6037,7 +6037,7 @@ "node_modules/fwd-stream": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", "dev": true, "dependencies": { "readable-stream": "~1.0.26-4" @@ -6046,7 +6046,7 @@ "node_modules/fwd-stream/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -6058,7 +6058,7 @@ "node_modules/fwd-stream/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/gensync": { @@ -6071,18 +6071,30 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "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/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -6102,21 +6114,21 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -6155,9 +6167,9 @@ } }, "node_modules/globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -6174,9 +6186,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -6193,7 +6205,7 @@ "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { "node": ">=4" } @@ -6334,7 +6346,7 @@ "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "dependencies": { "hash.js": "^1.0.3", @@ -6353,7 +6365,7 @@ "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -6365,7 +6377,7 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/hpack.js/node_modules/readable-stream": { @@ -6401,79 +6413,10 @@ "htmlparser2": "8.0.1" } }, - "node_modules/html-dom-parser/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/html-dom-parser/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/html-dom-parser/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/html-dom-parser/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/html-dom-parser/node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "node_modules/html-loader": { @@ -6496,30 +6439,6 @@ "webpack": "^5.0.0" } }, - "node_modules/html-loader/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/html-loader/node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dev": true, - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -6555,30 +6474,16 @@ "react": "0.14 || 15 || 16 || 17 || 18" } }, - "node_modules/html-react-parser/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", + "@types/html-minifier-terser": "^5.0.0", + "html-minifier-terser": "^5.0.1", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", "tapable": "^2.0.0" }, "engines": { @@ -6592,10 +6497,75 @@ "webpack": "^5.20.0" } }, + "node_modules/html-webpack-plugin/node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-webpack-plugin/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/terser/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 + }, "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -6604,38 +6574,38 @@ } ], "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "node_modules/http-proxy": { @@ -6653,9 +6623,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", @@ -6679,7 +6649,7 @@ "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -6759,9 +6729,9 @@ } }, "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "node_modules/import-fresh": { @@ -6781,9 +6751,9 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -6794,85 +6764,15 @@ }, "engines": { "node": ">=8" - } - }, - "node_modules/import-local/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/import-local/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/import-local/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/import-local/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/import-local/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/import-local/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/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -6881,13 +6781,13 @@ "node_modules/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -6929,18 +6829,18 @@ } }, "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">= 10" } }, "node_modules/is": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", "dev": true, "engines": { "node": "*" @@ -7015,9 +6915,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7059,7 +6959,7 @@ "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=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7147,7 +7047,7 @@ "node_modules/is-object": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", + "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", "dev": true }, "node_modules/is-path-cwd": { @@ -7196,13 +7096,9 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "engines": { "node": ">=0.10.0" } @@ -7278,15 +7174,15 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0" }, "engines": { @@ -7299,7 +7195,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-weakref": { "version": "1.0.2", @@ -7328,25 +7224,25 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "node_modules/isbuffer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", + "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7355,7 +7251,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jest-worker": { "version": "27.5.1", @@ -7415,7 +7311,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { "version": "2.5.2", @@ -7436,9 +7332,9 @@ "dev": true }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -7448,13 +7344,13 @@ "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=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { "version": "2.2.1", @@ -7480,27 +7376,27 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "dependencies": { "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" @@ -7540,15 +7436,15 @@ } }, "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", "dev": true }, "node_modules/language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "dev": true, "dependencies": { "language-subtag-registry": "~0.3.2" @@ -7557,7 +7453,7 @@ "node_modules/level-blobs": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", "dev": true, "dependencies": { "level-peek": "1.0.6", @@ -7568,7 +7464,7 @@ "node_modules/level-blobs/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -7580,13 +7476,13 @@ "node_modules/level-blobs/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/level-filesystem": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", + "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", "dev": true, "dependencies": { "concat-stream": "^1.4.4", @@ -7603,13 +7499,13 @@ "node_modules/level-fix-range": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", + "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", "dev": true }, "node_modules/level-hooks": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", + "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", "dev": true, "dependencies": { "string-range": "~1.2" @@ -7618,7 +7514,7 @@ "node_modules/level-js": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", + "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", "dev": true, "dependencies": { "abstract-leveldown": "~0.12.0", @@ -7632,13 +7528,13 @@ "node_modules/level-js/node_modules/object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", "dev": true }, "node_modules/level-js/node_modules/xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dev": true, "dependencies": { "object-keys": "~0.4.0" @@ -7650,7 +7546,7 @@ "node_modules/level-peek": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", + "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", "dev": true, "dependencies": { "level-fix-range": "~1.0.2" @@ -7659,7 +7555,7 @@ "node_modules/level-sublevel": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", + "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", "dev": true, "dependencies": { "level-fix-range": "2.0", @@ -7668,19 +7564,10 @@ "xtend": "~2.0.4" } }, - "node_modules/level-sublevel/node_modules/clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/level-sublevel/node_modules/level-fix-range": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", "dev": true, "dependencies": { "clone": "~0.1.9" @@ -7689,7 +7576,7 @@ "node_modules/level-sublevel/node_modules/object-keys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", "deprecated": "Please update to the latest object-keys", "dev": true, "dependencies": { @@ -7701,7 +7588,7 @@ "node_modules/level-sublevel/node_modules/xtend": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", "dev": true, "dependencies": { "is-object": "~0.1.2", @@ -7714,7 +7601,7 @@ "node_modules/levelup": { "version": "0.18.6", "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", + "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", "dev": true, "dependencies": { "bl": "~0.8.1", @@ -7729,13 +7616,13 @@ "node_modules/levelup/node_modules/prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", "dev": true }, "node_modules/levelup/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -7747,7 +7634,7 @@ "node_modules/levelup/node_modules/semver": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true, "bin": { "semver": "bin/semver" @@ -7756,13 +7643,13 @@ "node_modules/levelup/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/levelup/node_modules/xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -7782,9 +7669,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "dev": true, "engines": { "node": ">=10" @@ -7793,7 +7680,7 @@ "node_modules/line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", - "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", "dependencies": { "computed-style": "~0.1.3" }, @@ -7815,9 +7702,9 @@ "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { "node": ">=6.11.5" @@ -7838,16 +7725,18 @@ } }, "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -7869,7 +7758,7 @@ "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=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "node_modules/lodash.merge": { @@ -7881,13 +7770,13 @@ "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "engines": { "node": ">= 0.6.0" }, @@ -7916,6 +7805,12 @@ "tslib": "^2.0.3" } }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7931,7 +7826,7 @@ "node_modules/ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", "dev": true }, "node_modules/make-dir": { @@ -7995,19 +7890,19 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -8016,7 +7911,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "node_modules/merge-stream": { @@ -8037,20 +7932,20 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -8135,9 +8030,9 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -8196,7 +8091,7 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, "node_modules/minimatch": { @@ -8224,9 +8119,9 @@ "dev": true }, "node_modules/multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { "dns-packet": "^5.2.2", @@ -8250,7 +8145,7 @@ "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=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/negotiator": { @@ -8278,6 +8173,12 @@ "tslib": "^2.0.3" } }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -8346,9 +8247,9 @@ } }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" @@ -8368,15 +8269,15 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8407,14 +8308,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -8494,13 +8395,13 @@ "node_modules/octal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", "dev": true }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -8521,7 +8422,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -8592,44 +8493,35 @@ } }, "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" + "node": ">=10" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dependencies": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { @@ -8655,6 +8547,12 @@ "tslib": "^2.0.3" } }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8683,7 +8581,19 @@ "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "node_modules/parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parseurl": { "version": "1.3.3", @@ -8704,6 +8614,12 @@ "tslib": "^2.0.3" } }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -8711,18 +8627,18 @@ "dev": true }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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": ">=4" + "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=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8731,7 +8647,7 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "node_modules/path-key": { @@ -8752,7 +8668,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/path-type": { @@ -8783,7 +8699,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { "version": "1.0.0", @@ -8791,9 +8707,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -8814,7 +8730,7 @@ "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8823,7 +8739,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { "pinkie": "^2.0.0" @@ -8832,10 +8748,74 @@ "node": ">=0.10.0" } }, + "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "funding": [ { "type": "opencollective", @@ -8887,9 +8867,9 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", - "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", "dev": true, "dependencies": { "browserslist": "^4.20.3", @@ -8903,9 +8883,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -8951,9 +8931,9 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", @@ -8967,9 +8947,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -9034,9 +9014,9 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" @@ -9135,9 +9115,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9150,9 +9130,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9242,9 +9222,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, "dependencies": { "cssnano-utils": "^3.1.0", @@ -9289,9 +9269,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9348,13 +9328,13 @@ } }, "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "dependencies": { "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "renderkid": "^2.0.4" } }, "node_modules/process-nextick-args": { @@ -9394,16 +9374,25 @@ "node": ">= 0.10" } }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "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==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -9434,9 +9423,9 @@ } }, "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -9450,7 +9439,7 @@ "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { @@ -9506,13 +9495,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -9715,9 +9704,9 @@ } }, "node_modules/redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -9743,7 +9732,7 @@ "node_modules/regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -9830,23 +9819,115 @@ "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, "engines": { "node": ">= 0.10" } }, "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/request": { @@ -9881,9 +9962,9 @@ } }, "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } @@ -9900,16 +9981,16 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9969,18 +10050,15 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ripemd160": { @@ -10047,6 +10125,54 @@ "node": ">=0.10.0" } }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -10058,12 +10184,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sanitize-html/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "node_modules/sass": { @@ -10151,7 +10287,7 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "node_modules/selfsigned": { @@ -10176,24 +10312,24 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -10211,7 +10347,7 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/send/node_modules/ms": { @@ -10232,7 +10368,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -10256,10 +10392,19 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -10274,13 +10419,13 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { @@ -10289,16 +10434,25 @@ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -10307,7 +10461,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -10375,9 +10529,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/slash": { @@ -10430,9 +10584,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "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", @@ -10470,9 +10624,9 @@ } }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -10497,15 +10651,16 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stream-browserify": { @@ -10550,7 +10705,7 @@ "node_modules/string-range": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", + "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", "dev": true }, "node_modules/string.prototype.matchall": { @@ -10615,7 +10770,7 @@ "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" @@ -10754,13 +10909,14 @@ } }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -10768,28 +10924,19 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } } }, "node_modules/terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "dependencies": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "engines": { "node": ">= 10.13.0" @@ -10837,19 +10984,10 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/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/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/thunky": { @@ -10874,7 +11012,7 @@ "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=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" @@ -10916,7 +11054,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tsconfig-paths": { "version": "3.14.1", @@ -10943,15 +11081,14 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -10962,7 +11099,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/twemoji": { "version": "14.0.2", @@ -11020,13 +11157,13 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "node_modules/typedarray-to-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", + "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", "dev": true }, "node_modules/ua-parser-js": { @@ -11118,16 +11255,16 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "dev": true, "funding": [ { @@ -11161,7 +11298,7 @@ "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dev": true, "dependencies": { "punycode": "1.3.2", @@ -11171,7 +11308,7 @@ "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true }, "node_modules/util": { @@ -11191,19 +11328,19 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "engines": { "node": ">= 0.4.0" @@ -11221,7 +11358,7 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" @@ -11230,7 +11367,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -11273,7 +11410,7 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { "version": "5.74.0", @@ -11379,13 +11516,13 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.1", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -11402,9 +11539,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -11510,9 +11647,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -11537,21 +11674,27 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -11572,9 +11715,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -11593,13 +11736,26 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/webpack/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, - "peerDependencies": { - "acorn": "^8" + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/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/webpack/node_modules/schema-utils": { @@ -11646,7 +11802,7 @@ "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -11684,17 +11840,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "is-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -11721,13 +11877,13 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -11748,7 +11904,7 @@ "node_modules/xtend": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true, "engines": { "node": ">=0.4" @@ -11784,12 +11940,13 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { @@ -11802,9 +11959,9 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", "dev": true }, "@babel/core": { @@ -11839,6 +11996,19 @@ "@babel/types": "^7.18.13", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { @@ -11851,13 +12021,13 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { @@ -11873,17 +12043,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", + "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -12065,14 +12235,14 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", - "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", + "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", "dev": true, "requires": { "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", + "@babel/traverse": "^7.18.11", "@babel/types": "^7.18.10" } }, @@ -12491,9 +12661,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" @@ -12669,16 +12839,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", - "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", + "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.10" } }, "@babel/plugin-transform-react-jsx-development": { @@ -12910,12 +13080,12 @@ } }, "@babel/runtime-corejs3": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", - "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", + "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", "dev": true, "requires": { - "core-js-pure": "^3.16.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" }, "dependencies": { @@ -12968,9 +13138,9 @@ } }, "@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, "@eslint/eslintrc": { @@ -13041,20 +13211,19 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { @@ -13063,16 +13232,39 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -13088,14 +13280,15 @@ } }, "@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, "@matrix-org/olm": { - "version": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha512-muHkYUAXyRDg88YVFlmFY35vgLPovK2YPkuEtBfgnmBcxJvLpV9UMcMMxNkf8opjMV1k/NJ4niFQMzwd4UQOiA==" + "version": "3.2.12", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", + "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -13124,9 +13317,9 @@ } }, "@popperjs/core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", - "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==" + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@react-dnd/asap": { "version": "4.0.1", @@ -13196,9 +13389,9 @@ } }, "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "requires": { "@types/estree": "*", @@ -13206,9 +13399,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -13234,9 +13427,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.30", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", + "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", "dev": true, "requires": { "@types/node": "*", @@ -13255,48 +13448,48 @@ } }, "@types/html-minifier-terser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz", - "integrity": "sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", "dev": true }, "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "requires": { "@types/node": "*" } }, "@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==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "18.7.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", + "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", "dev": true }, "@types/prop-types": { @@ -13317,9 +13510,9 @@ "dev": true }, "@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "18.0.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", + "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -13327,9 +13520,9 @@ } }, "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "@types/scheduler": { "version": "0.16.2", @@ -13346,12 +13539,12 @@ } }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dev": true, "requires": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -13555,7 +13748,7 @@ "abstract-leveldown": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", "dev": true, "requires": { "xtend": "~3.0.0" @@ -13564,7 +13757,7 @@ "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true } } @@ -13585,6 +13778,12 @@ "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -13612,9 +13811,9 @@ }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -13640,7 +13839,7 @@ "another-json": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha1-tfQBnJc7bdXGUGotk0acttMq7tw=" + "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" }, "ansi-html-community": { "version": "0.0.8", @@ -13709,26 +13908,30 @@ } }, "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 + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { @@ -13746,12 +13949,12 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -13791,18 +13994,18 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "autosize": { "version": "4.0.4", @@ -13818,7 +14021,7 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { "version": "1.11.0", @@ -13891,7 +14094,7 @@ "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", "requires": { "babel-runtime": "^6.26.0", "core-js": "^2.5.0", @@ -13901,7 +14104,7 @@ "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -13934,13 +14137,13 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "requires": { "tweetnacl": "^0.14.3" } @@ -13960,7 +14163,7 @@ "bl": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", "dev": true, "requires": { "readable-stream": "~1.0.26" @@ -13969,7 +14172,7 @@ "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -13981,7 +14184,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } @@ -13992,27 +14195,29 @@ "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { @@ -14033,33 +14238,36 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, "bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { @@ -14084,18 +14292,18 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "browser-encrypt-attachment": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", - "integrity": "sha1-IFqUyq3w3H6BQTlBgS9lW9GQ/xw=" + "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, "browser-request": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=" + "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==" }, "browserify-aes": { "version": "1.2.0", @@ -14137,7 +14345,7 @@ "browserify-fs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", + "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", "dev": true, "requires": { "level-filesystem": "^1.0.1", @@ -14219,13 +14427,13 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true }, "call-bind": { @@ -14251,6 +14459,14 @@ "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "caniuse-api": { @@ -14266,15 +14482,15 @@ } }, "caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "version": "1.0.30001388", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", + "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "chalk": { "version": "2.4.2", @@ -14331,9 +14547,9 @@ } }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -14348,6 +14564,12 @@ "del": "^4.1.1" } }, + "clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", + "dev": true + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -14357,6 +14579,17 @@ "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } } }, "color-convert": { @@ -14371,19 +14604,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "combined-stream": { @@ -14402,7 +14635,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "compressible": { @@ -14441,7 +14674,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -14449,12 +14682,12 @@ "computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ=" + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "concat-stream": { @@ -14472,7 +14705,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "readable-stream": { @@ -14545,15 +14778,15 @@ } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-webpack-plugin": { @@ -14571,9 +14804,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14617,9 +14850,9 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", + "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", "dev": true, "requires": { "browserslist": "^4.21.3", @@ -14635,15 +14868,15 @@ } }, "core-js-pure": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", - "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", + "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "create-ecdh": { "version": "4.0.4", @@ -14729,9 +14962,9 @@ } }, "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "dev": true }, "css-loader": { @@ -14751,9 +14984,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -14776,9 +15009,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14817,16 +15050,55 @@ } }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } } }, "css-tree": { @@ -14840,9 +15112,9 @@ } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssesc": { @@ -14852,47 +15124,47 @@ "dev": true }, "cssnano": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", - "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.9", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", - "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "dev": true, "requires": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.1", - "postcss-discard-comments": "^5.1.1", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", - "postcss-merge-rules": "^5.1.1", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.0", + "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -14928,7 +15200,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { "assert-plus": "^1.0.0" } @@ -14939,9 +15211,9 @@ "integrity": "sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==" }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -14970,7 +15242,7 @@ "deferred-leveldown": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", + "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", "dev": true, "requires": { "abstract-leveldown": "~0.12.1" @@ -15007,19 +15279,10 @@ "rimraf": "^2.6.3" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "requires": { "array-union": "^1.0.1", @@ -15032,37 +15295,22 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "des.js": { @@ -15076,9 +15324,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-node": { @@ -15128,13 +15376,13 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dev": true, "requires": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -15159,13 +15407,13 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -15174,21 +15422,21 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "dot-case": { @@ -15199,12 +15447,20 @@ "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -15213,13 +15469,13 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "electron-to-chromium": { - "version": "1.4.206", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", - "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", + "version": "1.4.241", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz", + "integrity": "sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==", "dev": true }, "elliptic": { @@ -15265,7 +15521,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "enhanced-resolve": { @@ -15279,9 +15535,9 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" }, "envinfo": { "version": "7.8.1", @@ -15299,16 +15555,16 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -15320,9 +15576,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -15358,7 +15614,7 @@ "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", "dev": true }, "escalade": { @@ -15370,7 +15626,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { @@ -15435,6 +15691,12 @@ "color-convert": "^2.0.1" } }, + "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 + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -15466,30 +15728,10 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -15515,30 +15757,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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 - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15565,20 +15783,18 @@ "eslint-config-airbnb-base": "^15.0.0", "object.assign": "^4.1.2", "object.entries": "^1.1.5" - }, - "dependencies": { - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - } - } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" } }, "eslint-import-resolver-node": { @@ -15603,13 +15819,12 @@ } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -15665,7 +15880,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -15723,13 +15938,14 @@ } }, "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } } } @@ -15741,21 +15957,13 @@ "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "estraverse": "^5.2.0" } }, "eslint-utils": { @@ -15825,7 +16033,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter3": { @@ -15865,54 +16073,47 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "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 - } } }, "exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -15921,7 +16122,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "debug": { @@ -15936,14 +16137,17 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "safe-buffer": { "version": "5.2.1", @@ -15961,7 +16165,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { "version": "3.1.3", @@ -16000,13 +16204,13 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { @@ -16036,11 +16240,11 @@ } }, "fbjs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.1.tgz", - "integrity": "sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", "requires": { - "cross-fetch": "^3.0.4", + "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", @@ -16078,17 +16282,17 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -16104,7 +16308,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -16118,69 +16322,16 @@ "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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" - } - } } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "flat-cache": { @@ -16191,12 +16342,23 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" + }, + "dependencies": { + "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" + } + } } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "flux": { @@ -16209,21 +16371,30 @@ } }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { "version": "2.3.3", @@ -16247,13 +16418,6 @@ "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } } }, "forwarded": { @@ -16265,7 +16429,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs-extra": { @@ -16281,7 +16445,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } @@ -16297,7 +16461,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -16327,7 +16491,7 @@ "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=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "functions-have-names": { @@ -16339,7 +16503,7 @@ "fwd-stream": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", "dev": true, "requires": { "readable-stream": "~1.0.26-4" @@ -16348,7 +16512,7 @@ "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -16360,7 +16524,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } @@ -16372,15 +16536,21 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, + "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 + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -16394,21 +16564,21 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -16435,9 +16605,9 @@ "dev": true }, "globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, "requires": { "dir-glob": "^3.0.1", @@ -16448,9 +16618,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "grapheme-splitter": { "version": "1.0.4", @@ -16467,7 +16637,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", @@ -16559,7 +16729,7 @@ "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "requires": { "hash.js": "^1.0.3", @@ -16578,7 +16748,7 @@ "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -16590,7 +16760,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "readable-stream": { @@ -16626,58 +16796,12 @@ "requires": { "domhandler": "5.0.3", "htmlparser2": "8.0.1" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - } } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-loader": { @@ -16688,23 +16812,6 @@ "requires": { "html-minifier-terser": "^6.1.0", "parse5": "^7.0.0" - }, - "dependencies": { - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dev": true, - "requires": { - "entities": "^4.3.0" - } - } } }, "html-minifier-terser": { @@ -16731,65 +16838,106 @@ "html-dom-parser": "3.1.2", "react-property": "2.0.0", "style-to-js": "1.1.1" + } + }, + "html-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "html-minifier-terser": "^5.0.1", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^2.0.0" }, "dependencies": { - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, "requires": { - "domelementtype": "^2.3.0" + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + } + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + } } } } }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -16804,9 +16952,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -16819,7 +16967,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -16866,9 +17014,9 @@ "dev": true }, "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "import-fresh": { @@ -16882,85 +17030,31 @@ } }, "import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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" - } - } } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -16996,15 +17090,15 @@ "dev": true }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, "is": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", "dev": true }, "is-arguments": { @@ -17052,9 +17146,9 @@ "dev": true }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -17078,7 +17172,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-generator-function": { @@ -17133,7 +17227,7 @@ "is-object": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", + "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", "dev": true }, "is-path-cwd": { @@ -17167,13 +17261,9 @@ "dev": true }, "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, "is-regex": { "version": "1.1.4", @@ -17219,22 +17309,22 @@ } }, "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-weakref": { "version": "1.0.2", @@ -17257,31 +17347,31 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "isbuffer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", + "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "jest-worker": { "version": "27.5.1", @@ -17328,7 +17418,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsesc": { "version": "2.5.2", @@ -17343,9 +17433,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -17355,13 +17445,13 @@ "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=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { "version": "2.2.1", @@ -17379,24 +17469,24 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "object.assign": "^4.1.3" } }, "katex": { @@ -17420,15 +17510,15 @@ "dev": true }, "language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", "dev": true }, "language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "dev": true, "requires": { "language-subtag-registry": "~0.3.2" @@ -17437,7 +17527,7 @@ "level-blobs": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", "dev": true, "requires": { "level-peek": "1.0.6", @@ -17448,7 +17538,7 @@ "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -17460,7 +17550,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } @@ -17468,7 +17558,7 @@ "level-filesystem": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", + "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", "dev": true, "requires": { "concat-stream": "^1.4.4", @@ -17485,13 +17575,13 @@ "level-fix-range": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", + "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", "dev": true }, "level-hooks": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", + "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", "dev": true, "requires": { "string-range": "~1.2" @@ -17500,7 +17590,7 @@ "level-js": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", + "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", "dev": true, "requires": { "abstract-leveldown": "~0.12.0", @@ -17514,13 +17604,13 @@ "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", "dev": true }, "xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dev": true, "requires": { "object-keys": "~0.4.0" @@ -17531,7 +17621,7 @@ "level-peek": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", + "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", "dev": true, "requires": { "level-fix-range": "~1.0.2" @@ -17540,7 +17630,7 @@ "level-sublevel": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", + "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", "dev": true, "requires": { "level-fix-range": "2.0", @@ -17549,16 +17639,10 @@ "xtend": "~2.0.4" }, "dependencies": { - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true - }, "level-fix-range": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", "dev": true, "requires": { "clone": "~0.1.9" @@ -17567,7 +17651,7 @@ "object-keys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", "dev": true, "requires": { "foreach": "~2.0.1", @@ -17578,7 +17662,7 @@ "xtend": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", "dev": true, "requires": { "is-object": "~0.1.2", @@ -17590,7 +17674,7 @@ "levelup": { "version": "0.18.6", "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", + "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", "dev": true, "requires": { "bl": "~0.8.1", @@ -17605,13 +17689,13 @@ "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -17623,19 +17707,19 @@ "semver": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true } } @@ -17651,15 +17735,15 @@ } }, "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "dev": true }, "line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", - "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", "requires": { "computed-style": "~0.1.3" } @@ -17675,9 +17759,9 @@ "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { @@ -17692,13 +17776,12 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -17720,7 +17803,7 @@ "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.merge": { @@ -17732,13 +17815,13 @@ "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" }, "loose-envify": { "version": "1.4.0", @@ -17755,6 +17838,14 @@ "dev": true, "requires": { "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "lru-cache": { @@ -17769,7 +17860,7 @@ "ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", "dev": true }, "make-dir": { @@ -17824,22 +17915,22 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -17857,17 +17948,17 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "miller-rabin": { @@ -17923,9 +18014,9 @@ }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -17972,7 +18063,7 @@ "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, "minimatch": { @@ -17997,9 +18088,9 @@ "dev": true }, "multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "requires": { "dns-packet": "^5.2.2", @@ -18014,7 +18105,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { @@ -18037,6 +18128,14 @@ "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "node-fetch": { @@ -18081,9 +18180,9 @@ } }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -18097,12 +18196,12 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-is": { "version": "1.1.5", @@ -18121,14 +18220,14 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -18184,13 +18283,13 @@ "octal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", "dev": true }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -18205,7 +18304,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -18255,37 +18354,26 @@ } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^1.1.0" - }, - "dependencies": { - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } + "p-limit": "^3.0.2" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" } }, @@ -18303,6 +18391,14 @@ "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "parent-module": { @@ -18330,7 +18426,16 @@ "parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } }, "parseurl": { "version": "1.3.3", @@ -18346,6 +18451,14 @@ "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "path-browserify": { @@ -18355,21 +18468,21 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { @@ -18387,7 +18500,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -18412,7 +18525,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "picocolors": { "version": "1.0.0", @@ -18420,9 +18533,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -18434,22 +18547,70 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { "pinkie": "^2.0.0" } }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -18479,9 +18640,9 @@ } }, "postcss-convert-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", - "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", "dev": true, "requires": { "browserslist": "^4.20.3", @@ -18489,9 +18650,9 @@ } }, "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true }, "postcss-discard-duplicates": { @@ -18513,9 +18674,9 @@ "dev": true }, "postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", @@ -18523,9 +18684,9 @@ } }, "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -18566,9 +18727,9 @@ } }, "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -18625,18 +18786,18 @@ } }, "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -18690,9 +18851,9 @@ } }, "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, "requires": { "cssnano-utils": "^3.1.0", @@ -18719,9 +18880,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -18760,13 +18921,13 @@ "dev": true }, "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "renderkid": "^2.0.4" } }, "process-nextick-args": { @@ -18801,18 +18962,26 @@ "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "public-encrypt": { "version": "4.0.3", @@ -18842,9 +19011,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -18852,7 +19021,7 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true }, "queue-microtask": { @@ -18887,13 +19056,13 @@ "dev": true }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -19039,9 +19208,9 @@ } }, "redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", "requires": { "@babel/runtime": "^7.9.2" } @@ -19064,7 +19233,7 @@ "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" }, "regenerator-transform": { "version": "0.15.0", @@ -19132,20 +19301,86 @@ "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "request": { @@ -19176,9 +19411,9 @@ }, "dependencies": { "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" } } }, @@ -19191,16 +19426,16 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -19240,9 +19475,9 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -19295,15 +19530,54 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, "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==" }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } } } }, @@ -19351,7 +19625,7 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "selfsigned": { @@ -19370,24 +19644,24 @@ "dev": true }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -19402,7 +19676,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -19427,7 +19701,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -19448,10 +19722,16 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -19463,13 +19743,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -19477,25 +19757,31 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true } } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -19548,9 +19834,9 @@ } }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "slash": { @@ -19590,9 +19876,9 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "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", @@ -19627,9 +19913,9 @@ } }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -19649,9 +19935,9 @@ "dev": true }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "stream-browserify": { @@ -19684,7 +19970,7 @@ "string-range": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", + "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", "dev": true }, "string.prototype.matchall": { @@ -19737,7 +20023,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-final-newline": { @@ -19829,13 +20115,14 @@ "dev": true }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -19844,27 +20131,20 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "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 } } }, "terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "dependencies": { "schema-utils": { @@ -19883,7 +20163,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "thunky": { @@ -19908,7 +20188,7 @@ "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=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -19938,7 +20218,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "tsconfig-paths": { "version": "3.14.1", @@ -19964,15 +20244,14 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -19980,7 +20259,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "twemoji": { "version": "14.0.2", @@ -20026,13 +20305,13 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "typedarray-to-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", + "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", "dev": true }, "ua-parser-js": { @@ -20093,13 +20372,13 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -20117,7 +20396,7 @@ "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dev": true, "requires": { "punycode": "1.3.2", @@ -20127,7 +20406,7 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true } } @@ -20149,19 +20428,19 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, "uuid": { @@ -20172,13 +20451,13 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -20215,7 +20494,7 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { "version": "5.74.0", @@ -20249,10 +20528,20 @@ "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "schema-utils": { @@ -20297,22 +20586,22 @@ } }, "webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.1", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -20388,9 +20677,9 @@ }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -20408,18 +20697,21 @@ "fast-deep-equal": "^3.1.3" } }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "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" + } + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -20435,9 +20727,9 @@ } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -20470,7 +20762,7 @@ "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -20499,17 +20791,17 @@ } }, "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "is-typed-array": "^1.1.9" } }, "wildcard": { @@ -20527,19 +20819,19 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true }, "xtend": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true }, "yallist": { diff --git a/package.json b/package.json index 5f3485e6..cd9967e5 100644 --- a/package.json +++ b/package.json @@ -15,69 +15,69 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "^4.5.12", - "@fontsource/roboto": "^4.5.8", - "@khanacademy/simple-markdown": "^0.8.3", - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "@tippyjs/react": "^4.2.6", - "babel-polyfill": "^6.26.0", - "blurhash": "^1.1.5", - "browser-encrypt-attachment": "^0.3.0", - "dateformat": "^5.0.3", - "emojibase-data": "^7.0.1", - "file-saver": "^2.0.5", - "flux": "^4.0.3", - "formik": "^2.2.9", - "html-react-parser": "^3.0.4", - "katex": "^0.16.2", - "linkify-html": "^4.0.0-beta.5", - "linkifyjs": "^4.0.0-beta.5", - "matrix-js-sdk": "^19.4.0", - "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-autosize-textarea": "^7.1.0", - "react-blurhash": "^0.1.3", - "react-dnd": "^15.1.2", - "react-dnd-html5-backend": "^15.1.3", - "react-dom": "^17.0.2", - "react-google-recaptcha": "^2.1.0", - "react-modal": "^3.15.1", - "sanitize-html": "^2.7.1", - "tippy.js": "^6.3.7", - "twemoji": "^14.0.2" + "@fontsource/inter": "4.5.12", + "@fontsource/roboto": "4.5.8", + "@khanacademy/simple-markdown": "0.8.3", + "@matrix-org/olm": "3.2.12", + "@tippyjs/react": "4.2.6", + "babel-polyfill": "6.26.0", + "blurhash": "1.1.5", + "browser-encrypt-attachment": "0.3.0", + "dateformat": "5.0.3", + "emojibase-data": "7.0.1", + "file-saver": "2.0.5", + "flux": "4.0.3", + "formik": "2.2.9", + "html-react-parser": "3.0.4", + "katex": "0.16.2", + "linkify-html": "4.0.0-beta.5", + "linkifyjs": "4.0.0-beta.5", + "matrix-js-sdk": "19.4.0", + "prop-types": "15.8.1", + "react": "17.0.2", + "react-autosize-textarea": "7.1.0", + "react-blurhash": "0.1.3", + "react-dnd": "15.1.2", + "react-dnd-html5-backend": "15.1.3", + "react-dom": "17.0.2", + "react-google-recaptcha": "2.1.0", + "react-modal": "3.15.1", + "sanitize-html": "2.7.1", + "tippy.js": "6.3.7", + "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "^7.18.13", - "@babel/preset-env": "^7.18.10", - "@babel/preset-react": "^7.18.6", - "assert": "^2.0.0", - "babel-loader": "^8.2.5", - "browserify-fs": "^1.0.0", - "buffer": "^6.0.3", - "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^11.0.0", - "crypto-browserify": "^3.12.0", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "eslint": "^8.23.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-react": "^7.31.1", - "eslint-plugin-react-hooks": "^4.6.0", - "html-loader": "^4.1.0", - "html-webpack-plugin": "^5.3.1", - "mini-css-extract-plugin": "^2.6.1", - "path-browserify": "^1.0.1", - "sass": "^1.54.5", - "sass-loader": "^13.0.2", - "stream-browserify": "^3.0.0", - "style-loader": "^3.3.1", - "url": "^0.11.0", - "util": "^0.12.4", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.10.1", - "webpack-merge": "^5.7.3" + "@babel/core": "7.18.13", + "@babel/preset-env": "7.18.10", + "@babel/preset-react": "7.18.6", + "assert": "2.0.0", + "babel-loader": "8.2.5", + "browserify-fs": "1.0.0", + "buffer": "6.0.3", + "clean-webpack-plugin": "4.0.0", + "copy-webpack-plugin": "11.0.0", + "crypto-browserify": "3.12.0", + "css-loader": "6.7.1", + "css-minimizer-webpack-plugin": "4.0.0", + "eslint": "8.23.0", + "eslint-config-airbnb": "19.0.4", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-jsx-a11y": "6.6.1", + "eslint-plugin-react": "7.31.1", + "eslint-plugin-react-hooks": "4.6.0", + "html-loader": "4.1.0", + "html-webpack-plugin": "5.3.1", + "mini-css-extract-plugin": "2.6.1", + "path-browserify": "1.0.1", + "sass": "1.54.5", + "sass-loader": "13.0.2", + "stream-browserify": "3.0.0", + "style-loader": "3.3.1", + "url": "0.11.0", + "util": "0.12.4", + "webpack": "5.74.0", + "webpack-cli": "4.10.0", + "webpack-dev-server": "4.10.1", + "webpack-merge": "5.7.3" } } From 8583ab19f06465bb01ccaf533fc81a9c48b6a92f Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 5 Sep 2022 08:30:45 +0530 Subject: [PATCH 278/824] Manage ignored users (#814) * Add options to display/ignore usersId's * Update string * Hide search icon in encrypted rooms (#763) * Fix styles --- src/app/hooks/useAccountData.js | 4 +- .../GlobalNotification.jsx | 2 +- .../global-notification/IgnoreUserList.jsx | 64 +++++++++++++++++++ .../global-notification/IgnoreUserList.scss | 17 +++++ .../KeywordNotification.jsx | 2 +- .../KeywordNotification.scss | 3 +- src/app/organisms/room/RoomViewHeader.jsx | 9 +-- src/app/organisms/settings/Settings.jsx | 2 + src/app/organisms/settings/Settings.scss | 1 + 9 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 src/app/molecules/global-notification/IgnoreUserList.jsx create mode 100644 src/app/molecules/global-notification/IgnoreUserList.scss diff --git a/src/app/hooks/useAccountData.js b/src/app/hooks/useAccountData.js index 01c973e7..ed654d97 100644 --- a/src/app/hooks/useAccountData.js +++ b/src/app/hooks/useAccountData.js @@ -5,12 +5,12 @@ import initMatrix from '../../client/initMatrix'; export function useAccountData(eventType) { const mx = initMatrix.matrixClient; - const [event, setEvent] = useState(mx.getAccountData(eventType)?.getContent()); + const [event, setEvent] = useState(mx.getAccountData(eventType)); useEffect(() => { const handleChange = (mEvent) => { if (mEvent.getType() !== eventType) return; - setEvent(mEvent.getContent()); + setEvent(mEvent); }; mx.on('accountData', handleChange); return () => { diff --git a/src/app/molecules/global-notification/GlobalNotification.jsx b/src/app/molecules/global-notification/GlobalNotification.jsx index a28687eb..865582ce 100644 --- a/src/app/molecules/global-notification/GlobalNotification.jsx +++ b/src/app/molecules/global-notification/GlobalNotification.jsx @@ -53,7 +53,7 @@ export function getTypeActions(type, highlightValue = false) { function useGlobalNotif() { const mx = initMatrix.matrixClient; - const pushRules = useAccountData('m.push_rules'); + const pushRules = useAccountData('m.push_rules')?.getContent(); const underride = pushRules?.global?.underride ?? []; const rulesToType = { [DM]: notifType.ON, diff --git a/src/app/molecules/global-notification/IgnoreUserList.jsx b/src/app/molecules/global-notification/IgnoreUserList.jsx new file mode 100644 index 00000000..87ee6272 --- /dev/null +++ b/src/app/molecules/global-notification/IgnoreUserList.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import './IgnoreUserList.scss'; + +import initMatrix from '../../../client/initMatrix'; +import * as roomActions from '../../../client/action/room'; + +import Text from '../../atoms/text/Text'; +import Chip from '../../atoms/chip/Chip'; +import Input from '../../atoms/input/Input'; +import Button from '../../atoms/button/Button'; +import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; +import SettingTile from '../setting-tile/SettingTile'; + +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; + +import { useAccountData } from '../../hooks/useAccountData'; + +function IgnoreUserList() { + useAccountData('m.ignored_user_list'); + const ignoredUsers = initMatrix.matrixClient.getIgnoredUsers(); + + const handleSubmit = (evt) => { + evt.preventDefault(); + const { ignoreInput } = evt.target.elements; + const value = ignoreInput.value.trim(); + const userIds = value.split(' ').filter((v) => v.match(/^@\S+:\S+$/)); + if (userIds.length === 0) return; + ignoreInput.value = ''; + roomActions.ignore(userIds); + }; + + return ( +

    + Ignored users + + Ignore userId if you do not want to receive their messages or invites. + + + + + {ignoredUsers.length > 0 && ( +
    + {ignoredUsers.map((uId) => ( + roomActions.unignore([uId])} + /> + ))} +
    + )} +
    + )} + /> +
    + ); +} + +export default IgnoreUserList; diff --git a/src/app/molecules/global-notification/IgnoreUserList.scss b/src/app/molecules/global-notification/IgnoreUserList.scss new file mode 100644 index 00000000..92831558 --- /dev/null +++ b/src/app/molecules/global-notification/IgnoreUserList.scss @@ -0,0 +1,17 @@ +.ignore-user-list { + &__users { + & form, + & > div:last-child { + display: flex; + flex-wrap: wrap; + gap: var(--sp-tight); + } + + & form { + margin: var(--sp-extra-tight) 0 var(--sp-normal); + .input-container { + flex-grow: 1; + } + } + } +} \ No newline at end of file diff --git a/src/app/molecules/global-notification/KeywordNotification.jsx b/src/app/molecules/global-notification/KeywordNotification.jsx index c44ffc46..8484d41d 100644 --- a/src/app/molecules/global-notification/KeywordNotification.jsx +++ b/src/app/molecules/global-notification/KeywordNotification.jsx @@ -29,7 +29,7 @@ const KEYWORD = 'keyword'; function useKeywordNotif() { const mx = initMatrix.matrixClient; - const pushRules = useAccountData('m.push_rules'); + const pushRules = useAccountData('m.push_rules')?.getContent(); const override = pushRules?.global?.override ?? []; const content = pushRules?.global?.content ?? []; diff --git a/src/app/molecules/global-notification/KeywordNotification.scss b/src/app/molecules/global-notification/KeywordNotification.scss index a5870020..4d1bfd48 100644 --- a/src/app/molecules/global-notification/KeywordNotification.scss +++ b/src/app/molecules/global-notification/KeywordNotification.scss @@ -3,11 +3,12 @@ & form, & > div:last-child { display: flex; + flex-wrap: wrap; gap: var(--sp-tight); } & form { - margin: var(--sp-ultra-tight) 0 var(--sp-normal); + margin: var(--sp-extra-tight) 0 var(--sp-normal); .input-container { flex-grow: 1; } diff --git a/src/app/organisms/room/RoomViewHeader.jsx b/src/app/organisms/room/RoomViewHeader.jsx index 849ba14b..46a6ba0e 100644 --- a/src/app/organisms/room/RoomViewHeader.jsx +++ b/src/app/organisms/room/RoomViewHeader.jsx @@ -33,9 +33,10 @@ function RoomViewHeader({ roomId }) { const [, forceUpdate] = useForceUpdate(); const mx = initMatrix.matrixClient; const isDM = initMatrix.roomList.directs.has(roomId); - let avatarSrc = mx.getRoom(roomId).getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); - avatarSrc = isDM ? mx.getRoom(roomId).getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') : avatarSrc; - const roomName = mx.getRoom(roomId).name; + const room = mx.getRoom(roomId); + let avatarSrc = room.getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); + avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') : avatarSrc; + const roomName = room.name; const roomHeaderBtnRef = useRef(null); useEffect(() => { @@ -93,7 +94,7 @@ function RoomViewHeader({ roomId }) { - toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} /> + {mx.isRoomEncrypted(roomId) === false && toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} />} toggleRoomSettings(tabText.MEMBERS)} tooltip="Members" src={UserIC} /> + ); } diff --git a/src/app/organisms/settings/Settings.scss b/src/app/organisms/settings/Settings.scss index aa455700..a9ddd475 100644 --- a/src/app/organisms/settings/Settings.scss +++ b/src/app/organisms/settings/Settings.scss @@ -40,6 +40,7 @@ .settings-notifications, .global-notification, .keyword-notification, +.ignore-user-list, .settings-security__card, .settings-security .device-manage, .settings-about__card, From adca914d67bc0c509c2f3e2897dd09120856be15 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 5 Sep 2022 12:26:44 +0530 Subject: [PATCH 279/824] Copy Olm directly from node modules (fixes #206) (#817) --- .npmrc | 2 +- olm.wasm | Bin 159054 -> 0 bytes webpack.common.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100755 olm.wasm diff --git a/.npmrc b/.npmrc index c2b764b2..8833acba 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,3 @@ legacy-peer-deps=true -save-exact = true +save-exact=true @matrix-org:registry=https://gitlab.matrix.org/api/v4/projects/27/packages/npm/ \ No newline at end of file diff --git a/olm.wasm b/olm.wasm deleted file mode 100755 index eb0f50ad4de15cbd0cf9a399d2967ad868fdee24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159054 zcmeFa51gIXdDnT)``&+Z@12=D(nuOfW9i&ivOKaSdt^%*MH$=kPGnn&okUGdYP$Yx zHB+}$XOvWuRmUw8X%Z`rLIW5GOQ4|@O^O3m!O(Uow6tyuOBS-=Zdo=Ib`eV!@>%}5 zB^0Mkeyaq^ptDczq~q(5#TVZyh3hZ6ll9^QX)M~Eti>22A~40Q6ge72YBDAlRI0cMhpQg{(9lqIwBlWbFW$Q( z;ipq+KxrdwB-LuGlK2+kq*5KKBsDkY6L`?_&bz8hHzd`Ht5zMqNh2Lf)0(TfX4-Bv z6PKjE>f4QtLrUu#%H~peQ~qG2{nctUxwWbrstq|`8EH0~BmxOnQ__SyF>$Q{fHs-= zYFS)8t))P%`FcX0I=*p7dNB28psQN*zOuTS)Ed-Qe&sLLTJ>M5{gC(Ho;d%6dyD@L z;D4w4v)+G~`!n93av%5pyWRih{gV6B-Y>iV$@|mpPkH|yx6i-V-QmB-ea!na?oWDu z*8K_Z&$&PD{gduF@6WqG=Kc4&KkEHc?vHr?KKD`YpLRds{r9;)?EUw_pJBF+(Z5W_aW~ebeFt;$UWozarZ&*-|9Z#{oCBC_Yb>^{tce*}xYNn01-G1h_kvqWmKNN1C(8@& zRC0R3?MdFV;Jzz)?}Gcz3+V{BK@xzv7ce1?~?Bp?5F1U-rqjEV!3^^4Nm=hd%j(3+}T%`PK#Z_kHqh z3-0gvWcPymUwyK$=sx3<#YOjbee&&#?tk&g6N~Qe_~bhl-QV`fcP_eL^2v8Cx?l9k zsYUk-KKbrN*t4|gUi8WGqI)bkz36`4C+}HwKj)M8F1o+vlkZt{KkJh-i|%K9a(2=E zO`n`wbbrGqPcFKjhHH!Nufw%P_domOsYUlwux-)(By3xBKjD+_TXcU7zAd`H>XTe0 z%`dtaV4O-iw&?x}d|PyX*(VP!Lit0BP=0*T{kTuwy6CRLxkdM5aBh(bcx2K2B^W0V z?^twy5xy*ux`=)5Ug8t ze-73yx=+BmMfZb#Xp?ujZ#BN-|MmaO|L^`E_#g3q-e2*}-~Ork=l$QWCEG95F9sL< zRMO6F$^H4OSv}lxHQRVWQJpMY&1&*BvaWq>U06|Yyhz(npps?wEs5VIvYl76A$@S! zF8ff8A40Yx-+20JmWCZyvrdfLP23*hDoQ_@c}qXew`<1k2<%y0YfO14#@#!9wr zek-A7Xck}Fa<7d(^Zxsi2^doaKFDNOvta=3GyA;ECoY{k_1ZG`3pvMG73 zNTTS9A$p5Y3}Y9D68ky89kLIrF~e1;9%?FF`zhV6#1p}^MMh;0LGTLN7R zDlai4t3jNo1hKnqklMJBa&uocN+*p{Dm^hQhYD=q8hORq4VE_zX_435n72*dq0myf zN?8}LfupLbTDcX~w?4HE`AVo1$eSCH4*=O3w&{bQhAm-2{*!o9%Vh;pd5!sPmsjpf z#z~)shSEd;9U|(G9L9{FEu%ZJ@}qE6jDjR2%0s=I8!6aL-tA$sS9miFmxU)3K93N_ z(WFHCY>$fWmWpK0KR^&4&+XEq$KOkRzh!6um*wZ3T}gII18LmZkIl*_rfd0JKA0 zUpDFsO#>R>c#V2l$wn;EDIqM`jPg;j1nn@STpi_7vueRp!s7~4kCyQ`8Czj=e#eI| zP)ZwsqciEMCwA1N1E^}9_0XB$`C&Y20Lr;So(&gPX3}Yrrt`ZmP-8V!QKd*v0hVqi zog&4EQj7qsp%frfe4F6g7?2?)OJ~yORIo&ia@tBsVaVUG+8lDPa;@xC)i#sPk-CNW zf|+t(R_>HsuqevKkO63j8$~|D`3UKnDj>E}G?5W!49`Yp(ldM)vK?a!G7T2BFis+= zHk1$4P<$X+O~}=)n5x)E>8ce~ogh7CkcLcDi(CyW+^Px;s%l*I5RSBv(gF6bf9g>46{nSL=T0H3***>W{H3H-k&7huUKOKOwwzE4e ztCSQUI@w*)^`vb``V=*uO<&D6D{Un^U}?9+4-?tlSF@nB&Lo$#li59{pJ^vk$?oi+ zC7+1NLw3l%Svw3gErY&0ODvXV+3$X~@~tkOr{RvP*)~GM;m)hsc03KMrLl0}YBou5 z$aKx!24W-}yqeuYq@+f5OfR$pPn0t0BjAYvCTgJ*M8^>NdL>L7fSp08HcbJygOG@- zw<=YdWl}ZhpIxTLb}NJuyLDZ6u(7X@)Oocigi^&ywUCvt-%1)SO1jHJh&!rxC%?6# z?AXf+*VuiSI$X$C{M@@7ig&y91F1? z)#*-#!0%AF=V~TODn^x5Oe9m)Lwa6nqggM+&|~VGv(T zKZU&px#$F`LhA(kJ!uQBfVOau-dI6UR2_8_luagY4MTgh5THX>GZj&_I^AeIK_3@9 z8R($Y!|o2Z>Vx&LS=c4Ndf1BPDtqOTehKM6Lq$vn?0P&QXzB8M%f&Ls8D^o)eB2n|KR->q`urE1 z#HpIUK*iUy+Wf!%?DH@E%g|KOSm16+B1i$A03Eeff`n@+V&Yr$nD3 z{OYIv#^t~B$A9&MKS=76gn#{C{mj4o8Jfn`UQ}a{|f$Vh5zIDKUesl!~as@zl{Ggg?|@18Umjmeo~DWnLiiYb&<)9B2$ZW!3}0dQao)!l>s_Qsc zUB|iVI?llgs}Toy7-$Z0h;>S^$F$FBs8ulSrNS?!eWvh>X)hLjG3}=dznJzy;fHCT zF1#@9O44K6m1HS1rlG7v^*?iKxVAnvvTc3r8ou=)tYI9aUP};;f@Gh$b*ywz2wh~Q zTgOVbj+Jg5D-np?NXf5>l|ED`$|H}RDtskQyhb|3>F70QHPs09PHLRQjq~~H>X++h z@lKpSr--NW)vu%$e(K!0!w8c@eYBouY1MiRlB8$o641oKbt{s4=9f#%+FUn9BvVub zb2l8vq>WldQDpV}{Kw^~2v)tOmi3PpG2tp}ro49(riT!rrp zqdRXO_R{5@Vro!bmhSZoX-viM9`kNnJ5e7+q7%70t`4f};IYdp>cya0y|WWr^QN^` zi&T2$ma4Z1x=_)*td5@ksautHB1$tBLxKKkiC&AoxV6vwi}}Sa6wz1a{vjcotGy7E z@2NaJy_6@*)%;?s_3KHJT=W+}F|mZO;k z99>9A)E$)oh73Rs=w;BzXk_YdUiD}54}9=a<8GMu6+j!46(eq7~poIO|eBxY&Bqn(fT>sN)zJet(o86X;a@cTnZ)`k)5V}Q?gfmQ2_agS8ukONKt$zL&cD& zwNE8;*2Lk_5=d5Jb5?!plg3x6`qC7Aqn1W==LjNW-2?$G+pJcY=^sZC)2I;MB~~*N zYqzbRPkilSg6M(01n>L=x(GT;J!Ov~fMw3qnKDvlj zRzWjCS~<9pN}?`2Op$sV$ZC3WAguDcs`@nQDrwJw&v26j5e;c2RI`e0g<7liBTaa0 z%L+ErzaSCnhgthz#lcqCoK{;j?;`@4V^yI1#(En|TDE%A1H`07qG_q)0-dF{jJEK= zT3rOfG6AsUXLc^B?w8OhOVBqZvn*t{r5M6tJqV_oS`zAm7|5r2RGFth!7$SlmH4Uk zu%-lSD#EgYB082X^2N}x<&T0#WGPWIN(<1_>p@Qo^mGJmK!TBHr4;b2m;z;k1#F>d zum;fwmg0}BFXM>Hpds~Wj%8SJQ&yZ6Q50v{2f>oPB*lsxM5QQlZhet+Dspb1$boVO zSy7Z}s0^Y%SO(<_b1P#IFUnB-@%3dNSJ}s7*@kc=*XW8uVB}84>{fJ9gn=3?0#GIC zRwIMt4x(t}o`^*n@M&YKm0px%#TTR-tUV?|iG$Um0gh!@aYw8;E21dQ zNErk>K#Fm45EVoJhl+)-| zX&)n@ou}usVfBW?OM9KmlKCUghGc%~S*^D4_u{MWnM*`W6cN|%e}+&ahF;$J%q4wn zTvqB=M)hez{x8=p(-i)%q>4Rq`O>9JQs`~sbA;DdrZtJ+o)BWTDKcnZJ5 zxInNg^LKxQpF7D{ncu>13e=Vssg*)R5Q92(NC7npNGYJM0_s*ky(}OOA6HNbKL5M! zVGTId-dM)8Mu)6*wWy}aFq3Z-1g!|Y!2-UN1_2GBOoL1i(AdbdN+1vjn5LN`Fh#($ z&oluIEKDOEA)pa}X{k8^l%B6vH9UV0(*cH^46&LA-^(od$5%2h zea3Qmmc&7*_(2lw6Rb&G?5 z4ydXppwfALRa{kzB&9F=svJ-qlN43^RiVzsr1WuL73y)pJkdpX%6g;GmPK$DL|f0V z$!(Alh@uXusMe*r*TR6rsGZlCfaibbqlxB&ieVOYni=IU_G2oFN%Ozmk6|Knnq~K2 ziZM?<$pTy(c)pAYNe^P$gH$OYSb7=|=}VYNFK61zSt)Z`dfFK2ORSP!&a{`aQs%Vu zM)iI-9O*0bLEliMuPm9EYNW5A#u`_oui%QoqtU$~e96feTmgqm(R5Isj6?4t&rwr7{55s#xj%3TK)_DxQ4df_Pa{v zO(xamD!uPksr9@B!8(*BiVY3ujb6%HFA=I_u(eca_@o@_rKB*AdLXXZ%R}5S%Of~L zS*_PLOi8qQiJCnSjMFTU1h(FbWk3)bWorAb2Hxs@FJ!h)Ok#=DO442;y7Mr!28dc6 zh}BAd4)881`B}mw-ALqTv*4%Nz&bAW+0Uw{p&-HU(_y?}v!$pb$g)IH+RM_l2+k(u zfVM29yTr514^C-`XPKM0R>ZSj;3-*NSMNRWuq2`o1(=#+FRj4t`g*5V8Gxip>Cs|z z)LXVP=~&EU$@`mIpWl$A7b`mZ^+LLwHJE}mn1ZQe!WXwg%sCN5k45KXbWTNQIyy(l z%3|^;9A6y?$@cD0qSeQM7p}zZzeawIiAuu;55hdW9{}|vTo-kS-11T zu}0gjV&tAr7rTG*S+q9)I3%<;JvEblJc-_uOg{_nV;rq2yeF8*7T)7C=__7o<9u`` zec3_`8*Bs7;7x1)khRl<0YaoJ)k-^On&^0ooxemof9!{>i)0Jy`bc)Lh-9UGFgpvE zNnY&yHMDz_rC(>}F@v*8Q88>=nWH6fv>(BebC*dbCc?SZ!VBkK>2vPoKIgt*-jZ|I ziVtv(UBr@eFHzM6=U&owhB)W7dEMLoGuA=x`q;Srw?6hp+ke`STE{(TeJ<4&V5Hf9 z-M0W6xsjvoK5YRu@{USdy9@Z54N6R&%34};lkh1RvbHrx`8(OLCL+eh2_3?t)v4`B zvgJyw*^r;FTr)G zm9=}=?1+SFQ3<0<`G2>cDmyqa=YyU`?ic_r;@oWUCLK& zYd)nBbSsI5Ni%O}4XcvRJUpz4X=N#Q`3$?1>=A1lwUXbj@5P7v;|C20ZBJKB6W^05>j_leWf?fzU8RX5TCgJ;V8<%eBY*}2J?OUQIv!E zzU!zPkG|!js1A$!o}+G3zPtRpwCiiWcOP{Oa25BhM;%uaU=qAfekV6gatV3 ztuLo6ppzT~PFr9{44klYd5V7YsH?}g$Bt4Rmh^FHL-UNZB-6Gz>a=sR`PZI8aw zN8QfWr?ovFoR&eg2Fd`#P63&Su;q>X^-uq>Sj(`AO%!&(*}rDmxaRZ^i`ML54;-dp zkr~CwT4e3|(?1;SCi#s{|7edLRML3*r)sAN5C^u}+1e>j|5SyDPbBYl`Uj<@4fr>9 z`bUMVIsK!E0g^n$Ryh4rVM~6wb;RXg{1EfN{PV+{9vw?8m|wGi<1m&DJ~>VEULC19 zy-dR7ybjc~4x7yGb#BH5ael9(LopC-zrAEayW*qC2@INf&S4Nmn{YJ$%)zJM^ z5?Ck4nPfE^XM$}KobhwoC>o-9Cnc8>}KA$@igbbRvSzC*6&@) zxAE__-B48ua)lNHXEi$z$vY<9@=4A?J5Y?EF*qI}25AY*lJRNE&Ll>qFl8Gi2Au(S ztN7x2$OMNzILng1`s%BrXPJp6I-sG+LX%_>WQ)X7F&w_Yr-?I%JYIcuCnuWOv7+S7 zPmxCxW=@+}Q9j>5%DAATgBx)vN~b%t#!wbk$*bo9wMn_PY(RUDB}#3Gy4rd4J&wk8(NH?EhMGp8yJ%O$yNeb?*t_T~gtjYQ z;<2A8jf>13VVVJs!z*k=&`@0l7xvBS!V|;p7qU8VVcnsV8lO4fu|sPME`S z2ZDeY0fG3`i$Wki^^*{Y?;t)1#79pq0`cv`*9uL1=$O69V_iD2y~)WgJtiL+@Yc?@S_COH8ruQ(Qc^qapt+Nrc&9`d(vzDojQ ztn3MlNs4yg`8G?(VFJ^Tz?h^Qi>x~yS@%ekluDG8MwFCxl$1`Cl<_Dj6H!toqof2R z#RSHh;W~k7hfP$l1SX1(1SX1(1SX1(=!UbTlfXpLk-$XJi2@_hk-%_gurDyyET&_7 zI2frsA}U4fP%t`+hGA?e8U{OxN;363AoqHKX@+rXR{~Qp(TM^>-w@?TBEwB9l1OB@ zr-)A?!}VNz5*cp!;*-ck;gQI+LyNd6D*PoX9AWBI@K4#=5}Iae$-)wbq%RVRqoS2V zx92R4B!ljP@d_FRM*@QLn8p`UEa>p5CdN<%RZAvc}xi#2t=_5JalRk1A})FR@>yoPcN z^u%v`4D@tS2p){U&uWG>h#ZN?JIG$=+(oTRpO6k7tOr`-=ej-My#;0bE32s`C~r*i3JD<{q? zHYu&zx$blhHZsho5|mvqV)lNlSFB$ji=Z(%SRV_2*uW?e&?#vUz!3sEOKl~qxCdJA zg17lApX4^H&LA+DUeZ}$?u$85nnOzPZ{N=DgS#ItoVSZj9d5k&mU0E1m?#;yLy(_`hM`6Xt-~u%HB%RZeG8U|7piMH6&>Zh zo|(|%Io{8y3Qp#OhHHHbsM4`UxiFu}h51Y_%opWC>4GK-7B{6yf%&F2Q83>TO&%ma ztp_7`FGiBd3p*v})63Zo9q3~h0m7_b@#=aAsOBEeGBm)|%sSdf zvt1TQZ20vKYQ{*wYKJZ(ljKZxn_cs@9{yAo zlsWggL5-Z9cFy3LhxNGJ% zMlXatvST6}6u~H~gd&Ph74H(eKO8TV$BWl2QdrUOOUIT_X5t%In;S17TMuOSe53III&Z^5m4&$j zek)-LS&D#O!=#6GoP`|^yK&6zWfgb5O^=~?rPumN5LKec3+p4zp311*f|hv`aYR^@ z)*d)KC|YP(1uf=AT4IkLZqXM*p)fHb6mDkOL)|JZxR1osY7+apJLODwgPeoiuAC#? zOwMd~7m8tSS>vwVia6H2RnGD59ywFp+vK<|vk#5Q_R48=Zlwvj=c85C&N@MH_`|-`<%fdc< z=*`d#ci_|bD}>we3G~je7vDa7T*1aS6&U6fI!0qwGY;`M6A+Ix3Gp}q;vqt#%>#0FXLm1W z_Z&{n6AQ)58TW_J;D_Ah>`)x!K=5*QI1Y0lc{!Vj109H7&bVcKlJt_FtXIGx=Zxh^(m+;u({rj60ruE=z; zI?E#4#q6vb883EcA+lZ!&vurBUnUfsRuud9gxi*~JyrqY-)&(>WE_qdha<+}h;cY# z9F7==BgWxG#^Ko=4lp33O2S>?R(w=kxHIg=H;He5*oAKb-@cIH8^?D?=;G_(yFCPa zZG3yfPJ9h~NH4w$KJmw>ok~`^CLOCjipM42r5Fuyqkw$WM+te(M-lm$k23OcABE&; z35hb$Q11bzwbxt2LA<6tc85cFO{47!hw++H&%z8|(-z%u1h1)y5Z;8>wAapX6z?ji z1s~pwS8aMvn8o*W*umxkCroc!JABZYfpYl3AqZU|i~~-Mw1C2`LZ&ILx?$_IE(g|* z#m=#}$Ge2*^D7@pmWZq7&kwa)UrISj7{{qK`frxE;3wfL8ffljRK{49X)(iz9PrzX zNb$Ck{}5}vetT9oVk_)lJm))Y3c6@Qm~%^?I#o#G>GB`;MdMXMypJYxfW7!gWzL3x z_fk>X`KW8K>~coYAn}q0F<`~fox{mzJ?XEo@0(KAlwGEiqWLUB`5B+gfgWSp{4>JJ zh97B1w>ANPv9L^lX3E_=php~uQ(NxBfdKfW`L~?~gO=6;Yo(k(S&xii-Z{Zlfxw_2cJQCF*)>xIV=KeR0S&AuOb$Y> z_5;Ti;-V;JRJM1MUd3uLJe<`zVZLaB5YF;BR2gluegOxOp^)g#sp?b#Zu82iw*HVt z@YJtSoOW7vuMd9JZGflIF#uT}?%cX9uBl7BkP!YU+*?%F6iH*gmu-=~?pVjZ_z*-^ z8CEw0OQUjxC^01M`YYEcDcct61=M_LZ^@pMse|yf(;ttEXxW~v50>q<60K!>&2^V) z5#Xr<03I~HP@rL3GGM=T8??^roOawA@V#=@l>$tb$iaqE_@NY*X{{7A%2I2b3KI>h z6hir{p2pYusWun0O)jKyOm<@korJJRUCEh5rfl{{&i&CaMq-yN!I&vi6?mHMrE`H< zI|=fpW-T=$vsBS!_o1q|Y7}O_&(TCITb6VoT^E$Snbe@pNJtB^3z>wplbN3Fk_4ew z;<{RMD)S6==4{=%iiMXdm)n>K)QA?EeHoG0&!0ONJKwn4&8(0m=T?wlCnQgM$wR{Jb0|c$tWj)2^x~7~(*fOv?gYd--3H7-J!ZPC zmao-qHK{V=RH56VvK!ECg3?O?dN=e(4uq z`N7fz&NX_?`G519&;IJq|I}~%!cIF$S(*Rg&wc5i{9<7f=OrchC*oPs81^b_X;k38tYZ?Aslu8R$;u|qwe1o-t4IR_jvPvOV7!z zz$t(&DakHv5?heFSi=`24RbbbGvlPqZ69SB+&@>dFY;2^mkcg?(hqq@f zL2qdkG|VW7wL02v)DkU?fZAw@D8#ZU)m-8bOQ!9_lghwdy4d$*N6(QrorEa;!4>MF&?qhZsnA?xO;#op0sSHAUiT^YDHp<>W8T zk*`!y{xb7a2xNK2A{ZNX5VZUyXd1$2+Y^YN1;7wIuPkh<$KoCs( z;pLc(X+OM}V3YRK{tGtP{zIt<3%!QX5pMeQ^%ADUt*`fD#P+`4ixHE3y%!^H z>Fd21v7@i|V#H2lG!I?6kJw1QM%`!oK-S8bC!6jo)LoTU+9sy2?%WO3ol-1=gu`9x zYRLq3r%0W<FHI<#UOx}r)@I(i zJ=6LOT^2Rev>K}RYN)CjV*HG<)TnC6c*2@izlMfl4MDk$x5PDH){wqYLpS|K4c+kD zni^79NexA2H)9Q{W>iBxJl59`=P1-6(P^`(3X#SFL`RDgU|3}p$2uhO^>x;ewsVUP z$*t{>)b}`bNRAGPNx}iQg)KXr39Nfyo8f@lI^T(&ZS40=JbP)rdRhCP?irm-IN-MF zFv0=1-IC*(#Bezo=94lNMv7|pFeDo#dLEk~7!uJ*hXd{wvV;wn&h9iA}6h;eOc0E!4cWd z9yNo=(Wdhzv+``^4QFgjmDz7un;qN5+3k_bQ^xW;VqljArssdI-Ub}1#8iVM zvT}g;SF(L_f7%-r`2L1Bvhn>*pB-KUiyZgxN=uL->af|YR8JV+ZV8y=58WVQC(Ypa z)*vjm1eHD-C=3JVz0y~*eNi$FSX;V#CEOjua@1znI=d@2y!}Ocnl2jAHWj_SC|bs{ zGb?(h**%}MLbqC>TU4kh`)fYCNA6GbDEvvIa6Y}v11JKwtpF$NcNUZg`$+?|wFLB6 zd^RIMFZ2NY)yS%Qj7epCUCHi=#2hi=4#vQn6j%ud3IYchfNDA#)4W-#>5j0gNW)&? z2GmZbFq&x=2-zL;&;0p!gW6P?rh^@DlF91(Mzi|9*^HNun(&WVEl*89a559 zwYAYKh;Oz`TP*pgB_Ffon=H8*kIz&X2;6JU_`Vpp-vVNgnjTx^umAw8L@i-j5B!2&_#Bi_ytYnA6ol!h?g;{Z;r+>p< zWBT4gYW5dWb625zrsse8$8_@J?pPa#BKoD&WxH04`Nr%*c^?W#!(7N!h~#pw(HQP1 z;M}(o?k_)05gRq!-s0<>1w-yFlXPGN+?SoUjmC}5RtH;+`&*3rqsIL)d^ z0#lLN+ao=+VB}5=47V4Q?h5k-ZAfX9%;{J$cNH~oa3#E{ND}S|(-uqTm|dXh=>dTW zLlo=z_`4+v;U={x&BzMxn7OU z_23!>y^;;K(6T8)znbfjlDdAArnw%A40}L4x=E7`Z!UAn19u-(;!p^j922KEhX+gV zzMgJ?$&w?O9LEj23UNBN5*{d1=ix1-cW+F6N0Iu@BK7{FKJH%$YNdtr3Lp)j4MMvB~OVysVGE zHPEDguGh!>ytmq@ql>LkW_oi1er+%T+!O;FEzpU9aSMzUh)x;V@G6qDt03u~e%*z! zf;Pr*1ywxCW5UWv*9zNgAaz8JlD8`WIrc7;+WdGtTqW;R6z5-Kv(L zvBQM%e0Rz7=RLCqn$V|vZQw6P&d(HFkE0(ASN8~nTH!>Q`A2=mithoQN3)^9#&tS) zV~=+Xhx@#vB6|&fs>i2TJEH~4V+AKVkrX=;2%X!E&cQ)DT`+_0k|~Gmdm$4H!#@mz zqSCQrXks~I<)RFG@JdkwHMy(6XS879SRpl?0v~!Vh=&gvwd|0W@y-=ybO+pzcxdd6 zo>q_&tD3FS6Z-y1lkP3nVSOs{c-(kgEe4J&rLb+WEOuT`=#3U-j}^FeB2K(kWd%gh zSL%{MX#Nca{yiF*%9JFO%o-1NGC zQk|Px;O;=_-4LPDrX;eX_8VJo#67mxvWY2;wJ<7O{<6*)`E0T|n82@?$b*qEqa>S* ztz?~97nnOU*Wm(h7hkMDSQr!VC8E&c`)+ss)gV}>IbK32(QK1% zAKypkEBNj(SVjp?jn$d5&yNVgZ3aPdjvguqjp%pg>*TxBAjEt?dKUdNrhK;(za?fU z7&A8CB>e${m*AVmS1=cxIr};~KdzkniQiu295a@7=7&jt(9&1&-D5DyGHb$hR5|Y= ze(TyYXWb#omJ0j^CA!-(s}2w2+qSMC)!mz74tz)OO|AhriaAnU?pE!`Ix9)&_r zIx53(qeKbB7!1+9ab;1hX#r+zUbS{FzCwDaa%!y;Ywf6|pbkc39n5NfprXTVzkoqQ zJ8@+jK0Jc(l+HV?dQJdMJhd!4>RB?9INplQR}-zN>3Nkzt7Gg-=3o3|l6#hb>a5DK z^u!Mfb}|CVxBnc!<=5Dqs9Vf$6ftwlMZ|w9B0`y>504c!UBrEwD;kGErzP|fmIt|8 z3+|l)HG74@P)bz-rpJY4w1aNJz|J_QSA=f@PO-p*;)&P2kOE(QTZ^w^*5JD~dqht! z=d8u9A?zAA#E!RW2C-9c9d@z2H-?>38!{Kx=A_A>)uFl%R-B*$kB0F{HoI;t`7L=(4o#DV+w)bkI$#FWQ>oh`>f-fRcWNb zGA8-2+50sz|BfXF37mwi0KpLhc7z^@Wx!Ug2utobkU5rfBEkgp=ILM2Yez~hRCrel zqs5i=MvE(Scj^;3VUE$_3S$NfMWe+8FDodc#Uzy9j1~h0zl;_G)QlGM(riR4;IcwC z>!>c4FZ{@?^YUR=l1#HMQQ%P0o^?7&XVEeMQ7Hqm3&An9_(j@=(-sz(b#?hz)0|~{ z9^XBF^DO)F_%L5&u$u}TO2%h(Br!${cDoD+w%Kq{2EjI?3j}5z_n-uO=d3eR5%>5V zv+T7KhrJntZ6+BGC6lwxY$zyNu(@j*(+IZNg3uSiHnR-`W}TT@IN)xZWgDH;_xL@t z?4Mh{V6g23;h|*rESu&jwtGu3K*r2w(n?zf?v}d~~Cd(HbJX8=>!2YgT;T?>Lc6kS5 zqFvtNV%85f%^0hWdG-$K(a7vDx(Z_VBX@81w00$#Nazbf%KKcjOP!t65d$Ku`_j24 zXvT&ST@9N@74%LeV;i|R5Go~>ReA?P?aWqf;6P|RM`{N`c^|5OAXInY;Eg>O#4dGl zZi*xvA$=VOLMvb6fl!$mQDLSWs{^;oM37FJYU}?TIB54Pt6H*(4j7jQLh0UECf6}P z-OA+1gsxU{RBf0}S1>y9#0gA+igXUva%xR+wMeU-k}a45+bHLHrs%{7K$C(g2~1%R zlf)dic&$^i)vu8$dc35^l(@O5${si-TQ#n*Q>fS^_AIir=wStiZPxL?jyiIp_V=1# zuxB8_(8XO73@V=^XSTB_32`=Hv!=85s3W_DQ9|rc;`JvOdq*7yM2Vx0CQ5XY1*55) zHAfwLP_2y_RL-Qw#B`|T*~QmryGj)WnS2omkrt0S4mQ~|BpLG0QOCi9j#3qV{Xs{` zRngWYQ?Kt3HRcZ_e)W>b?+&VfogW1EF|YqP~c$0(rG1P2{oP5s7!_mV)8yY4zw zPfO*D{W_(q9lH4fWN6}9i6hVt8RkypJJ%$Qb%G1zy}^;piRT2 zN!@nSs90{6PZSO-tYyyjVUgsAbdX^KEO9XYc^(+{p$8>*3?+Xr*dB^)eb0bN4Kuy0i zgZ7i0;t%b!&dK?m!t9NO&BMlzXTIjv@8m+MdAtC-=0C-61x zn*B+9yf96=$MNyZJw9E+=Oqk$kK*I`UVJAIk5zlW>Whyhw_n_*ldh{ZGdP>jPWRJQ z>qRYMpOfO{{3`>4o!!H7c64Xt)VkaQWaqB?COJdhqjDPEH_K^vXXUiI_sSXV-X~|I zd%v8??wp+M-CWMr?%i@Gy7w@saIQPA&@J7!$f-`nd&&`kX zd*?d%clY53(%(Pde3td`gp~KqZ{YXd`PQ@HAd{X;?D1@*K&`topabgw4N%O@*l-v$NXhNiFeBvNBIHE(-PhCI z5!t)R^dK~dD-WrRcvW_sXt64=D1FePIazRD(k6O3F8aS*XB}?dIAjm<8X{D|odR`V z!b9xbG&KH3GU-({GJ8}i%|utB$7AFZ(K*dGhH~d=g)bruS=hzJ_PQ>zWg%qwbC}l& zD4_G*-Ez)!Zop zg8R>WceC8jc`Tyf{v+QVmHU#%qzdk5eYYd`Gh6|b`?o#K8uvwyzEcIWsL@{ZbN;*ZO_#cmjX46oLWuy+!u=3)K|s^2h7h?hKzP&H&7 zT~d6Gez1iGYgryn)RC&i-OUU^!^>$w`(;oGkS6~XF0uGYLy9#iWBUH@>q}LZ)6cgq z#!6zSEA&F^8~j_LOwqj#C*#abF<$re>%@n3P=6;F{Wp=fU++0BhyhZpeNO9PnLYn} z9NH8D`#Z0s|0Y=SbrgZJ)yIZR^9FYO#R`ZWeQ&9oKtD)x44WP?&4G?VM?`fYtsoV{ zbp<+uu$lYcs5u2rgiQoO3_KEUAut&O$HOFni5NH*wi6hSfw{1a06l{M%!aK5+A(mX zxFm014u%Q76opQ6q*epodj7I!tl61NE{6Jk_s8hv_Pal7zkkGjKWe`}V84IZem`Qr zm+kk%_WP{;Vuh2um+bc$`~9H(e!zZL?e|qw?SA(a`~7YE{j&Z3mi_*w{eH=QU$Ni+ zY`?!@zyHa8zi7Yz(SCp3et*q=U-su-`;S!u*h5#zky+WxfRomP?v#5FqhmO9tlQ)s z>28-pe+%w7&&6Jv-r4%KW3gMK)3#1p2G2-LUk+T0O*540otiK#% zZwy@FtpSaOxn0DI&P>(qa*TOdrQ&jodE@06^Tx|D4Li?{1^9SNkc@UY#)3>e1<5YQ z3`W@Hn866U95WbUmtzJa>~hRtgk6pqjIhfwgAsN)W-!7o#|%c;<(R<;yBsqZVV7eD zBkXd_V1!+c8H}*YF@q6yIc6}zF2@W;*yWhP2)i6J7-5%V1|#fp%wU9Fjv0)w%Q1ry zb~$D+!Y;=QM%d+;!3bTBq24Wut>+_Z1WU1ulsi%`l^0`_4Qq^CyTBq87h^C*p~ax$VvO!6 zmTSBfUAxfeD2geT23h*h)rv7KMro0LIE?8YV6_lned}F}(YNF^zNI($Hm1caXi<}( zyJ%|ZE#9CgF2)E8U7_va!LMFHt(}!E?AQY6Ig#Y0V4v8h z=zU_zmCZHQ{IpOiuCUaqW|+(Y&R{QPBfwMbCizz+KzyWtBl#u;|d5yz5QG1 zVYRkP9aLkzfYUn-Cl;J3w#2z*cnIsNmTFN8ilEM_dFLHKXP}055grM6(0{r0I2Z~y zE?71cgq9%)Q4s(#rsQ0r%D-IjiIwu3;KY-_-(Z}6tA~@eQ*Xql$~PRR-|XQek+~60 z)o(aXUlLB#VQl~-6LanPDSlAQlPFCl)k!JUjG)#?Q-VYzP064b#~mreSmsP6O*A{Q zsfqBm7d|dqMrlHATjNygk1{%p6sx^giuNw}YudZD5%eM|L7&{s+PjnqAlJ9~;U(6< z)C$+Pd0y?^7U!+!uh&3Z;0Kv%`=Yg)sh|}k9y|~wD}0& zHQW4poUF}%Lvgyk&9BGF+Wa>Zr|aANdYr7ye?xIv-{ytUb#2}-LQmbG&9h~>PMY3e zn~wmlYxB~G^dJnQJGX?+UN%an`XWj++=lxp0pVH!fvp0Az-EG#z;*+W9*dApMubj9 zFegedXY8FjLxg1}Lxklc1H-bAfq5A>f03SBqm3&xL*JR=i$XsQJlMV@&u)%UMPFz0o{ZFhTN0^Sszbg~GKR+JV!Z zUz~~Pa05=EMs#$6l@Mk{wPlAPScMKoXEr*=qVp&Ydxxu?ndFfe^LTWgh|Xz1*v{S# z88Yb#;?z=iKV!tM)9f>Ll`K!VCAzXuGRr(W6V2#1%<=5yE)kau-e% z9W-z`3ZN4n&R`?7VMk|5ka}R$5n_j51I#GRf*GY-VtO+n;`D*aPM0v^{}q2W_dN6D zPcL>!3KDZcENM%b++DEQ8`qGAzdloKnEq z4c9p0pz|C2#J6QQX<^3{cJn2%Wzc}HYRjNp{$@O`heY)H;IJ)-j^k^EN#Z*ADz-G* z#@7kkh|_z8BVj8(!|AILdowy+q;o3LS&4KuBAq&E0rs6p=Xj)ZBGNe-=?o>Ej~LY~ z2tEQ{+*`(X9N%UR*T{fxO}q}Q`Bt@N$cJ0(t(aMSllGF#5q#V2F_44!u>3^2X?$Dl zX^MULc>aR8DL_f-)uOcIJo>OaC@^$Q_Gm~Ahc?V;6``xy3T1pjWJrF+QU3x|z93SQ zz+?gE(e5re(_Jb`+uXOxIoRDJ=ke}sa*nX%j&l-=yg0K68qO04T97zxSLhUihI0%- z!#RzN;T%WCaLyoOIIasd(ONZ*tX1Q*b?QY-r_!VORGbNF0%ww%zzNg@&TeV~XNnrc zIYA9#>m13YAHg}#*f-V&_ki)KHn{(b?^p=1T5_d|z*;vxRRk9>@u?zYBw1#ZYwTES zi&_=IxdD7dMc@NnXc5cPA()_0tj+~pE@ChF3>BbQJ^XR0h+XwOH*&jT zb#iF6h+Sb3V6P(e`pQbg;Av`QN^z={r-_R^IfF0q=`_B`yHofgKcB!CIdKvnhUwwX zUVCiY3^ zqbB@@>TfVR5moi?E8uUK0yb59odPypyIujCvR$WuO@Dvm6fhTuZK!Gk)&0fnYhN+% zVhPuV*12P7%i88bU} zha34dR<}Jqb|YDz-|v1cebV+g<$sx%krV*%e)sD|fJ40d-G3|sz}oM=SOnN9+VB2T z5#SBs{q8r401u|@cmKHvuuZbxy;1~*6!=mRXe#iVMSugl``vF9fwlr)E&{^}{B{u- zQQ#{@fX&wZ?$si|2Jn8jT8SjEJG0+?pa^VG;DbeAqXN$qfpG;c6@g6(e5eR)R^Ztp zutk9n7l8={E*F8V3Vfsp@OJWk_lJwXb_IT*2*COM?xRKE76txD5n%Iz11Lp+Ek@3y z7?ZE*mPEel&p!F&xd*yqI?lXWQ{8g`@1Yj8t9iS&sychwSkU#CQC&WZaZ8=Ut&K`z z32xUBZ4x$GKUeiFomPK|L&;TOdG<@PMz_uOc}>yG^b(>I2I6bB24}Kn7MMLk%t`;-C^twrE>}Y>3Jsl zlel9F#q7m#G+!62%m!=xwyaa@r0MOIDueC@VVX14*ek7T-PQ~&H(B77ad$s>A4a=8 zLnN)(E@`UCu9j>2z&t z4Gxb8gMlpCK`b^^dCb_z#+F?d_Awe{0fmcQ$H@|{(lPNAw<2TLFpbHB7T*mG25+pi zhj!->BkC5LZHR{H9myx}ZpQ60YuG#WRPl?Bm$!B@&}?8i)lSAEpjCDFSWd-dDM=?w z9lEG$t5>>S!D^KvIM0tds^%{wQdYWq=sCHfhm>DPXaZ(A6%cmV{@U-q@W~{T%X6At z*5&-(d*M^VL3{L7vZLW3S79|A+$865=FT`LnLFb=!3-Sd6jN`U(@ec_&M@`HInUG^ zwW#NIaUP`w;^+}ooX4a(G@a-2w_vi3Ert)tImu`eXO#jxC$O5N48kvUdVs+vbns z_*l9k4q^g_?(ntoF{{L<{e4syz6w4rDB}};_I9UH$h2IanU5E5cam`Ji=Os&r?GwT zMNfOX)7a0ny!WD~z1?ZmF!-XUz1?ZmG5DgVz1?Zm!nC~iqNlyxY1OmJWF5>_g_*tH zY1Pz!(bHZf{f58jd1aHwau+=0ZZ*sAIMZfM2hV}b48`gc z(S~L0nav5lKqxIrtQ1yk5{u_nwqqfea#=K&VMCr-EE1+gk$UwG<2fza-O1W9Ff79$ zp&0|?IA+xbWbPF)H6!M}l9>AqBW#d1%-oQQWCV7=?SsgExmf{C)?M^UP_vxB*S>G$}zi!9H%rxca>h+ z-5IU?fV;I!yT@=^TT49sSLAC%smX)~yo(lV3Ia#Ws7ftjkG@Kb-vYiNnyQV)TM3W% z@JXU6AL2%%A=z~XOUKqoi%hmyx!Bs_E|o7TQr3q+CK^y`i5*yZ(bcJXA>*|kvqtn4 zOF~piwDi>%0t~|FD}ZD|Y6S&pHeY2Z39Ix)K2%@Nd{Vs-z*#+|Z>u7tFJQz_t73pkA^`D<%U zBtdMfwV|TcWH2i7&l~?@W3Cl&ng!gUq8yH96nvo-MSd16jOKv^iz3Y469&6fPu89| z3s`#VJpmYwS}+=*l^Ni^R$sZPP8YQaDRspKk!@rqTBN-GWRDqFO9+=|&>o3?_lYtWCZ z>7n0OC`m*=Ezyq#ZX^2r9->v0Un&`yx)qMF!+L~_Q@i3{#h5+Fc}7-cZ_zKEW?Hbe zR6O1?mf2-es;oEpt=dpD@(&7NHto(j261RJr`O9&;JGHs?&Woo9)7|H=FnhUGS zv{@yZ)nYgV1T$?`DY*?DXBy#8)gaG1F!Y_<$$VW*Xa; zC01nGERCkk7(ODdF=t{d^=8^kqhgQ6bs6OmjIzv{a5d9r3^C~))|4qbJ<5h@voxAE z+hCbx;{|K!JSDugAl2R0m;;}N9fo z!C9uwc9>7K#;jz3chs7XwT8KL(ozR$tb@tc-)qE&-(O_aAubj@$Ml}L7#G8m{2B+} zSg*j(GK>9ce$S;j{*#;NQW(oHF#(z40szPS48Zljsr1`dO?7>~buqEzD|62ouz$kIQ}lo)vx#5+quwK?>ZaJ@#^AoXd#rp^Gf<%$bkQ% z6<)UY*hI?~AKU%8W>Y~7C?D>ekRJfa^KDo_s(qS83EoH_X1m~)*+S{0Xv__LXN>OY#~S3ZTw9G8FQQ%Qb1p4MORyu+HzMYDM%mU4>c zma+Kd+>ArJ$u}{Bf;C@fhTgz@jT!Z2rqNK_59^R`NG(%{z9Td4vFMwgaVMg0YQ`Oh z%(-PH4G}&*;InA1IN-BfE+6ox0v4*cliYgNLs{?zO6D_^%x5T>FQTM$fDSPSB?3lq zU@;wiV8)V=u<-m0LOm}0EcFTDY`(`thY{LpfX06Jv8}DDV^O#D_JVt=iOz;hC!Ld$ znE}g>#=ZT{u_d8*pq#Bs^K7D}6mVEkUFz(NME+J?Z^@=Q%BEL+Z8_aSZR40K{H-iO zGfDv@YwZ*T09}Kyq5vnuVOEGsK_g34bVD~B6Se2-j1So{anHF1mi4T~yY3nrSqxOj zoby?y6$lkJvMP$AYPe{-c2A&Av4cj4zAiShbZ5)p(xI~S9W94x_vai)=mJ;9b_eV6 zteLaUmiul)xSEkLF)F?qE3RZmnffXjs;zPeS5um?n$+YNLiI&q45iLkE(1@#%x(?QYaO6>Uz>GVH4>2YpYYk*^ z@<}37v!{zfBJm)fbqHDvE^Je!18j793)JKY5iJ-^jx`3ddQgp(2368;wW3^w#jDq- zq5`(Kp7fGO16gZphJBsPgXmfVSxy)a7|6oZ6Sk&cUm;Rr=<6|%B^FRM?xt0vU72%m zYM^Q$-l|5!Dys`sfo@7kYI!KV(Q3ViQ6sXO@=uCl)$=?v7$eWz*dl@lbRJftdP98Do%Xj(>51*5+fRBv5s{Xu)UTfN(HDLOPZR=`lv^l^k6XCdDKJ;WE# z+2eIleH*owQP@La}q^Pv*h2&UF&BPYXWKpYySh>(DKLz*BELxhJ2D%nnO)| z)mmMfe(G{5SqCU6Lt7=ZHEk|m|LJb8ZQ2`ty65Jfrs;QYlIy_QPkDVQ$3!t~D3Q4% zb#Jn~YO(dPifi4l^n=Mwi#W9Q)AdELjSPCNa|nUe0{S7JUe22cqW0JkMAZ#~e6g#B z`q@A86aPvUbTK%P#-y~(ByXP15J;}#@rU{5<+p9`S{EZB7Gu4{ZlCi8`mM-cNLtU2 zCu0}AOo_dOBCfI#Pq(Gxnbmw|iEXZGeq^b;A$MJ0)+fl6MYNaSHtYlEw3pbD;IHQ2@FRr+tk&3Bt1f=Z1H z;AWz(TqgN$sqbctw)7kGv|H14NRB=;Vh0oGAC7rl*2)80-|2ZO-w45u(mA&4RCbv^yc6OfX)vQGqnK8HyE==ijUsunxsPw8qldK7f&s0{ z5*D-&7pr8YPtQv!t)?=<$DLo_Wt%KdmxSv^*y6ey`Nz@)rL1dVYI@xfh^IE;e#^)Y zBRc0!f5NqIvJK~}Y`%Ag1+JxT)Yny|_u@s5gCn^qbVtAlI_2I z=Tk-mK-5Ge^+rySShdsYjv}A6ZYQ6VD5|;rf?Lkt^zbmx<66F~rJVYLq_q%IPQvF$ zPcP-K{%JG1nCVgLyrBkXO`(==e+b6c9vE)vV9h)5V-nEpHzF)*fY^SA$|chZbGl{A zAXt_z7+Z5fzw?gB=9a#Usb-pDxK}E)=`fAr51r+tFE+MRQD?VP7szkE+F)0BL$^^h zWTq(B`C?nu<#(u|d41d2;GuE!Y@RYh@}aYx$j`auk#1$Y_!}7?t&NO~jMo%Ss_FRn z(6}ETM@y=~h*u-^k@40zX;3&m{}uP(@KAdrlCw9R>uv_CcGb}Dp%anlNMVdLocfAw z)!H@_Ne&Lfq4w6nz(g6iiVAISDMJ_sZf`CF4D8#R%77q@mjTNJHuao+=DhLncB;OX zH_pMcSKw(2hM`aLaJGvP5-`p-pFoEp5gggm+n}4D7k8fH_%Tu*Ivh!Hyn!(KZuHe= z78W@g5KRv#?}=d!0nxoafQ!^V1?|`z$P-!;W4#U3;F=QDGo#ljp?)@>E+E(64L+M$ zSq1WtX+jy>iBPfr!`6oBMQ)%nkvI-Dc1hb1pTGDm(kk;H`2KA3Oge{NkW{Dza89X1 zw{I~YP)zCw5ZJJbrJwCOs{efuy6`%T!8%2A|@3XcTLyLZu^ z>-^h5kAQg!&}hTsu=#``sMWX)?u+JfOuOL0V!kX2x zQ7jptV?$xiVHD0kz*X^Rv%zwLBZJ_W&WD!qNfsC+lQB8D^9oIpnjA$#03S=BKL5Z6 zFEy6W=Bv0*pG85B>Y&u9(qf??PnnR@_mt%ppptD?oF${itTYr3G}e~sr$E~4QB}#; z#kWxdP1J;kBS0#=cEV|RxJ|EBR~11p)dt%Qa@?M$!5-|p)Ykh(nTp7(d%vdUd z5ZT%TFRk??WvDDH5g^6B&HQt;CwC3Q3Q%`Iq+S9fOFC$P#%xpeumI>aDows28xWAR9^9L_KpT9cFGa~#xR9V4l3Ec6)9dpIsLWPc> ziB%Et@>_m{G1)hDosI1Cxg~l`7mCB9`B!wl#|7I((Rl8|>=|k+N`Eikf9dCe(`x;o zGMLPbqA-#<>*^W*xwlKYwGKxu@xNh`uU@1L|9tx3u)P~XvQb9MFv08K;HpQLf-Rxi zQw*G>S@T4-!G!9C^qslBtj>|}#q^==0yvnFsVbk_PvzGvV+p1QH%|*lt9q>C)%({M zOy!Y(!&BIVGnK9oXq5ST;L8X)3IJNgCSbq)a_poZR5Xvr%{X#Fb&J!4) z;%Ne~jjyuSj9r5K)1=K;d9%BnyZqz6)80ml@~}~dhp(Z4QH_J~*XqQ-$o=S~AD>_0 zM1N%3U#D2yZHu)7g7Zzvom)#Px z%}xyr^OrU*bvL3c8S=7dw6lwn?{1LtWS+qxJlf(Y4fZTc9~y17vI>J@j^}teTR!wW z6ZNp=`6o4sleR{dqaQO(Jiyu*qsh5MXAB5cUpgqiJ~{n&kGJR) z4QW(kB)vh6^^eYaaYg7Y# zKAvrlpF73p<5Upwj!UJ~rOS5MYfKi`$hZ$8*6t=wQct=L?>!UO$@UN@@g{D92b+nT z$TH%%BMUQ_YLG#s?xMof+_EivlsFPQ%@fnf|Igmr0LWF|oq)MAYqYgDump+tn5Dr#C$V?|9{ zv{4aL4L;GLrWQ5!K}Ab<{-5vf+&eq7v%#Ps|2|6Cx#ym9?s@sWpWk_lx)s|^tSFDz z6Dv{F9?ekf3}QuO#P(OptRtSO*qOwNo`_vm>5WQJk79d>T}G_YVpN&SYlL;z8}(eT zgqElr%_PL=If|kggia*HzEVQ-2^}6yC)7)5E`uEZZ6!L25Iu>GjE*2wA~YwOMTq{g z6Y5Yx5*}b*lnQ-Asnnaq6)G^c;HGXs{+{;O2QIj&xe^gZWQQuQ+h8tPVAM2Aago7X zOix@dFek3pU@q<^Zay$4Zoa`>Y)ssV0GqfIE3>IX{7PIuKqU?+64&qJ1U%xF8LXB; zJ#(X8dZbV}iU{=+njIZZNVMglAtLn95Vd+}h^##{*wf5DY{8i^FZ-|s-2x%@{u07? zh_`U8nRa@#lrSse5e~!)Kw3_3b2Iz8%DsB-?J9Hm;M~l%5(LC^cUPGU|K?`4mRKpz zb5~dS7(KU?STfIZXBYPh@Z4Nt?L5yNU1cuuo158KVi7&h?OkQA_nVv9P+~Pb&uv}h zd3uhNSl`ZbYgd_T0q15O>*91ao?E)gTs$~8v%iaF_Zd9cg!I0%v&?;el;2tAc0bDR zD$mh#duN%8`6$1u%$10g-&y8vKg#baAF1co&N8?DQGRFnC_T4ymbrwF@;l2FJvVoj zx$}?yca{&=b7Ln*uJGL3$!>g}8#>GL_1xVFVt9^paxx3gU7h8!Z{My?^x*91IBpJJ zJem7Fqi8-q7A!~4;`U($VYk_fBP{UQ*I+o_ty>Ugvdo6eX>4Ax^B2z`whR%J(|F5W zmLYc;%TAva9U9H!dT}fMu&9sgL@hWgI+lCIt)@dst*>dG)pQsclUS>%&uW^*cJWzh zyw!AUTGK43bsL~3$Fm@yjq2s$(aE~WTD>e=sSV#-xw>U_| z4^cg7ZI;{mrQG7l?W(QEh<>wbt3=#?Tk+kq);4@^t+l&!1(#XufPeONT>9wSCMeD% zYGzuS<*uZClNj5f+PG+#zHL!$M@1)H$3^z~zQLP9cVr)uLqZfe`A+K!A)ye>M@zMpA*Yxv$;Yj>%tZ!@Fr=os$LwcN8TcQ;Yp zX>E;=kT~C^+PX~`Y*TGVL<_HrjtelWDmCX1v>VVG^ zB1#&qdK((soe&SqnSMJ%-*St3G_UrpftR=%Sd)$#o6wT2NlTIss09G0F9P}&W$^NT zgPQ8a{0PB#2j>m3P@=@ZFy7lPnI8}i(D!D=dwGu>HTj7gH93zQHTj7gH93zQHTj7g zH93zQHTj7gH93zQHTj7gH93zQHTj7gH93zQHTj7gH93zQHTj7gH93zQMShwbP2{}E z(Lr`tHY#()nRgFMs!pvDP~$74V-Ruq%@ew2JYHUxm}cV9rQb%+l^bT z4&(3X(Ge-fdh%=FxCUlG%&H&Uww`jGD0>|HSU>D0X{*Ed3|zqz)2s{4Y-E`YOvX5e zq1U_~;0t3M5L+XDIxt8d7O_46Uc-)AMX3TQ8t~H7Cm^v z)}5bEimvG@y6j1ibuS-0DXNxJ^hpu5?$LZwG~Le!plI1aQ1mjg{tg6O>L`?3zNxIe`0fpUA%faM+{U z9!;X)Xp=H^+R;SVFeaNozH2 zj7A;OyXc)vQtYWalpE6Ue95n3GvrCwvdSGw)|xvs&046-DxE;7a)*+&<_=A>mg=%f zos(7WP_owCp=s9cx~x*m(HCg38CF`>BS(nvi#ep5Q zd2ETX$7l7^=jn8VWfiu_Isvvc)9$m%c}=O~o!4o%N;WC)v&wl**745kG^;MWOiPvX znykVW4VVC1V_A__$|`J;bpmXSW$pD@YmV$>7A0+fCYRF&h;1oV*rL=4ur-!dTN21B zY>{;WY>j0VtCCgNBI^X$8q2y&OEA{zz)67R>q;HICHlKIaf3mXb(N=&EHU{cw18N&e!qh>0a8#1S-%$1E(X(!Je zQ%?fEC8bRCrMkzlFXVQXH2#7vD3y}Y?WfQ9n#xvs+ zgUpNer#6q!@CPgtgPJt_UBLPWFBY_}=cy43PX~?v|GCURcrmD@Ut^>ronR9N{5^M8S&Ox7@mFHyDi>c#J+m8!eM5n4XmhS$^?FNKlR%XIhivc(WKWHV`(4E2 z|Hf}6(jlkTKVb4<0ZnbBpfTlv(3pU#^A8wQP>NlQmjX;8NF(?^WZ8q$qDDYW1oehn zC+l~M{cg73jrP02en;&0G3Ho$!~OQV&wiQ730O)LvCpR%&%6d_hu*>=cJ$5QEvvWe zP^HzR@zxdfDj1+y}(NUweur|+e~oi z0cr4RQ4Vgdt>qA|(eTza%OP~LV$-^9uouR0@fk=gN1Jl6!>m?DUO75EC@n_^IfOzs z`&O&7hqMEW9PH$)vRg!yrDmpSS*2o^YF3xe$0GFj$Fy${pla7w);hF?XK5{4l;gr$kz-4oO`hyQ zwf8_zs7`dThUY=#9%2KH&(77Rzq#-s7AFXWYj_@1cJ`@QV*<<0o^?)N(B5^LZcmzS zPnsSK4T)a>ny;blU_P-g@<}E6gZ_eDh1QFXgZ_fehSrh7!G3{wGUQj-amR(`rAX5! zorYJ~g4@U)F-C_F40#G{xzTaqifkivn1w<@I)%(AYxa;Qx!LS^1w#%Bp0 zXlyLPxQ>8nnZ^=SQDXrGE1=XEIZ>%)_QlhE+flD) zVKCXn8HK|Yoz+DglR+*%MUz3rSL*1MEMr_3-$pcFU_}L$44d?AeEbD2fxtFr1&R_g z_6(W{8eXht^?>so# z!OlM@bCOJ-%a*6=En9})`&@zZ>Uk@aTbP#Oot2$j>n0LeH=JT+k%Rdn?u2WMWUL?Q zFp!3v03%{1s4-G&lDGkJxSkpoIV~||qw2WWc4Bi;$GBLn+QaA?7u!Ls+_|18>e|cN zJw(4ms;aC@(B4KiXCT|gCFDr}y3GlKi}tiPeW4>6*x%5cz(52Wi7nXU>wu`Sm5kXM zTg7&~lA)nghT{E2dOUP{VMbV_aUueG4?6X^WT&&0b1mN`8p8x?K`x7A9V}Al9d+bkuWRLv`2+3oA0-E&LpMWN7*pEE+ z=fJ0+q4$}=KBvR~5&NdVWP^zJe^1z-@3DV^$Nq`W4EDJI;g8sVCa~Y{vA@J)f7vsG z{pEkeeqxCJo_YU#kNuS%`xiem*njaKvH#3q|1yt#T^fqszv7v}{^~zs|Cz!5)gJq6 zJ@&7CX0Xq75P#JB&xGC|2|W65)N!yr_s}seVR%36T>yB2a5W5jM}XW5C0@)Oz@S-7 z4S|up&HN<8-b27C$(GIh1e$YJHmj8bEUh$i9dNFQWitl?t28Z}HHKp{ESvchIP<}> z;aN~k@?|&p599!t)ad)MA$nt!2IrF-qckkHGatu1Q5urrARqH8%5R;Kv%Wq`gK#(Y zksKJz=%nbC>w-C$^i@s^-1PO|%Qb~#zdlNSDJGTbqcoyt{-{0*u;C?dh?4VyiHZ7L zz!QIuIa_cl8r<8tUsP29KMoWTY!?x*EVtDNppuv4-!dh5svE2^Y(rAg{60hO2QNoFqR7X*c2!n928KPN$Y;r;}0>avQ5dU?<+wq##h|h%*u{ zdPh~4cT}}|N0m+_{q4MW6ZmgL8xxM;MIlUMrZgaW9EUgWo*eIV5{||Zi^u>UEI1q2 zMgaD?tCF1`ciGSX=>x5!pmxbq>0H62lUGTiz>ivRk9+t%hSazgN zKNA66zuEV9Z@?^R1M>=rzmw~i+2IDqoqW`t5c1&E$njvNzwHp~ zIN$?}30$y1ic2n<@)mIkGm+VdK7=tlN19?=CL$+rCZ-)?VrVGG*gq8=JASk1xbNUZ$IfQaasM+eI^_6< z+vK@6Wu&PM-r7A$7evdyg^yoHV2;C+N5%xm_UJjF_+ZgP%E!M?@lhwW>h#F21k(+A z#8i1rk35iIxnsD}S*J%#k=N;w-G~4I8a)C@njYCB>148;pAbV+LO|R5PL;oho@}34Xy=C-aa~TCcm(gx>8C=dV zrf}5{N%ID|tsaZR5Vm_cR1j%1r9mbQSEhJQY;Tr1s0tKxC1Gk!G>s!EGGK*i$${X; z?lW~mYFX-)8Xp!aSdZlCXSm`SJDS`qoJ_P0SC9&V-vn~XDj$|*AX$f zyZ-ZIpIWa|HSBz_Wz0l#zH&crAO6@|AAj2iKeqqdoHuX<@73G>e!~~u_N_mCFS#${ z{l9+jsek|A9shI3?Yv)1cUgE)5}d;lXWURr2@L6=OKL7K-`pFH1jW0a9aOmAfsNsz z?)l)%W>WNqMWF|aMD$>_h4!_Nlop0_$Tm+$Xx`5enq}T1Eqlvf!}>gyTMSkzaWH)M z;%e~5#liK9Py4ewD!@73kzdU!k4H+Ht{R1q-Vo|$mQJwxa@F0Gm7S-ji1?PN~T2x8*gU_M(`)g5? z(&F!{MNM9yUXzPWm|AZ@d#5Z2Ba6DX7Bw}wf+XHvi{k8jEyoGsdumbnh%Y5Z0WSrGPG!j^Ff(|qT^ z{rMbk5XAc}U7tnMhbz+;gy-`asVg~^Cx{;%OYI)6bT0^3`qYa#+k?Z;$5LkuS2zcl z%d_g61D7Q{D>rOq0z z%vum$?o+Se49OtgFqV4gaOKbi;T1l0HD`zf@y%nYhYeQ_TM(}HsaJDGT@Y^^OPxJj znY|#qnp8NYH(YCUy2+;xMVaABc>$|`=0ue^Y^LY?EFU)G5Py{#$?WjahgioBsl&s) zK4G#YOh%rj6t&$aOtFM12>q0I1y`GmYBI1xqNP2U2>w%_p>4LhEp)Ms-_!LYpPD4OeQkcZ*NRT0(ZXQlr4lK4F?AOdGBw zga$wRgvb)2;W6H4t+05hXbDA>RVo4Y_=KD#w4?u0PJO^9bXWrB zMNJ&+@(G=mfI(3c3itbjE=%YduGB=sPM=V+gwk-u1cbQmQJ*l=62>SR7V-%*EMbfh zkaj+y+Y-k32dU>1rdz@o+d;dN4J2htC?^!C$~X9g*_JRyxNwS3ILs2p=p6?035Qz3 z7@NSCzVca?FveZ5vrp);gp?^o{+VX-zt@*Op8U7_=w|Z2$0szC|2Ch{O#XNIgl6*J z>JysD|2Ch{O#WMZLNoc_;uD(5f3r_$CjU)7p_%+Q`h;fkf5ay=lg&P#&`dTD`-En) z+3ORU$!3pFXlAk9KB1Y#9`FgxEVj!hG_%77Q4?UG_%+apU})=H%>VK z`E#y;L`5_CKkkcaCjZBLLNob4>JysDf4@&?CjV?R`QPK)GoJjn`RHcyzsn~ylmAwq z&`kcf`GjWj-{KRR$^RCg&`kcDeL^$&Z}JJv>l2!By~igsGt54p(2VOxd_ps>_xprqTtDg)8gVT`+wBvYneqXj(9D#( zd_pr*-tQBdnR2I3Xx2&h`GjVs+~E_Nnetwr(9D$EeL^!+-s2ORnR1&?Xkk}rRa-T2(U-*OxILRk8^Y?C_Fo8ty2@}W=pU^B39`*^%5@DZDXqE_%_=HA@ zAo9;Qlm9K#CMJI$-Hhwod_ps>xB7%;T;JsrnsL3&Cp6>w9-q*R>+L?F8Q1svgl1gt z@CnVhzRxE#<9er0XvX#ZKA{=cyL>`3t{?CT&A8s}6Pj_o$0s!7daqAt#`VKKp%K^O zi_JcvS%7Ww3C#j*qfclSU^n}OW&yUrCo~JN8+}5v02}cM%>wLkPqWPe>@lCvEWjT1 z3C#j*zfTx1z$$T}nfxE|?aAW#!T(W7J#hPcbgc*+BRIo=>VBUvL2G=%1nu_;6ZF_8 zOaPFmoZgm+{cM0@x6f4LxpA4~Ys4SzGu1eDTqe0I@lg9rHGUtLNghvp);?2BT8zsi zrztzce5RVL8J9_Z*C4*nXR1l6ahc@0MQ{2{H90pflf1t{e6P<`lak{y$$^Z{_L*uj zc3dX;pxgKd<*?_!4IIev&0?SkLMA3h%o1W+`3DgZ(@G2z7EIU`BB+O$0x>0GxWAL_ zJc`K^!)yi{!MFp;Vp@pl#ea^AFSX+ddzhd^UYsjYl;$RJ{?AQ~_ z5iy$6YO##$Dz}VUQ$le@qJo?Cfx3o>^W4wSQTP|g@$xC510$2eF=3OE8U^PDSP!rKVo({|^4>AC#s zP@}BY5-?wvh3@GqPu*_R!ZQ<}dX{$J>C7XRZm>Hva&trO$JC?1q68i#ZP1*{hP^H( z;|N3?QO>+y)Ws>(dUkTaxsIpk;QVtv+c}ZlGS2tKoTy@$X;ZmYQg2$)GOo!=OaK$c`yjy9 zQZG#8ffL3X!M=8J3PfSNoi|O#3Q(LFQI|8#^JG$g0}5b)rx~Fk{H$r&twE4uHa4Db zTXuWHd6mo=Tw6Mai*l2Lu^vt~{_=#gY~wHBhz5$#UAD}oW!p2nIo&g?#hdA#;ro(L zdGcw__6$?ken1&$2JDec#reFMSa~&X>+?FF7riJVj=%2)iZkITaM2I>yFRyR2A7-% zTt`(7IoVNQ+stJCKKdvvRgU$c(Hxyo4CUX{iXnMZ*PkG<7T{`iAn4B0NF_tYIPY-ii z@L0)M$FjN))*6$c@~k>X^0uJXJEBx)Z^#myfJe@k+H+Q0dn%0=-XSMfh4p{4fG_x)S)(L??%`G{P6^o<#SaRXqq z`dln`erSyikOauoI7^>dP2*j-*7tCJkLtH9*wGV0K z1pDL-yX6e!GMx^uKqI!lKAZAN4j9EOcL8sqZL)_rjR~M(GAG;X`FiI`I<)!A{QCR> zbKkYC_M~iFgc{-b&P7R%9-Rab7Atl?aRZjZ*p78JlH^D{jsuVPx&hh>Rf=KZaw4gn zVEYiBu(SGY%eg~h9?1;QS12Pi9_Ivt zO^6e_!Z*H`i;_i2XY>r{OGHZ~nR_40RKf&6=_`>so;rmN1+!L#YhURy$AsHr5rshE zEFV{}B_)bO<)XqAI&oq6K=R4_h2i~4uy-N6;WI=F;R5(9H`iUe(CIK|LRT+zTA)nm z3X!XYMuLT$e`4K67y+dOIHg?die)h@8k;y*Jcl2(RZ4v?)52J6@h+Z36GA2~Kpt8c z2pDh_KcAp%2o`j060uXj#u>$%!Z6D{)Zk+mAVM&3PjyS!Z#a;a5>g7Bya0)F?8B}u zU2jhFdPCO1EHh*Rg%HZMXtcS%7LhmzcfPWsmn*HhL^6lv5ogzwb*Xmi9p_~GGa}(A z{&Hs=AbsH>aZ0a_l7Rnp>7)pOy16=C`R-Rfw8@&vSZ3?Am`-#W=>uEmZznNuiaSCU z-~u1Ifqb5ncbGcXjya{=*lpY`#ZyE~$DAdqigltzyuM4abGF?!9W%r3V}L40PgGo~ zhd@N5TW5lttc#B+wmG6G75wl%M?Zz)4S`=J6%AJMbDY3hDk2=M8kRT+*mht?02Ss- zT{HEL;ly3{@%l4rxkTC6Q}9*SOc+5VvO>4T14nf(S30R9m?^=^Y6FTaic9lw9K;e9 zPn8xM*E6a?$VaL*6Bh?cFW}N^YRkmOV5CNa19UAz*MLCr@7u!`tajdutZp7_l*BV2 zq5%5TH8aYWGhS^Lt)E=au3mEdO`<=eBFeCm2#!Pna7#QbC7~BhMVmO9hBAOvD=lxe zvR$RcW7lJ_CQ@7boQrj$2zGx4PT*?^0MlBep&}^(j3>`-DJ;ecV>zRwTr$DkMjq{x zLWmf;BqubGmZ@^4dZaa!pt}4&^2=xeb0(tlYL+U;VhGC)Du=_R*(AGUlz=#s$6`9P zalx2Q)X^g22_q2W=?vci4(KzM<6e6TtTIP^ zPnhv~Y@>O31Ta)VCGA2medY_y8IoC7S8-n6G78n5E?T5#L8MaVG9TO+EJT1<>}G-| z_}~_Tr}*Gjf=eh4$?$#t~qW2Bu??xVgnl#JoPlL@ZE72BeAG$RHyH zQ3PPU;p8bTAI}kdh&G_NE7YwY?w*AWJ*`NT_(oBLwU(w>CA`jYF&tEUZ{$&gWFw^u~G{V<5iO+Fcg-BFnbcZ%0jh!y{e!g&?_6S zOb;Lxr>VWf8i8TqvNBi%mh+^A0Fz#IbLbZ#?5bHlMB!6?h(?f|do&o3@tDtmjK_%# z$aq8=kcqe=YU~u%X-EehYD5QRYCy+YN2^T+v4|`uGX!apj~^E08II-=HWZ-^fkO>I z4~veJFU8Qj1V&{ITcL`wF^rK$))Uvp89K_yh>W3iOS~yNP|g8wPi`0JiUVq5ti=jq6Wxj0$auA(p$VsJHmVJ&3?h5W*&^SfECSFQfPB;P;(fHfnABU} zXgS!|pS|V9zuAdiN|40GQZ?a^;*=F(dQ+?xc%b>-I_s^}lp5gs7#4rf7Idr^ZqR}+ z=Eyk>{Q+9$stP}=2MLC22jXzBW?3Y9lZ!o+7icOkKjcO0Sl+085K^OaoNOgcsIvQI zl!a)LWW3rU|H?VVs9oyHOqPu^tYbcJ6tJBjgkP|z^@aM+Iel`e72=HCTm@AR{1k4b z1n5H8Bory0rQ%fVPxTs?2RQpYGY_0c-1G*7ue>su&!BrsT@`-38!q8dknHOf|? zI$!8}gTbL)3CbK8XeJ;|Kjmt*d~%sWzy)+Eqor@mknkd?5!_sj%(SXBj2Xe% z8~!xj7{S?_iFN0{d}r-ThL1_A@-non`;uX&y_p)2tx269uYJjIvhGWUnsr|?3?2Kj zy<8B@N_yte`4rR38s1Ps)OM@RJA(_+yb=O)MwVIGBuSi)F}hw}?g$y0D`g(dX*+|% z00q`ii{PahI*cu&4j-9VGZv}b%1Pc$8Xe5TPH4lPr6>oiwa_191_{*QnCV(fTh4$A-ppyP1tua;$U_A3g9t>DnFyrG2*C&=z=k1C<6k~3z1XDIL|+t3 zV||2j`u90vf`Ds!6oB%`qwzPl%^RQU25#8cd$@b6lSy68yZJu zG>+3S9!F>CB~o)a2p$C#7LS!Cr}zpcXl-1Ys4`(buuo%9L@6&Rz9SQ46EAAgvN%{q z?*cg=C@-F_H?yT---xD*^Q*qXQXfN>@N6<<^c5h-Z;Pg6sHwwPKT(XGWy#iMq49(C zjiHm~G|Xqj7XWyZhM}?dfm0tv-se^`;k+G&mT9Yc@6uMe(g1~KmtlZ22ePb#7BEFB zdjP*NMbZ?Fq^!iKWsp){?QJJt#9t?kQn!*;d*`$@;*pHTF6ss)sT<{Rf+lUmJOMVf zCi(VIzuE(k4$vOP8Ds5{)TavEEQ9gi?xB+o(=}(tO7WM0A+gRE;1MXQuz|Pql5OPz zfQiOqfJvuQZO9;#x4F1tMc=(nO=KK6d_I^r6r0mbE4i%duAd_c*twW z%rbjRGIvRv5I_W`;}Xx=P1)7*k!9-p0jm6Ar-L3+bqsW;HAH}hH2 ziMj4F@0XX)06&0tqC*9G#~EPXKn8li~Mp3;CAkGh72$ur;$)ykikb zHHoM+8pN|SFUkpYF1|&MW#~eK?D_bWjiJc}&v;eBjIe*@*Xss3WMZU2h@N z^%lZVmKf%X6BoJ@Jy>*xz4@NA0uqV-Ay9fxv>?9M+%h;{WC^tS{25cye*OUWB;Cdq zx$h*Nnnyri=8DDtE1m2|HcYR@lWZEJPCed#l4kWgT>K?Ob`i`#={8)DLvGI^PsTy~ z-=;=__$x)TYd}T(bsxk4veZtVU79zb9b?)zEuKUyuP#I@cj<*f|IU+21*QVxEJ>(> zR(PKrNZt6>N8QOl$y9e75s^`{Q?g<)$E2R)|M_*GY^Y8SM}|D)b=5xE$Q6%7CeYO& z?4PJD>Z+u6@qWo?4;u}K*OL(2NyPV^gmqpU=RG+nSm!mr={uZxDmpB?ylbEc43bX6 zRcWU)X{RUAa{-jm$y% zn)Cq8;r%-ZhDC0x6iKZg)K0G=9&`gig=o$q-DHm?CsKLu*58I)$Z;5`1kK5fuM33|bPJl)~pEFvj|I{9Y#oIun++w&9la2*@QJ&xi>y!?Zizp#foj#2;EgywAiA?G9_q zjaW!|A1aYO!4RdE$~JPEld^x#I)kh<~v@8SetI^a3m(g-T|?jgwW8V#B!$&h@~{S62LzIUgn}6lA%3g9#g@UB#3;n7(ep>7vf==J^zKmNv?2 ztm~|%gX%0qd!;K47NYO0{M@z9Y7Pp#)x}`t9;mNOhLu~#@al&-!mDJQzOrf1n2lS^ zQnbcw0xHY*YQFq~K`fY)w-tJdZ~@3d)?re$zUEWJJ{^5c#iPgTBA0WkPXW1 zMPf{hw)+v1i#ZQ~Vo^&B`;{zYOGJ}?H(Y4}zyjA5EVj&X1cSRKQ3A>Mh=`VGH>dr+Fr>vj;b+)00Jw#q^%?aZLt>) z3&}tfaVi6)dFhyBpyvQtP&swm^LFAw^w5-FQbZfdR%C6A3`IaEIK-?t>`%ak#Yo+N zEkh|XlP@h5t?twjrfC-0QoA^`9xv2n5!Ivy zqgW|g@bomynGgQ)8lRSKn4#t?J`EgJxRM66zz*6sUgyFmJy0OC2 zDI2}w{75|77P3*Ug=~~7+u1(RGPEc83HtR(d?Iacy7p*U#`Ab%RtGQK!|v6k0%zPQ z61k8p(vuhIa605w+R>UO@3(AOQ zTSHGU7gbss2u8La)+`bQa>^Z0h-LC!nYj4h1P%? zBL$IK4pI|@kU@uoysSyU0&QazTn#H4-lmytL}{Z~N&NLPF1=I1sL%TyQW_SiNUR*L zzIuNNzU1_yjf*_hOSbem8|RAf^^v3oAJH(CzMG7ife?&ZfKdVIQ+iQprVm_1Kx1&A z0s+YbMbIWm;>Ttvs&pxVVz097U8D%@BVf=;UhlRc1mrZLCByi#7)^KS)3hw!k2;v5 z$j8FCtZaE|=a-_@aOOE?$XK@ko`p&0NQfqN$NJ1BPpyeQYy#02~u6lVZ4THM7*P>)faT}w#J;=`0 zY5IO0-s8;Lc-QUWz!_SfN(u@O)fR8PJ=7nC#cznRuN?xbTJ*$MW|>Et=#@pm7u`0O zXszI5Rg_jxm(|o}CZ39FQDd`GUC8v>n^YURH6w!`j-kKxS>-Cz6p2<4@u~EIiTQ{% z-vJP@%4bzVp>g*etT#Z+IcaDH^0Yh(unX>@NBsF7g|!}G^~J0SqGVgjo8(8SfyBs8 zjiNW)2q*Zd*EW~KjwtIox4#JkmcV^o`nX%h6+?Y>fn&zx>xj4A&KO_qkVESYz*631 zlr`7h!C;L1EY-wIZUvA@J`X^zGkk|b8Vcp&9oBx~hmc%QF209u@kh5JM5@&?R(1{h z9T_#kGbaRL0qV;o)S(iI_9ZGKe-oEj-&)Zmm3m7jp)Hzz0NNtu31~|eSp#i(D0)*!fp#?G_7sqr5Mk~3Ey#?{)sdMT`!zC?4duyT*(N&CRlOrS9kMl^kTIT(+l8q} zzM7G}vn_@@j5&9X)%9$m>#`X3DQ4GlPp7pa%C5lys{MLEC_ZFh9nx`4Jj;xHtDA*a zsa%lxtbd6hK>E>-wUxYe3*msg$XmCNs^V9y=!BykvpX{=C|Ebh@9Z;r)_Qq_*g|Hp zB?XQ*cF@YoFg|o$nUZM~xw14X%O$$9VPUFDU;<1PXqJ*_qp2WqodbD6{T_rTC7?KF&+Fjtw#II=%;JzE(p>|n<6ohMBJV3s!kvCJxZH{a__T#zJld;Vx zN@B`k#&Qdhk&(9Oho!xGShGy}!>3+XsZv0ma!IRnTq{s+9eg_Anlh*HM#4rdgP5#= zcJm>2A#N59n=??dP$Nx~ImU1ROf1IVS(UKIjCu&6hyLOSfRm7~GEvlT0`1<_KnU&{ zQz8kYnZzoz>zkSiv3kw$pkAP5mWa1gFl8b8)J|bC5#*YkVip7MHn0{f+vM+I@+JQ4 zdTnbFi&6cxL--B7Nm2pEqFnVmVN%Tkv%bqNBaLShl*r_3O&}mMRZ5-A6dx#NOlBfQ zEoMw+x-psQkeLV!?)~MXF`22I7l{caY-ke&hMD=Wc+dt3L8uKO$i3$hf#eY*xlUsG_;gcc;;1p}6jhh@lm# z+p1+yaDr62F?gG-=LX_TEF9!Wp}kciq(*aM3QuixmPgRFkc8 zbtN{T4K!JDF6CO%E+E+xw8WXLz-^FNn}#wISnyzC*yyeilWs7evU|f*h9!MqC?7Go zUHe32DyW*&(^y!F1eT!;Z`iUejOqz9L7?WS4cNblH4OVt)Ra`bhG}skWQshFb<@~2 zBOj8=q}UA>P&;q_P`G$KtJ&il35;xEf@LJDSF*Cy9GA=0L-FoAzj3DyR$#*ALrJe5 z-kJnP=XSKld$+2p3R_&`-9AYFrQfpWcCF#i=^TpNAjV+QBpQybrCNeg z*{|zldmoKYqRE~gER|=r^2Q)141)W$VY1ffG zrLtx{`K1YJBppZ|Q6S?(Evv9mf?Y+t7KPRXwY12_VDTO+Jkpe=!ZyI8)B2a9HdlvQ z$}}_?kSdJEu_9|oWt^R;s*0nV)P8P{q#}cTV@UOmy{gn=JN+OR&!;jC*Nax~C*TQQ zZ;vJfn-L1Iy0T``z<0Ya<@_z%*?13O8SYdkXQ*Qx8|0;?1Cnd$KR1ojmH_S|)Prln zzBDccC4+G<^rp}0N6nte55#jwQ6ui7NgIted6Odn|5Q81KLmkORZ0?r1)`w0bW1CY zt?nFk=aRa)H=(KSbSMlO0O>NH550``$)H-8YRWLM)y zw42SBij$H@9kFpiz7IK)C>S#*A1YAieL|GUo)!J2-X}&m6MG1p_tiinS;2>SVOhmC zN;2))LgCH&GtEk~lvR18Ha(j`SLS_6-%LDs{Vpdg;-fyRDNb-BwQk-grc3B7Qq%iq ztnyj#QR;nCvDSBw&nE9v;!kUI3uq&GlHUy6dhe55i_o(_tOppR-Y4@ET7u5(NfL}? zjcYW|WsS=wUMI%p2{WQg6aHp7w0Q+l$#n=}60J7)$0Um!wpVTNPgN3{k?kmkCKz6b zO(7HrNe{MqN_gmD@J9~MR+ieZKb*jX%{~beHoGROnXr;DVhC09GZPC}jO}cE6q?>kY{Ck$w)8kz1X$gS zSs3VtF>V7HX8X5>b3^megc4vDX5%hO1*9Q}C(<;jN+C-(#v9Vn#poh&ImR52)=Cek z28&rx&|(gNMTxTeyhBt&f}C8~e(>vkk#K1uG=68|)J9hIR`8}S|1jdrdg9D^YN5u& zHH9>VA!z$kFw7EVG}0(K!OqZ1g@(-SlsIA1@x zBsIX1o@$WQbm0vVlLWf#!ORmpV@wmUAYj}y0iFnK1i`?V{7DFE8k3E?4#=qX1EbRs*UyTxq|fAU8Zs$SW8%6692sFbSizr;JHN zp%XGm!kVteD}k&qaAa&^lOtjsBuJ~ta7;&`4X|Y=;tv!#d-5{<>=Gqt!}+Wk+~N;u z6BFJ6!c6=D370A@iP%DTn>SquZ{!aVLLISN6Y7ZF3>V}1nh(%hB`jGLUGi-cU3&XT ziU^YMGgv8ICRE7#2MwK<+WzE(r*ZVF#3K_fA85d2yOG!LhC;82z z&UZ=6ae-^*s=;@uah@cQwumQ7UOyDryuR-2fl;%}z{C3VT3|=c=IqLa>NUDep9oK|FT@OBs~&OU`MHA!#q zoF|Wl9sFanJH@x=!j?C%xhD|v(4+FkW097u4UP@1Iu=Oo(YYDcd*I=ZP~>w&M7hPV zrT@>pv65LV7sklQj*(NYk7_T~&%5ha($3uC?3<$O;!`%^YcmF!|IF4cd9 z7m9FduRGjzxKw3RCM9#G;q@>~w)R@MX|cP20kS4~f;TF+c#thtX;avqy0YQzc^b*q zH70FH=8b8gk5}D|R!|!8SQXDMh4_wsmJU6?gEa*fH-Ez&fa-0(WC|Rt5tV}Ew6we( z?#4>SW~_twhF>y7EW|sUcZ;y8XW;HPm0MJn8ZOp^5DIr!@^3;I?7%79FhhY9q zGOjUcbs!44I3Wf7eZym@5jo6!k#ZMP!+He4%cGv(^>4iKv&EA#u6RdxX43lLx=?2~ZG-yT$k`^vKQBaZeY(=Uc>N0) zU z6K5=o3edMBJKQke>V?0vd&=#?b(=i*lTa&KfD!OIZ=m$N3g2(31WR1<-^*!9Tg2is z7Fgj>vprjJw5HM-f7i(c2Ks1%f0sg0PL|8sZG5p?)?*bRG7sgr1$~^Bye+;Jhf^(E zv8?vs6>E!k;e~0{rexSjZw>U5Rxj72_ELaqCqGvetP0a=v90!E*ShGyZ`) zqdXV>5E}g9o=IN_LKXrBWlq9W7%QR~@6z5eW>N;_M3 zS-l^xXCy>8$J#UdtimBF@oW8>FJPf6gyK#R31MWQQr%?QcD0dV3n$e;h`Ns%(p+81 zTunB>Dn`@vL5=1#T^L_F6o1j?(RIGAjd@^ek(fZ`&K8Sgq9RODG%=TCYK3JEluz@n z?R4&ckWk621O<1lsbqT2hN7qg@~=!`8yaq2;G;HFrutR@2MIPvdhl$#6(&N|3eVJ& z;H1`g_BE9jsvo{Pnp8RpLoyCLGe|w4Bj(Gz~*kQHWD?{RRJaV={56(xY2~8s-S(F^=jDOr9Yfv>ENAZO< z0J|k_T?1q!gE)2r+qKn1enBFyhJm*ZI2s8t0~5< zeBHXNhr)OcQbSTDq7RyhThCUf%OG6sHID!d(J2blP2==92V1}cDI@4`Z?lJ$*99F> zUcl)Pp5-v8>nSki^Mi+#;hvTPP1`y|``q%VvxnBW*n`A(t3y7J7RZ!8-!~%YM5234 zDnjC33%Ynd1x+4^Co^{?jL^R*^7n{a)5Z4MLEpsOX(#wip&j{8by=ghnZ_3 z^0<|0LYWGgxCp{y1R(8#l@qx-zrQ>k3{9`S-iieEv;w%JVxL2_3TTq6(ew{&LAZ)& zOr%c#fF$jt#IEAAaZFVMb{8;bt2LBWibLT?_8u!c%*@hs9K0nXu!}9d24c@%Ovrln zGNI=w%4_$Ew&VxzPFlS;eg!QI?v!ki5qzyyLu|Yy9H8}4!48f>D}Bj}5+s!}f(glTp4Ai%2(Gmhx?mQw(E~aLq7#`UmaqwlNK9KAVD-CC zgOUgFns^cdoECjx<5{NawyXvZ?ZsiguY3eNCJr4#1^RvV zc35Q`sa6EMb|8<0oSL8qB!WcatR-;GbB0bqElcZ+gsRgOU*qd!4E#G*8Ci|d0V}it zk}IzD_4R}E->r)g?vz-S3a{#AUI$H$>!qEK;NYJoxUs6U9&9QA(3PeGpS;hFRm7+@ zK|t+bS!E1LM=+mlNU#}W?QD>Xo@Q8?cDy1^iOV&Vs4K*rENN!7+T-I$Wl0XOmg2SApBJ{s1x5I@Z9yNZgxtm$Q2PEYHh zpb<_G=T-#?XkD%Fcz$S&!s~F=XK;3Nclnw%3mje5p-VXM136?gaCWzF9LW0w1HzjK zzcUHnO!zHH_(sAvsr@%{JQ*jnshrz`0d_BQ&|9EhtH~b?ZPqIVFtACQYu|b36n~rz z+LA?>?4XPHe-Lk?Lu*6R1aL%63fbD1#@jYYV%;Q%j)Z@*zO$(GmeSdkHe?3h=5&e` zKdT2NMH&zNQxhb=l8Ttmk=H)0sADYN$67_~NEAdd?>fv6Vbx50USQiGTD-zpyLOtG zKi{utk}Q-U9I^Asa%Lc*4#c#{`D8j%fWbiyE5@CJmd)uju@AYbDs_ zzm|hLLO>M8a8dl|2RTTI?+B8D7(hRqg9$?=gOq2^XHSjzP54(3E$aNu45WxOOm{67 zUjPfG{W8%xhI{T<^2A4jEY@(Ja1#}VrL#p|4rnwTl2$xH9RAlfyWnD2Jf(D6=t|Gx zcLYwc7HVU>4#7Zjz$2Vd@qV$jUxu7RVD>B7guII%hNo;tJeCs)c+32{-<)=sF7T@l z8BqwDtr{PI9aFFXN-}IwLk==3HfhBY(y&uF_Jt^BX3bZ}ca(7U$wrn3?%S-1xqKxk4uv+QHnhdnX9MY64k3}Knra3aDb3Mz!oDf z4+F_V92^2XB|u*$4};=ggdT7k8A)VK)o_x5KhjcX)ZE3|9v~C;8|0|!#t^lAo(Xm2 z7K_g^r4uw@lL)&}0+8Im*m#|sI`2%WWK`e1faDX2+lBTyQdCSC`Xf3hPiJ}XK+Z05 z<~(D)zCXG~Q&5xz8Po*rmT*kaZYG=x+Kq%$LA!x4g4RSVQdJGaw)A}y0JHH%e=4&; zvL{G3Wo>N|yn=q6F(xv79#qX!Fpe9LrOYtpP& zV;GkC+k%J?ALfhi4m`pz&@x>75kymXXN$G8hJBUPD5kt7r(ZLwu!t4#fIAaJ&gLGluoWN(s| zcd;U+QChw!NRN(zgry8YJY~dphn1E_v6=8BYXJe|-64WAEEP&8mriD`?cn!E3nf~v z=#MV}3|5wjTgseS{6RuB+hB9ZM!mHo@ou-%80{3wlpe8kQ+g~W=oeHFlSk;T11JX7 zW=1iUslQ}~^PHz(n@ z5Z;)CZz8;b&Ur*yqwG!v>c1U!5(RRcKHL!&-xhlA*gvkH-~a9U89oF31V$2j>YM$H zmw9!fVnUF7KLN@91SADGh`WSL8Cc*qXxeSEO17~?lka$@nwFS~tfo6!%VMzu=<0h; z3Z}}6kvciV#8cvm7bBzkG${fx*$9@#nB8884$(aWG;5d606Zi*WNzjP-K1cl%QSIl zp^G)qXCW>z==GryE<>2_gSsN&L?7fbgv>G@JYSQ9_7V3TL_Wl|37C{tU5>gV=|atT zv5}arnOT{UnO4vlv~*@8<8+vYk27R0F)_%NCk<&6#JS;GCLkivuViq~=7t*;VrKV(J>`*fR z+r2L88BWXO%Wfr!5UBXk09(41I}OLx+d(p3*QR8YL@j^L!pA|?P{tQ%f2*KXR2hN0Uj-o0FPEtfT)cgiE5}o z6a~6PW4|VzqoaCUHUT}s zUmz$p+T;B5k04_(KHeBBL^x$&C(}T;K{~y5R)i4h>Z_TJjXgxJUlC@6@S6)l0 zPrZP>j#8fvyXW^PUoU&Q@Ob&tg2yYK7Cf&0-;c-hpDsMEd|L2$@za9G7ys|aWB=2I zN6uV+8Z6gkPYWKGKTUY-lAlLvtG&Wn5?RB9!_+NQY1Oo{#j%yfyNW7yr=-QXT3pfG zt#bO+`-HOICsg!4p-%4;;^cbO(dK0lcPu7*GzD|-{=HNtGS7iAx&GFhxRpi`D#9-nldG4 z&4b#q67uhjE4;t;{&^=wQZyM`xMi1hx2| z?N};q9@7i;rWaTJur8+t17NIUD_WyjX|ssod{aF1J#{gfP@kE;qn16Hv1lW*yDri`(}m7jHfx`0@zC^I4x9QAVQ1^y*XD@VGy^N3aOm1+ zT5(h(eb8-j$Gt;DZfZpe(@(xAmosFS=?hxK>VHQ-b_i4Pdo^eQpNtP`uumH0pCRd57`z&LnJ~>){<{)qA_%XYtMqm)=<<-scYG zT??*xXP-l#JB)Ycy!76s_u0G?U@kag(`gp6DYg*MFw<2#8~Zh zbeveFRVW9zn&lMcp6eDk`tP&pTF=^=QgB0=6mklI2oC3Z7oBMw1;uGVA?BJgEfugp z`%GT_B&?6t+8$y~RaMC%(%L#xh+?igMVIVa=mgy&YN2_$CEP-DxLGWYir-8Y0_<{j zm2vzC*QK~}Ti73OxkXD=Sg^%PWmb0BzAqZ%>+lN;NmJI4)dTS{+QpEKi+Z%#eWPGr zhgoP1k!|PV=08|tJ|_(MyC`kltd`&r!9KBAdup_Mxh*Ckkbz1Cx@wBy7P5YoN5+&el8GAqcE%l1>(;?Yacsndx>N zifZ!@7n70*Eq&4#blYFB%2G}(_q4@#EyezH@twBHaoqg)wRfK2GNky0cVO}G zblDwowhn~n%;IBtws$A<^IB-TUibv|x*Cmh+cZ6o;F@@r-e3&^Y?hu)J;^M+g>07I zLN-fpA)BSQke{Wupr56;pr56;pv}@-$Y$v+6y@Nu2cn2SPH$fWmUN1;9yu++YH$j@^y0v$l91#2oCt`Qk)?ppHDregWOW}*03*}h|VyMX?*(WD=s>3<)!B=y~N%xTzcV!XRSET-Y+`u zoby(^;Ji!EB`!X5>7{3#w`A$XZpHF*FTF6n@Y0pbmY#Ki@?Cn~ij|jMxOAm`pXNPd z#RccaE8V$E&s2VLUFa^n==9Sm$)&|Ez2Jfs7u4R)KkM{!mM^{Z`AaWQ{S9TMap%S7 zIn}lFycHLnx$M#l;`5fQIM=PXXyy4At-N&cMQ5C`^ny!Qu2^yDh3Cf0ms>l}I&Z?H zv(7uiclN9^&x==Hbiq=4TfX$n`1DI^5b+Iir?0r+f{V^yxpc{;Nra%5_ENn+Ye_?6 z&y7#Fs+0aKy?EsX@uf@RmB^go!7H!6de!C8t5*#VzwA}3qQO$ju3NPx zdc_qlyYi~&%BwEF@)fIyue{=#HS1O#|D5MM>m;uAtE{>_4W4!0^W)`bExB}YeBsgs zC%9u>?^V~VUOm?hue$2;`eIgHy9g{pQCr%JUk&2Lr!QH0#+l2`I{TdE=bpFX{O4V8 z;mV7i|ALDzdEv`m{))?2z4BF8Tsbhf`qfvx=IWs}!)vcu_u6Y;_b2n8b^NnWc+P@_ zC!Tc7aoU7?kpG=ZzSI17i%ve}xye^92s7DSOTN(BR&4L+>?%!~JZ0)3)24UN@EK+P0?8lTJcGA7Vil5wm3J9 zKm8YwZ*|_e0^w_T7I`ZDh9piDdBKVmD-BN<#4Ar<2JzO&R3$j~iEA&Z-n8cH?$cKt zQtfIRaC3JAZu7p^Rqs7zOZDADU#YrJesA=ij%8J!+qrF9I!C|$Pj9Nezx%Cj{guyg zm$iS|-SN%;uKxA%kn|@c-FnW{cqXw)Kxs{lAnEawC($UQ+@qIM~@yh^#OOm zNXE_o>i>1GeO-U`_aO}i@T#7T^srR??uPKDlWz__{j)jM$By`XaM_-P?vu+; zt$u#-bKUXFZwtPA+w$u2=YFty&8f59^WN59T^Dz{TZbR4w!HaRcij&jt+u`St?q=G z|LC?qy4>CH*15rF9-UHs{hfbOefbSb-0Qya4)^?3hgCoDs`t8^FFC#X)9-&KIKB9B z_r?8xKKhfT_f~&2bV~Jz>Pgk5AN|DW$gYpMbu+IY&Ey}f{_Oa3s~7#t7ph zd2jF^^X_!(3qK7WeB?*&Be`$8XAL~J+Ol|8H5|CA`n(@aseW^CNA>h~{lrZwN4{ICzUBOv2g|?x zU+#;yu5rhHYqNXrF+Ur9@0Kg7A8mbn^zy47aGkk3+<*M^gVkB@dS9^W?QPZ3_n$F( z=C2-h7aw-KTe4_N^|Req1UD?cp}OPvi>if>y}5eium8ynpTEVu@drch`itM;Uby5- z?thlQ-_5G7b3?x#b&JnA*8SjH$GGob`wzjUCC9i8*Zm~;)ZiDYE1&a=>a*95R-gT; z+g&*6BX04^Ex|7r9p(;?pEJ7jkL;Oif9(N$BcCrrQH{lkN2y8qaAnftGw zE(lJ#nef;lEt^RuMMQ-z-9vxiv_%GbM-gVmOPj6x% zdEzau?~YGb|MI4f1#f)**WIT+_E)37zO%EsWayCUcmCnz>f-#*f~76X-1Bc)J-YCY zOWdnZ`1WYWw&~UT<_%PT`pz?}x7~bw^{?*^+_UHY(7o-{vU~GuUK0HMg-hMW;bYy) z-c_o0KRnYt>)*cThR*rX=;z+uUj4-U%c`9nGu_DNe>J-Fb0@nSk9gkb^#iB42lsy{ zxb5E;yRUulJa@zi?{cp=cc%NvE#IhqW5-v6vyNTqrp9xF1z%a={^^ZxAHDN6-POM< zA3yrxBmbp(-Y?g>uRio{chks6gGKXZxPLn89vHH(c^yb>Uy+Mwd+e zY_;?Lj|PW-{@>hj&;CkqW4HV8OU`sBy!0_Q`CT6v{lZrlSO50WuF+fPf6_hcx%)>y z@siKGFFo86?95H7{(0YztE)F<-3wRzxO&uS=T@I{!M_H7Ic;5a)xOEWi)Wthayu`s zmbbpS`p)kzbKzHes`GxnHQ4jxN!7!?e&y&}e)5nTIsfOQuNm!h-?{WN!T)LfnS1;4 z2db;Td`0!NYu@cPE}icVfA}?SNBMKrs~`N#=8r}1?_0=8uUyQ!% z@K3qVKXSW!%}c)G9{A-=!Fz7{YW2N8Y;*nR9qIn$SCmK^fM@HZI zpYz))xp&_1nd&#3o{dKV7CC+WS;C-W?|I`1j_Wtwo>VLmsuY2DsP96Q%{CBIDE&05=`5)d_edClL zR*xPTbtioLxudWAmu2oP`C|1SZu|cjI`2m+|2T@DPf}VG6)IFDX_+ljT2va+z&E=| zq(Ov4MoT53kjhpfDiIA8NyEs9%xnp%i0bqH-hbf!@Z9HfpL1U4oadH7?)WkI_6DNp zZyWtrmQELk4)TGDb%>Qc$nK1&L$lj-w$pnOZ3v&sUY?smTJ;-odR#vaxK72U!6#(d z_?Ihw*MUy52ZbLrqmeBim{qP4L3J_L9UKGkKOt0YUqZskaeR)~6MU5qq8a@Gq#rPp z_SzBpO@~5rjxvVG_F$;iG8k`Ez@hjDc&e8}uOnkedQsjwMb4B@DOC1<$OVRCN3M4cz3G!w3nCP{DCdfBX z$I?Z#q;eQ8x*MbO#0nHEKBDPe!zej$4=g5r#4E9DeBRbJa+-dbwGOVM$$q=o&a9Vo zJI@g=QW+h|{(FUIxTnXK{1kji@j05uA$$ z_~YNoqR*D1WZ)<__R4~Uh$`0+y(G{oA5pHp1@=x&d~e-bTK`v!h3Qq3It>Da_%@)mwjbzZwao8 zgU~oU44M;zm_BR37C#kkq+^~bVJNRqU_KQo*q*$dCgnzuYMVdbo4y7APTphJ(vIWT;7D{z zrQwXN50qqPK~455x$jp*%d_>kIQur{oElGa#z@jP3THR$cah^mDcVEc;L-nl_#Br5U$JQNWLFbg#97-i5?acg0Mawp7m z^fs)Rvxg=xn8iD7cF-)hM5b|gHk|yF5bie#t%d(_c^^f=_4VKijlSe8bckfexZ|qj zI%a(N1I0h9=27Ctl)g(6a!wjBoM$U|_xfXpEy@Zs54Jw*a7a zu!b)qsPKy$Gbz`CqrWjT{rQ$uM=3I|1CL?iD8_crdq>w?5ZDp(T6)00BlMZ%GpqXmYWK$7MJ4$6KCPKy2WK^oTWet;kIRgf$_ zo3`Bj#}*uZPD%^^L&br6G-}as)VCX;*t&rCN_${Vjv0R|k_!KO5^&TjqYqm5*wB@e zAbPQkD=#b}?UgRbnGg+|m?IcD-Wd_4wfyGrN;>?@fH`To;oghwyiDvKHhw7NWnNln z|1*(UF1$*eBu2R=Tgfcg7s)pdp~EJTt{yeUr5Gc!kjbOz^To)<#gBwLb1=|4Ltge|(9??SR8M&5&0&*Le!x6Ynon+#f!MiYEaCQJO3F2$zw5Jc z#{CuaCtA|n&;eE*xC_gl-yoOnFYrpc3_SP1*RvgXbp0}nUO%UdBz;=ja1tAa4bo$Q z#ogCei0r9nsYz?6!L+g3O&tJl>SUJ(M$YzNyRdH(O)Iiwu5c*>s%i(WS~uKD0=2E`RM(f&-~>bhCCSs!tr_ zv356UOZ9K|J>@hm1xQlj*{!&FW+Q!Z-b@;keQ25GIl4MH6WQTnXj2d2N@8u)(>#LC zq)evuYpqyS=_vRMM=`t1G7K58BcFZ;#a?56VH6TfWuc9sn;iq7kM)=*Q0_ zOfo(~?~fkGvz8n@*fok(&akAgjS=|TAx9t5(kS@(AEXcZqi^DVxaZi@kdk0Z9CsVA zbRee@B23LqiE^IUV0z zKi;bzrDAKt|NLJ!+ASbY`f)5 ziU>x;{4R`$i(~7pAClTSX{->Nk8=$-U?6mXM7uIDs!)?2J%7yZOiiX|1~shz_Gd^Z zsqxAY?Ra})6+POi0?+tIOjng->@rWrC)^h3I!``PWf@K0=*^X0%3#pPk;}imgnfw# zDEuc&`;-*9d6O|dj6F%E3y)LX#17Qudg9;1hb(Z9Gdiy+P-&$;jaQW7XLWRN_54t@ zRND}nP)b+cwBo1R2#z}?P+u~G7>Ux)M}Zu@ahSNy2dggGp-bv2@v=kx!T>_hsJEI!b58gKm!xJ^wv z*7I_{d36|;U;WKHPZ!Yj{nvPK%6Lqammqi7c03-;<37#jaAtEd#d@s5rGhK`Yxi&X zXE+P|=r}sAzlN{&z6{UW-)yy~Gs$kL;MwaWs5$-xcamN~x*dyn*~AEhYMJr5Qzp~n z6EQS(ST{Tm+py0XL&(N5j_W)gSYr zSAj3I{ttD^d-xf)2iHxd(S3Y5{TTUEIOBBA4H(yk?RFZM0da9)GqQ#t?1e^LCU7vynBlJ2=a#ObZYI6F+1 zOjM>|TDT}l_kPGBZ znSgC&EFkHsQBYmk$Hjy7X^gZ!lsA<_d8i_reC`qjXGual#s|N)W^k9heRQJA5{sNV zXpBrbUp0Ru#fSOutBQG8k!C{q^X||X8zU;o`bW3tDzmf2?kE@Bo13k9u& zMui)--&sJ`XLQhCHIrJaI??~k6E81sMeMzuBvEQkLpifjKEd|f`vL{odM+>LiPp9wY@3lc zO4k0O`4FdxV-@Dw*)tR(X4XI=GU3z~q71cl0G3lp(OVw_mXc0>u68sU7 z{4HDHc@DSgwJ_9vBGoF-rJ~DwsPjS=)ZYK1k?Tyj%BBmbHSi|cxMk=ZJ%&^>ej@A8 z9#rlAhii+|`P2|)NatN<-@Y%x`BlRBFD8jL20rF1HQwWMp%=41G7bwaE@2aXyU=}- zMNa1m!EfSl`uALgBvw~4p>ojj-IrONhdg~t2LEWHY~(IB{k1JZ<$m&{ z`W+z9wCbeM=SK~Yl$=KIA8y9tjNi2K0V7j4Gn$Dgviz+< zTUVUNbk8PwadtS1bI8Voap5fNX&#kt)*|uY7ojing}tsEK-(=n7X0)LDpM@@p`ev? z_Tp=SM`4gjH)0=J!s+olZH)BTMs1dYNWr9^%6JNE%Q3{1*%5s7Y7qoU37A@*D*UwN z;oK)qs>Yl*O?XV{x{mDgL`D-&XwVZ)RdSTR2u06@^ksK6FY;YVXI3Y(r_O<-ZT*=l z$NZwf(<8B!f596$57wjphvZIq(~z@jR8f)2>PC0b-{3{${@*InKXIEMqh0X!ZzIu7 zX&5|}i?ew}f@j(}eoS0}WO9yUtl%Ch>-oxBo+eVBd=qyN=&16V@3iQOKb|{n?_5aAa$YQlIx(+O8)uEP=*yN)GF%->7oLt~WBf$md0d4Imq*~vk8}7Y--qKD zb9m|T%dnV5Y=_SV3@w$zIJu3OIrlD?x==|LBZg6<(J)wRd2=1vX%IQ`kwsaZq~RHo z{OFVf`h7N(tbg|4v9mW0|Nct*@8+|c?s{ad5W`Y*FH_g|+q@tz7fpI+`P@ExdZ7^s z->iEu`Wwbgp48CowSRGCi3b!`sdMGksgz)_ofLPyBSlSlq)1qyq3a(R8VZ=sWa3}f z+Cil72)1~h##WmNyinpacE#+*=AsScQ}~U)(kMd-C?RF1jAau1mxc*-qaC@G8m zK8>`X#hiTazN4Lwu9NYlzkJU$Q{1o;!o#X?>N$K2w&j`>`}7FA`dh)rGoRI z;f`mMBgkPvCli&8qnVzCtoij6WH)8=UDv;&uj&!Ao0vl%Zd$;gI|zlhoS+^zgfyH+ z^0kW^>1s{`e9TYN?q|iAYS&D8vmdZsCC)g!@)}7RPa>1BovhmBJY70mNPmwE()17d zIP2?4B5Cey$9gM>HSgp-D^CfYXN~-_%RUM$Bj%O0hCUw?ycDeevWTXT?i= zFJMvc89wWvHx7m_VF$|s=uy&lQXKY*GKag-yitAlwf`6s8*+<8KFlTYf^}r%euR|< zT!)cJF+V5pK}ielacJtUc}kKyVIkS+ayS3dw5-5ihTCqHOO z@eA6qRvWfbs`xcfjfr>T;XLXkNu2lwhZ{3UYs-8*$l8wVD@APA3||`Vm;=4OufVAeQrY0fesqKtc_wdUo+n(VbXYShjm@&DJ0@E?@mgiKTqoT)C(V}O6)BA z{%SL(C|L7}9j~$UTQ&79o`DPFF3@$INtoSb!G#3R*D~oIHnTdJ!rrTJi80UV=kx{q z{Mc~xJQU{PIogOjIg}Iv7g0#hXSk>bV#_sUcE0m6>~{WUPeux1+38+R%uzCyYv;jOHvqnbdp_G4uPTxSQ?|^VCC_ZBjv}|Jst9 zpAi@SwSu;&&Scd?>S5)TiVa#OSSl0F-rlLEog2>~aN0vkloGscDC9oQX>X>gnN|W$ zXGhw<^>MdlJ{x9~PGk2+@iV1{^dQ5J&8&@~n*D!Rx1$G^4Y$IweT{Tw$!M5r*VES0 zzt~iffZsK**%4O;g(MeDjmo0McB&MlJOQ?Ov)STxJ8)c$knD7Tdhi8iCftdtN49*W)CMU1DyCZ3 zYlvMe3nLG0tWn&;nule>zV`MuejU~93FWqvINlSbjx~Y-|>E1FuTK8)M8%!3b>8g#?H}4OH$*VAr>r2U2VIx^}Uc>1u7dqs3ha}1> z`6u&Y`YXH?=0XJ!n)Ha4KbuXmk`v$+uz~it3}-J4&LcZTgT@(NLEH9)tU)CSe#*+! zr8Xal;vD0H1UlqpH?8iML|5}kN>z14g7qJA)%%SfB7wZG@fv+jOyz&h#nR~LOo~yu zL)UIh=0EKJqgp9PCSKkOyXz16%OKDTn|)+*{wbxdIKgc*S3tE&4u6v)k-e#fb|qEy%s&oQ!DIOLNTgd4ry-#)w(Gn%}HfCasER_^FK8Bg-x z&^iAQbS%6_OVxC7^*|z3Z)4=>--xJ5k5Oou$$y@$kc_vJ1hp5b_IH>GB6B0g^j8;pO7 ztzHs%dnk?ujhM#x0VW}^f7X*I4dzUAmgIvbmE5{bp^Q4Yu64sGg^xjs@>?y zeQn+|T1HTJvSJFdigbjTk>%c2%8k@w&trN}P_US!l2u@`A)F~2RN!Z5J0w*M(e0_h z8@*@H@1thS-NzYs`Exexs}VV*w6Z@_(&05=#+=8m=#>YaAiLebtA-;d-pHIuoVx2Bheb zf+tobINUXdW@RVxxsStOxN{}FO8^J!q)ST-d^hZge%sBJxgxVcVT{D~zs z8K@!ur#bSjy0BH#SJPUU@$#ke3P5F6<)-4$Yo$5Yv4a?`3O48`WVlOs(P?UBb zoWkaB|4vKSgplT1VUnE`iQ-AyarWCf#8_nGg0>8gI{KTkQf?wtd@PC&>hiaKGs*aX zDxI37M>Ufx_`dySB-bg&{qd15dOEPuwasW>8P8v`BJvq0$QUY3u~NVQ>Pjx+zNR;8 zx6MQ4-D+}dmZFp}Gp_fxk5pFplF;cElB_wzzaA{ZZ5Ipvr)CJ|dPnm8=9Sc|@qm}D znoIi>r{HI#0dD163UY`sl(q5-ZZG(aV^L{jG=3D6m7lZAH=^lL+d*t-oli$(tcMQweBmxK7wbU2z1h)&T*t)RQbhb~G!l&+n z$2!5a-?o(Gn^Q^0BZsbS&t_{~N>S|A$Nh^HDRjvkwsUnkiHeBrI*&w^Eh$X4X!}0t{T{VaiV>UW?z%1%?A_U zkdlB|`{&YU(f1V7exA=}&VujZCDOLsptC!UQ)!neU6Oa_(&uCFr(zEGU1LYP8#nWv zi3?Gotct@Aw$Ze<$tj#|#874#3Mr zMZ~?=(A2vr(&L#T1=1T#`1cr!#HD=Kn=A?h#jNKO1{3M zzeA_+H8(@i_Edu#{Wc?=iVZ9!VQ2h(7gd|<2G{r7sCIxpQ1d6SKX~O72 z`nKW;O!Ep@Lz1UJuM}WWix1fLN3egYj329#nSE0j@>7p9`J0a@Rb?BQRwdH!s~b_k z9WYE|HZEA}(z3vbSYvC3wzGE3;r>$k=vBpfi+4iaw34M?w56lF1=-VJ4c&b=4B8>l zSerD5x*aytH-l^Z*7*Shw>868PKlCZj^U7cIlP*N@a5Bgz^?HpCEMoH)@y5+n*3M{ zuKUD0pRAy317pyVHk4{+b-}sOmCSdX=ls}CtnKdOPCHIQ;$tAC&ijkz|N7YKll@e% zVF42vHG-~L#-XzOF8Mtl!cYi2Nw#C>{dNiX`VW@A=MKJxspEpM8)+w)uu4$@H!2rq zALBXZ3@hL+;(~PSPzGhxor6;9F`n*bD&TMT(7)jYCU>}?73HKgQx+aJffTZ86$_~S zjcaZtu! zQ(|qIcTs5O#8zEDKzoFPxT@7OnCKql{j$;IURlHT41Pjh@_N2_p*R|aJ6UttUA(cc zVyf-kkX;zbq|elVMvpE!>Sxh}S$XDrHkrJ15$0^UD1u!qK2V@oJZh^FZ` ziKDbAa@JB>n=MK&hn=B`K{7OcuMqWlH_~yXllU@UipwiZ#ns1;Xm!DOy!3sETJ?S; z-Z5v7aFdq57iSShf{b*@0RLm+Kx!k6x%%u+u=4kw!qp7JxHJ{ z*`DyT3x&bIJ23Tmj>{7lpnk;y-txGaW~RTwl|SC3d+Go`$!;Q1HJ-obSLn~MQ^?|8 zv~7zH(j=D<_Yp=+*-ZHTz07B58dA957QBz|BJ;Tq$VcfG_(4auV0|U-x74t&=Fdp- zhYBkQd`mN(mB}gKA2@0;`;QtHBzCaPtBP>t?GGL}+#ka@@Hf*F)*@b{D6dZ+6{?xi zBoibo&*eh3-896gfyqt4Tko<_n-O|S!yCDAU^g6V+*s}eC z-}dG8vWztgVNYlZz36HpK3IyZZ?0JR$CBmBj>030cX%)84KA;l!KhA_(o{au_k2@| zFSew`-ZhwaIG>hg2ukMZQrsb3z~!H|(P48rh}VcKy@#i^m)HUHU z-N_O3%{nyssZvLnJhx*aMU(NcQjA)I+i0#Q5`usBS_4D03nUuc!$qSs`ov*ikxWTPe)8@o{kxtvq^F82i{}aKr%w}Nx9wt zkAK8ts*e~6t9#&_zZ8aj|BR$&U+ODYL+hwQdUnEyJ&3+dzZOZcw3v@1G`4_QFLtJY zQzm?xx)go{|408cL?NHJlB>!Z)BVW`6np*=mOKfCu^g~IaRpZFeoa!JUNhHMlLYMU zE${haNaj;Ul2J|%y~{a8=3?7XrF0$YImJM4D)wadBhvmT6#WG`NJ=oOS1{VH-3DpP z8Psq*idAGKP~`P_Sac@}Z9Ti$@rfg#K4JoCN_SDEY#aATyn-=pdvImM48&Rmu%=V9 zP%HL>xcE2>)BeV61w2*D=LvQ?3iwk|8C163r!3c2KKYY9Mb+5xwcRgiP;M~=`m^lGR%^0CTVb~dygnDXB%^OJwu^t zhpAfNKMK2r85HekVV5~ybJZMW)f<@0xYe{R<|)1HFodG&41vyY$C-_)JfU9&7BPRZ zKhYomn*6XlZaoawj;F$sk?61uA@k{`#BVI-)xI`37xaKjNoHc!Vp)1(WdPl*I;u~a zLDO|CSnH)8Y_L7SmtXx4GS=bv@<)?8J_^&Nx3v^=uZ9b^O5y(T_W~d5M;>cJxmD9& zL03wWtC$v3Nc|SJ)lU}RU(LhbLmf14w<}k2A0+>|y?n$#0-Zl_iY`Xqf!f{IWL$fJ z@+~59;dwL-ck;(U_lW{dugg~{>QZAe$IoAi=us=8TgwKaUEGc1@)ClLa|<7G;}C4e zds5STOPnc5<_}6Qk%@H}n{Ip#@llRU*C7|*XCz|9qEj^TjS=_#mqn?LbNQ=3z^lPf z>S`;ekmC24(&G$010&XH^BG-pK z?Yoh^RnV^;@IsNG+g#|qfsUkn#hoE%C?)VQTlmYL!nQwTyO#8k{cCO7^3IPcR9o2j z=I2zK^M?#ii_!hyD3Y8hL&GiB^Jj*&_-<%QcB*ga=f~@)Js(WEpBM2beWsMAb)Bhv z)`0c&3QQT7MJb6=*tzKzb>_cdK^HsF+%TNwCWzvzx+eSQl8oG82~^;82hkHg;P5t6 z5}P%WUP#zLci|@K!_}(i`b(kMk>1-uT!Y zhN#cUc`A-=8wm`t~FBj6O zSABGP`5_kCwirECM+DvB$+X;SE&H1|nUs7+GSfFX^w+hAJ^nBYv-7MFxa$$#ecH^E zLUb|E{EF{$TT2`ES#s|OBG~7)7}W*Mv}fQWwu`n=`o>~(H^jhp%v5q&JC6KTw!?@& z#G_6}rn3ALegE`>baTGo!}nc$mtP!xE6BydF@~7xzK4{WQsMkij_tS}ELnS*hsVFCUHh(5E-$3J z68-2JS%B`)UYKjmq#l_)G;(JcHE;b)x4br^$n+iS`J7CVdjgqengMAXNMJ^_cKE1Z z59cL|AR;pn-)_Ff?c(b=qc?<2|3e$$IuM zp72T)|HS`em)5#s>E)Sh**+=Ch;`&AzFK2*nKij-@1QN`f3Z53yCjz9$3AFxqqSov zP3w}N*h3fCy<>{FIXjMb|F<7@OJ6YQp{oSFEOo^A*wXZ)^LT=VKo^%vLO)^&&N!~- zA^XFq^UZZgmWI*kEsgw(Rt;GMKZl{S22Gn?!9;`BlSzat7Zu-xprUguv`U8}j73;U zhBb{(aicv(&8XHr%0dQ*(#{LjG`)WXy=%D7Lk&Zrr_@Pjm+4^GrXG5f`4G-(ld-Jv zIoxcPFtz${8rM+AtLrzA=o~i|a54qI1so|v>k$Q6$spw2L;Rbehrn&e5SITKLrxBm zk(4_`cU(k*`Y+}l+Db(|xy=1(CRCR6VSIZVJOmlm7%oS@QoZTG1$o@@=;h}}Pp8;h zQTXtFH~OWgvt5CUF>}pgIKO*Ky@*2WPg&$0{eqJRuhIDh=}h~$7=Q;&DA^uVP0TGX8}BiZ@_8d2?oJjJhUPr!C) z&o&hFMJJ(ML4+6fUO`OMGN{k1r^70nXhg~v)C%R${F`k=X8XCQatkJ%-NK4y|HR~( ziez2nNy~%NNqDdrS=v*$s&o}49(_;8#9a_^G>CjO?P-kQEI1g&+WMXI^p!g%O6Y-i3-v%zzAvpWMxWFGm5n+-WY z_sk4vt<5G{x7>^O&C`X=cTe6Ix`*ay7ICdT9SBQ_A>-buIH<@#=}+m%Ju#lB?SI|%V3x)WYEfOw*{Jf5in_z)X~CNqyqf4ls$%aURWHL% z9J&Oj3F&xyBLH>&8*s1X9zAWYAe$KvNqxdul73=Bsw%Pk>fC2uT+)cq}ES|ZZ~{i&bu`ltfCn?-QcDu(@rPkj1>OzN{)MEB20 zP^OF;Z8ed=xjyEZFRp#o(jfl1=t9I+pW?Z{EKEZ4aNYN2?vF z=uRxnw|_uxMzOdYr9ok%hEiywDP2Be#h13vB6H=1bReb^S66Y2JTK5Mwww5m$TL`( zwt}a+<&l`qbmSTH@r6(=bSUi6z9UOHXssCNYloo4P?KpuvlR%2! zWQTzbHc>)FvC zg`}Gl4nx@p+N?i~i?`a-1-l8{W0DWu8>>YjZtzl2n4`~`kQgvrkv0YhCu#wX}edmNod z>&}m%lATFBNKy}#_5b*h0}m*0i3f!5J2C=8&cxEup{?kxV33fPq1m@K zK`XeA{aJAj`O}1Gv%>{?d21YNTC{@P<_B`0p)pvQoCN8Ahq1$I2OF&33d{fUX@-Xu zBy^o|OXE9zOBzP^o)Ix!Z(jGb1-t*X(q(yj49aX^s*r%2X*ip>eJWLz=?eBfp3pW+ zBoWVajC(A~|DEX*Qd;r*#Rwxj$tyvr?66I=^P#XCIL zp$xN+oaYs(&al*2!JHz$L3DXK&08kW0TxfG;e9I27QR49Hl_44D+n^`*Qn{J6qnsy z2#LNB@@o}_hu;^rLDw3c-qT3fK?kc32sGEBi3l8T#9!QMrBe^JQCXZy%~wjf(5VbK zrDm}yqH=U^&t|A?4J8jb!Jg#0FG<`#$LiZAVY<_8ivN3u)&_jwUW4+`-_*&fo5$0v zg1cm6&_#I@>*+w=OHv51WSx;(WV>qz9KH-eV@EB*%#P7I#~51q-w>J*IF0s{3v_?W zULM^S2eba8JidMkRS#Lr?tIt^x2AD4+2t6HjS6B9<~Pv3{7fD@GR0Ky9BKOrT_Di!HVrG5(T#qWfGFG4{ zMK_$xzs`~k_R`(N>HHJBLx z>>TdEt(}5tU_%T28+jh(?mM}>^H-RtEM^lm&=r|Xr!$QN0-M;jJj_1Flgk6`ReJPl)(N@B7 zja2IUxSNu{i3oCk7f8t6#fk0+y7=TRUY#_icHb`~>v5Of98iPXE-m8GLagS>Ln=SL znAbiyLxsi*Xv(xdw6a`-l@#rQ;casSDrutrU@MoO@{_*2e#yJWwV<*xh9_RHLDjq{ z_PQ{d4jhSMqLx|YtZjgd8&^@>s>hXM9@FD%>b&MoIz?T$i?8!@F#OzDW)ZWT#@58) zbM9F9$jqT#tDQ*ut1(wHybHajODW6vx`2U5;+sFzS_&Arrw5!^&y@h zVSsVht9iJFFeDD%B0bZ;bl0H=BlBG8AN2@4RS9ZdRB+emanvx}22WMfab$!qYnybI z%2xSc&avZk-&!5Prnb;iYoU?XoGEpUG-7wW$3nqgpi9;Yhr$bCea#co?LKp-!%1ZD zfOzlX`&2VMi7$#$B_koCLp4t*Te^vlH8vr=DS3S2xM2F>%E_+4hDLl4W!3Yq!S2jV zW~KUqg4J{R<0YfWZgv~XA0|o99$YU!4fmM6vu_V(ld^)+FZYrrGa@=I*-lK}nf_oI|{+twZp28x1 zDWZeiiDK1hiqbe;rAcnI=*N9Ne${ErJfF?~6$w-R5q~y2shJ}7Wg+xWJT&|z1$`!c1m)WC zE0My~b@2mETsuR?S9AIBRq^yi?;|q0tX`*-KUOdWe7iGG3VD5odtPoj5KBrG2seT1d zxt@)dx-Y!<^J-*>9%Eag7U8hlctq{pMylO5Ji@;M2PvM zGlfjNggL>nq~!SsuQs%kvsVe-_HUu`V|i%rk;gxc;pDVOg(kcUqx+{*Npgq~3-&gl zzvFJOHQJMK$!;7TJk_Q}>00EVw}A4*y(n1FbF73INA4aSq@?i-$|aE$?h}hN zVP&>_rxGb_+dyee&N#Eek{|gZ=q>fE=Aj2SBR;v48V}e}cCRiyG9)bi@Q~(De<u zz{ekOg?^Ge;vgIHneA*U#m+o!uH&0eZ)R!1qsyKiM0c_C#|8P=L}SXmF4!WQFBWXs z)3No|Hl$s4M_k-+nov}Si1c2ByJo^DBAJH?_63iP+F0EZSCWx5hP;O--4+h!F{8aH z{FMxDS)Rslc^MWp;}3-9^%5$xu{ik)`_MiFi?dF1w^qp>)1 zH19byoPJWM-n!x=U_x{7iDM)Hs@Y@NMq^` z9#oev(7pG$|D`t+Fk=x5)ovuywGr%XQWiFc&L{ITt)%cwiyDd_(z=Q=KFs+(T@&)_WyoxWeGekyv1pQs7 z0O#zL2(ZwkTJu;wZ>c6eXdR*XorAPacq;P>>mu8!U*MXxl!W5G^Od)gNaj--Nxu1u ze-1y8@39#6&n-#gNEZ}cf6$vn)9^x&HLVwPVQM$@PO!@pSUnDnR_MjhJ6&fJ|*cMib}8d`91*rOC7La`h#6&VRx`{9O&Be|@4LHAzek+VtynI$qf z=I>$aq&Or3hVlzK%W&#`7HxDt_ttTSaM7KHAlNM&7m)$Px>YraLW)qMU*ejKe4TEq4#n3B?@ zyU0)(gXqtdWH^jb&Furcy~qr^-VE^V3i4DOCd(S%{GlOF;`y${LKt&$7IJs37qFPG z6qu|9m*2s(ZD9irmuT|W?~XyVe;r%)#|ta>g))Ed&DdnJkephsleFbUlm!Z7^>-H* z{KJ9{E04!1{UHd`98YU??D1;PRm>Xwj*csiVuK?CQRs06eLrhy*3@mxvFrq*2DUT3 zJWnzlF@agn97^x>=Cbt%&!9uA6;o9#=$+hQCi6<*gTKdfGy4nJcWExZj($iQjxjLc z1(Ylrg{5DEX!i0<-tJL}AI9-~ovH{T-mQRpxf>K~oY`f^P8_yQMX1SZ?8tRQX7DY{ zv5dv<`{OD5^CzyPGX_5{1faR`10@y6lheHh+Tx(dlz)lRcq4%iyE78K$6O%YwiKm3 zK{WKpA_^SW%?rl;p#kw+ZT@*RKLEr2q zwlBk&N;O`Qy3+yTPT`pMpBU{BY^8TJzJt*uBX+}}5jQ56F{#i4aJqD#pDEq~#Tz4W z#P<#A(j%C|D>GWG-45aS{S=lP1Iy`;DadyQtG0Ox7QdCo2j0Pp+&|o6qpx6B^Me}9 zPEnTMEBbWpHpV+g^7Ddz#`Z{o&iFWsg4iy8=%@jG^gO`!im4!H>>jpS-Gb~+3i#!n zc9^;g{vP&LI#LWeS$;qgMGH1X?GH4l=btD=9pa?eeU@v?i^KQb)A*^!5ja?+L+<7` zNiK=QF?kVX+f1gFXaB%s$w?M*HJQ>z_tW34k=T+e%9HYqXvWNW%(gHdQctGiRN5tc zC>x4fUrL~_zMrh-X3@rsI=UzG2b*qgr=v5{uw_FT+p;x4(4#M9DaNnqmw7)+a<-?q z%%?c@&;>iV8Ts|BrK!Iz(z&R;0$nN2E8jUHsLq8nNB%(E`4D()&L>g(&-7mvqrZRW zbNh&+bVSvYz1#7Tt`t<#q-_Hv`pb_Qm?To~+!knAC(+@xK73=iDn*{y3e}X^G&X%J zUEeE@eS&@7%9=2|Nn%_i${4XshCITXNj9vS?d{%)YGzLbc?{-5E--}!bMW;`B;Ec~ zPMI4(bLge=m|h65=F={DBF1Ei zxcq5cG+K@wchBRaocB~~t2V6trUbRg+pxgO3>Ghn=TDHh_n7`^m? zUYrVUB+nUM@X^nEQFAf|;dHwH|ScW{Y?CF zJxD9+;+@h2Fk$#a4|#aWeC?lDO|OCBvl=+gah|%{WZ_H|(8QX}prrkeC^7LO&Yh>I ziH!pO$e$!(cnP|%@IjxF5O|OgY|4mZ^jjSC`Jz&MXm^@q^GsvzVRpK7y9RQuV!=tv z?I5~5hCGVpgkzpHr0B3PJU6HG?3Q;REUyLU6xkqBJq9{|{zLnhU&%v_c1V6Ej#0KD zc$-;=ddpftzu6C}93%CB(dQ59+I{VR=UnlTSH>4;k+O zXV-T6NsK#zHtQX9A2<3V!8pp$|12u%pueCBHO5O2>7&qJ$q3^SB7-QFHv9 zeHc<2y728~1qe9y1;dMaXxJG)bjuo`8$U0`?TfRp^K=m`{;`t2;?0H*dYJ^TIRV%8 zK4SgQPuS9Ui4JeQ0GZ`x_>cE53dgA+XB;OOgyrJ7(f1(Q-UKR)?kbvzRd=u2kNadl zk?$&e(A?_Htaq93!=sb*qFE@ORuRWsPbN1uqXnNQC7}AS9r0t@kE;?7FwF&V_t%xa8h z|H{nsHbU9G80;0u#}knXXve#h%vPqstJZm_P#le3HxuchfX%3XP8k;}Nr8xzHy%o# zfaWwUXv|>4_J(q*ZI+5}R@tEpGlpLL@c_n8ECUUVAB;|t2LraQrD1wXV0>K>HXpkU z(L9gov9pZ!Qpg?0?~NeWi(tq-S%sF27EoqZ7E7-Mx)WT_oW)7I1<>QokBQ6P!18Beio{@w$@ z&-c-FBPr0>UXRYnH=)MH9n!Ux@b!EJ(0(wAK7zL~hViRO_KaurAIIPot)xcRlfgsg z3ax&ikN3Xc1$%)(obai|pWB{u<1B+ZC z%5z6Rd00LMPuYW|=~ryM_Kx{H-O(U!7o3l5!)p`65Gq|s4J9n`g7bY84?Tnd|Hb0S zA$_d26d;f51o3Z&FSYjAkBv;ehc_<|uIN3WM{X>{w&MG6s&6}rtr}y-HD^rnH6YbF zoUnFDD7AO(gtx~+Ft8*YW72++0_!zU@Od-EuYr)Dg@LgI@x8}UT=PJ)YcV`Ve$f>0{Iua1Nw1HmrE(gvd z`yjo_24$M+NdLrUST6PxIefI>r?)x1<+d2NPCAqB4LdQ_^d9-%+>PSrqF~Dc8D`Bm zK~7qwfzGLuRB_&BJeqr*u%7e6@%cxH%ak(G8%9KL5g%+FI!cax>xKaZIcj$`6+LUj z2|w?1+`Cu@3b|}x{RV#&9Ii*b0e^JTt43vQOMKfpjnXaE5P0PsZtadC{l_aHW{((k zs920o4eHUz?lSywcm%8YcA$Wc3!}H!$J@h;@tRaRZ1Y?O26;i);~9+Ebyhfbz67%F zeSk*S4e+0XIwpU8N)~!7fu=S8kbdjLg0u<i+(GjrG0?p^1{TOZ1OsN>d-la&Fy46)c7314n&O?1uxuZZ zWi;%E8t2x}d(eMXKT%LO#OdstI4@5Eex;gGvz%F|&^(0SPp${+|LQ@d$OYH^S^yb2 ze^Kak2zEVP125Ce>4Z%ylpeN#*XGuEa)^s6`Y`@9#0J;LvcS6w7chdm4S4P`JfvyH zooVUt2KAoBwxRwvWcdTG=UvcRX!3vj|M1l3>3!(Q(F)R5t~bEJurPR9-y;X6u16dHl; z8#jiHZ3S*7pZKSs6q`ylv3pS@kXNrUG)oS5s-7gg8O>Oetwav*3B;#?;qZ8&2*y5B zM9z*RJojlF_vrP(?V&KTU9Atarauv>XE$(Vl{3V|&cY#^(_|gvH#g425zXU!al09# zk%;}wc3pUNno6E z_KCvE0yfH0Itp#K6sgn>EleM90?+3@I22ifTYMDYvwtl$tY&gYLeaEstpobLPlYNb zhsSaUK*FL3UvAWa(~Os@(|t~A(iV(W>JRaHIiqWyWjxPpJ>f&CBPf>7gMDjdshDjP zaywKoo;bZYv-<^kC6p(yz)Z^w0h>_`4c|$;Ge7LD3L(xSWQ6ViVAe{rs0+^ z|7dQ#3G9#gNi}0$fLXmgCk#&V-jj-%yy9;rp9)!j0Is z^mL{mOfq9w?gehlrM7g-JT>rcegXv+u^{UvL@$;8gQ!PU^m4&wjQRB#Vr&lLI2ih6l6%fQ*h4`a~bZ&R-@l+9XUh*Y)G)Ct|Q*k{xa3O!4;z zTRhX9MOHk2hvk2?@H}531Zlm+YpmDNP1O$6?7gsYvjAa>I1KxP#_+PD9b_zh0*^Ne zgVW~w@JhJ_R}crXLs|=-vnFHtH6~8xD@jW{BvIL80kKGGN9n3Bz zAwVBGpB#m3_9Lc5xSR!Vd29H+UBGL&%HjuzdH(`@Wc$?ahRZz>^*wv zW)*Jhbp(ZmBRC7mgyT>FT)DiCn4h1314UUR*0h2#7Pg1w$Fku|w*vY5w;w~Y6;W(S zHSX?cCcQ??I(w1*{VYsxkbo`Ykv*&WckD zufd(et$4d8h)(w|gY~zjF-z$g4sT+(5uq0u-qRT2d{+*tmV2RoI2m46t{`sBV<5cy zE8V=d7j+AqX!OEE*lchaKfP{*OH0G)#rd;v!9f6*wd@7muUlx}Q&rH&Dy0feUy<{K z9vWu$LzM7glC7V@#_wST9T`W)w}g|sCt>xHw;*Pye18?U9utJoA1ToHw-+-)J(NW8n?tosI4#O)2Pdm2j8jd<2Kn7oAVv{l zWcSltqaoxCG{&D53>GaH<2iRRbdm4Dx=WYiX@8Sh8{GT!zJQRrDF(I@%{TmZ^nt+58g7CR92~TMXV@O** zju=;9!1)G@Sa1VN=C~3^ashca(DN22&~0-suJ$>B)w}LNuRPbsYPJ)YcKhJCkW~^97*fF zR?zx!j}(?gAus!3j za0U^k&F`jRCi)VRGBX9XA{6!iQ)4C^t_V^_>r3nY=nN<5j=~CxU?cv^H*I zJUgSss$pHC8F=}6fKT6(` z)=E#@m$v}J)jmRQ%^^B9vmWh_IFi}oI~d)32NM~dl45}=SyEY!F{{pyI)c!DQU>oU z^up~fCMUC81g5?$C2EXL+raBJQ&Hj@>aOD>2SzmDeZfCeYivZ0RS9JGc0C6cL*bKte*Cp_cRhQM@ADj0kVr9|v-!~1RU;@Une3L1v~{9@V~R)jhm zj2J)hE-0Rz2Kg>-Y=|f&e&ZsT(Q}?2lq<$d1wts1dmT50%tEF93J^RY4*@#>E~S`I zp`Jo`X)p}8ZBy~3(PAQ;Z->7*egW}H#lSwm_oJh*?Gu6Jmuw+VhfSOcCC zJ=np)aP)2rqi1g`-Ro=w$GErBP0c6p>Ss&x)=C_1)p1kKMg?eP@@Gu9$50j0&{M?hQGBwpz>^- zvSjUp1848R=AE)A5b6TKyFWmOTr6qpQHR+&M(?}mA+jxUr@Yr|@wuQp9(1n3y=Pj8 zYK#od`yoI(gj5)3xn?T6-~%3d6G!WfT5w|WFZxYt!H>U(;OIFmXqqqup1_|Vmp`AF zrkp^w<$<&}R~fsn2_yf;JJ5MtnYxZmquyRqvadZBbyFyfX!--a67ke>-Env)Ax|2| zw?cMS0shl*hI_Y`!`CmCIA*qoPTL&EPpxK1Lkk(-9R=K8^%yJ772vGP9ZZY2CqC9c z(f#%~IaSFEWk<2ksCm8>7eY$IW7$-K{QGLl#WHDuQec6XFOf?#W9hTy1TYj=yFdo#q z+^Kw&HAH7zBks%NA$Nf%S#Xyhj@opi|9>8!A*CAgU6JaD>fqnJ>(n!R2gGVI zoQSnam{i1Y71V-p^z00%$i0UrjI~F=mO)74dx4x8<#6kC8#;%3p}pTX`Z&@7Jtf-F zPmdp+9E6C;%e|02A&Bz^RG9qg4bt(D!r=K!#P`Sxj5PA2Gsf9)H19DPYd(Z_JCd+6{@#yr9n-)q9A-581{+pCumH_O zM`)7VNS7KmfxEX0Xld=jMUi{(;`!$|wpgA946cRxyW!+boEoE7R)<$UM}c=}fVdah zBCBv97HW2b(i>CKq-lLw{Toov>IDxT+I~oBlk(&d1JVTd@O{ zR}Io7b*~_nQ;ZzE{gd&F3!_Txdr{@6E9CFUfY9Vdy6^r9_;A!2S2=gU{x~=C`1>Br zj&8;7Y6BG1WAu#rzu@~;AIh;Y0!Cxgi2c)Wynl(Ccxm{;k3(z7w8H|ZD2pPVjIZbe zK`oHia7CM(wK#dA5AId5GnF~opoNOk^q;e^BFX}|?4+Q;zlt9JtAkBGm!Lj&9lZUu zlw6g|hnpsM$mSC{$fAFR+9n(WzZzevaA5!gjCaGAu?C3Gtbwm5-$H@0IW?_R!qBH@ zNu)YYh0OaAMyWm+A=ZRf#zyEs@bFo~O(9MAiTBe3Po51Mi8A2O9_u;>@#3-RqZ zaULFrXrXf0w&p2}uM?&@8hIG+o0(8&nLP zk>kp9Dt}u7xSTgKd8-oqHI_kk91sGXHO1h%aTp#p)x-KE2fTY-0$!hcj;pQM@Wv|@ zwCvuEw#vF7+Bkrzmb_50JqA*QUW1abGUQv8!E|gFS``a3ze^wSm(d?6u#+UGRjPsW z_jg9W>xPjD=RmWO$(LEX6HjDCZMJf7<9mbNi-aJ-;083CGcnLDv8Y1zsjtxuaI{rL z2cslBQP@ZfL)X9#G(&Cf7f?UFf|T5k#?EyD)NfZWH2*tAFJC!`m)1Xm;=&HB6%2>g z21duW?*$E;S^>*ME$06~f5G_n@K;9x%ptT#}fN?2|yd1?FK3B-E~D`y$B`hPSR6e}t^CSpv}_sWgo7 z_A(Ligq5-LVa*FKR6W~`X7?*Fs_8T4-4Z|%_4Cl2*orK&DtOW$hHeV6#zV(@7%d=E z59JxbYz}XRkC#NmT_SJ;qjj8M{7B|!f1#=_H!*liA~9SM3_eqNWT1^H8@i0)6~^v? zf5n#wU-3))7FmJXix=UP;vikb#Scpx&d{b)N|+rRgBCs;K&b3Akw`X&x3~XMVZTEB zurZgKrAniWM?X1SFoWcUf~gC>lZbQRRfAEO^@kKy0aBh>Mi0j4RB z!Q%7I_~*}aYB$dd`mDQ2yU7f`{VIrg6Mfh)@(Y}%Ug7~pduOvv9xpz;MLlFUp?e=M z9X;9%=6Bl(E9)<`(lw=qo4a9tXAe~r{)T6i+{xlg1heV~KxyO-zBns@3%asl!#W@? zF87da&rketWE?^|_L9kmN}zM@5A|T>!hPo|@bY;pj2ZbtPM7QBw-GJUT$zEEC2}Zd zmyOn@+SI-836_cVQPHlI_;sd&S7Cj>D0B5;JdFcUa9cR37T<)u%VnTnD<5|%#n23XX6;9Kuu}dJ zDl|>d^g2r@-Ms}?GhV~J(c8##onm+qd5!MW^u?sASbP*$3YUATXv)(NNb;GceJj;L zqedN;FOvW>7Yjm7|KhqVO?dCYg+=c21ovOY-A1CI)xiQQ`#nj%R08Y{>SEY9;vf}2 z9}-me;OeIr!1K#>6s>L|QV*Cp(d`&K9k3X7pQ^+$+hQgTdWEh(>;?-yc0j4)ES~mT zOoI+=!Vu>7`O|7ayvSRNp4T$LML>w$GhBgZexHZlyeZIdd_wCpJ>Z)|D%KeE;nJ?3 zw9aZD8fdV?#plN%^S@-|OFo5LmvE8emHFtac8{b5RfGNgbRek)j9=pis2mxMUZyfq4hn9R+=<3Lg7H9Rqq@x!n83%jQE;f3& zf*IrX`ok2H>x~%qBB7d}VPzZ}xp-d?2Q?VofAMul$qL0yMQn_>dkDSyGY|4l)nd>J zBaE|=MgR9d;JbD#Y+$?%U+w%z2ixwzN#?rQ;y$!n#E0dU2)VKuwBpB2ShK+mgHN6X zOUZn=E~ke31G?xRNq;aMPM{{%zL4a!3Wr)p@#6DWOpN&sN?mV*OBom8i17@`((=QU z$tp_ZpWp@E17w=vjasV@W5VE5{NfWxb*imVE!G3AmF}Yf!}oH%*@=TP3#n!Z7Ya^| z5R>y!_~G9eG>Y!P4No7D4ML?@#pLs3b()xQlAlhbbmQ}ruDD<9E^ssXeZ$o%zP|k2aG7L!v#0J$(a-r z^kh5&gN7YYS8ftgI){PJi4zWA+lwvz!*KtuFv`U_;HkPI=B@LZ7}Y7LQmv{!_LV?*cZwR6T7@< zn`a}c9%~~_fgu?6)Ce~$^eAKch)`8V0Ag zpTl`Cry-;MH%dG(rB@p!Fi%YZW_ixS^X!krrRW;t7y1xn7*GGh4rf3?Oc&HeuHu(@ z>=-xVf+cmmU?u++;;uI#zm7OjT+0pu!D=Y_KohbD4}kSCDPUFNg*A!H`sHLBeXe1Q zCNGrfuBZs)8NY|tE*0?BF$K#QpT-Nre~6=oAh7hWCyhH!!3pUTWMOwau+P5;5%vk# z#L5O2JCiZ*_%hPtbpSsu{6=OixqnPCGsi*#bl0j%GNXNlw5gV-Ij? z@mY*o{~4QtexT2PnouMYLPoVX;Ak~sPi8C#DG5*|@7uT`uMG{J&Z1;vDWmth02Xn} zAoywteE7G9Dp*{`#&wr*SKURN2@t||zr|R=#Gf5(xELOH3{hb}j`;)TbeSl_SrlZr zp|%F_{$&@beAEI`JIC?kGkv%(t4b2Z0Jn2TVl_uJwwrg6^Gltf_{3@4StVgndh#wy6W2BLK#9b6oOrE*8Tnsvbps!hBY%TkV)0~&=331CnFLq! z%AmcRlC>W}ItOC!_!0^!2MJ8Ib=jQgAKL4r63PRjYh(e`jm zYL%pov8t$Ue3jI&66g*(LVWel9r&|Lp_orx1YBy}DIYCYrPGHiy&qT_`5AXAu zgIV(_bk_!IsQe2(a~MC5jA^i36HBLFZ^X1bNBT{x5CtQ>Ndi-6&Ha%y;mp1Pw@hsz zohJ#Scvr&Inoc}{1@o=pFytum>#eXtY2A7TEkI*LkyZ#fMU@ZWL86EOb zbOV0a{0AE<#L-hs9uz*kN69dMI=YAX9qEZcX}N09cNHP?ev~3xY$t3x{20!sb>YnZ zcliCj1$q4J4vwD4Ba;=sAyB=FP;ohs6+Vj|DimJ-ctO1)m>LBKr0}Ox0W|f*F?EvI zaVYdEsK>6t6@MbIF2WVe`bd%iX z5CQFzeAM9vU~$(AC|mFdv#-^`P{4oC*X%=-f7-&)uw?RFR=A>v4RT+eql;Rr@WLGfaK7>vOs6)Gl>9Q3 zkc*_z#c8-c<~OkI^#iHfmGqEj6Oc0lFkf~GqPdM=1)~T0G3amDJ7lyB>Ps1}q!X$vdxuzf~YOO}D7Q5#lPzr=S}+`+9n1}?3%A}`B5;bhVz z89aP}@n8^z4_QZXa>FMQA<>N&7@p;w^ySz*xdfaG*>P{+FzR%S;Z&>^G@na``y6>F zc!wX_^y-M^>3ul9Di60RY-M!H_4sdh9Y$sh!JXn8m`&}d)vARMq1%mT!W3}Pwnj*A zd54qLE##X*mpS;(quM4Pna@nJ+_^?TZu5aqyb`HGKCq>UC8{Y zZMgS@C29E<1ZS*Mh@XlxSf7lAlvkXv>cdlLUYL#kl0B&S^cz@7-^IT?YoVzAF=1N* zh{{)Kh^#*z5p|_Lk}fbUKT17={IL4peVWF^3*J8-gTM$C_#IF}9CHw0aSV~D_eAzJ z0T4N5j1iSJz;VnTxyG|0sMiPX6EDhJb`5*`hDno_GtRgs($TM<@xy@*V1K?1-2bW) zS3So2aH5i`@=M?;#a=4^rGepDu~Qav8F;GllqTv|VsLmS^gru_9K}#-xJ?h^-?0$Y z*Q;Uv@@J6sC;>dTe*{T}r}e;4k3vu!yjV3t&1b*iI+q!6@Y#y*)-t)ruBEtUSct@V zZo(VaCxP=>4cIN+DIm z362&W#p-!)U~Ll<=e4+mheMyx&X^1M?9X3Nb32H$w)K>HibKd*R@@={34-|lgY7>p z;ZfvnV6RJpV&hHp=9D%x8TX^?*Y7ZNH3~DO6;c1b8@zzE=>6CZHGilxwbBlgy${$R zL$-tPiff@f3kQak2|`ps4{g(whXJJ|(sWT8La(f&m%G;DMpZFXzA}L}3}3tV{uzk3 zmn5Fg+rTrdfqF3dIJM$dT9}uNiG|&uGP#iPkYs|ve^cAs5YTFnSFO!KqxB&o@BB zR<4KYB1t-NRsl=T?4hL&nkc9_L4>MuA=5e&)Fz!k!r=z)Wb(ssScM+B8jYnI-^s`t zMUbi*#4A4K_(ggaMXck%a`qe1IlB?ra1)y&5wnt9VAg?K5*;5A~J7&z=lXE`ugS${PvcgT)BJ; zX52F9m7hZ}EOZJ^=NDnO^G3QSa}aw9I?(X*Vkkf5OMDq0ll2O3NPU(#9%em?N^udu zNPAIQzY?gH78&FCRAYqwPq#IhFUwMAVNHq8WdBs+#A#ih?8VM|j+vKSbsDGDia%#OGR@!5cd_mAKliL}wnIky zRN{H%pU9rB*qE-mYC67h4eO)Mg~KIpeUFruN2M!|aec3lxX&58`^x<$rvTRP`>fxy zIXf=ow3CurJR?`H706kzM)IAcsnV*Y>j$M@ADub9PVZaZwc7$bO8dWB=Y$!b<+Mr9 z_1IC!dD6W*dvN#qcjf-u6$2Iru5*bw&N`x-)LWWNHmDcvwG~aj5;s}v9JaT7Ly0k4 z%07p;!bZc*BE2znycsqJ#My2%ORqe0C{S_X__Mk~dFRBFyp^@}&jia-MfPW@?OWim zW%-T%$ZxtH+H2CaZ~n+HdZb`|^xd00?qyr6Le)BSGC%2`?XdPRcz??zE#19LK#}Xr(o5d+#3nr2*T#y!-RYI}UcRX0-4f1{ zJ3DlFcyGP7`)}7%b(N};#y7gsJ~lJAq&(`*fOn$X&aco^O<&l+26@*4Vku`*_UP7LZ&exYzSet-=h z?yvO)53kWvPH#34I~m%N<^De4o%hs{-M=3;Cg4L8TGz;#PaBua zdn@)z`1fo>Yh2rTujCUVxo-{A9V z>FCQ^L(dj}HRo#oF29X)51Y7YdBX#%E7v+bdn&h_j%d=)a5y;r%jSIcf*0o`)-SvF zq@wqW>x#X_VWG|{`L^1ue->IQ9(o>B_TQZ!lkt2fS|hLCTprx_@xa<|;YlGprQPcG zYByvTJu)s7WFYW=)!i9H{I6^~FSA|Aw4F@zW7<-tZDyJS(>^hcDc}WqOiN%I7;&6z z+ORoIsdQ(`9sjYG=?fiO18&M;utMZ6jn`lMs*Js^%HJy&Qy$X2#-%>>N`JxnB-^#E z;<@f7$$L(R)k(Na{y83GA1~OLYFce(^EAf6S=(@S@Ohj060Jk`BW_=c{*(pbMGc&P zI}gu)mZ!;9yKZ^Zd(}lOWjV#HL?HCkwkv#U26mr+#f{c{{Qac+?DYq(t9u?Q2LAlF zrFWUzH^<#0qG$e-dK2PQV6`w)xMb#WqGW*+&kNJ6z ztnnK-X0gvVLnL2^N4D$y-Pm`xh7-SU*UOfkcvRV6xZ~pf8H#X<1D{hGd3!iybTO|?aZY<%}=E#vpG(lTDo=W$~1(Ulvb zAJu+ez3E2bmm%@Z0r%d|NGgUsd^@^!$CF!~pQKfbN@i8D6D@^lfyU5zM9AhP!gYc9iF~z%|wm=y&bEE>aRahS=G~e^Tke!?OuiL z>elkkPn$GsrA{Zk)v{S>`{13n!-_*u9Xd{erU8SxCwbJaq5g?^I`Jch=gx{XWEpv# zU;8!9*vC@wUBN+bdzIJE54#>()DwHu!+hSa+omp>BC}EEXLR|0`&$@hRh`;ywLkf# zt>W>6&%c~mV|(CH^93n;)2Novgdz^Y2T8zpyBG* zbAH$6piQC>pS_E1^XoWJmw4`UO{I{@tk~cP0NO{_fT))=M56)_b%o_0PEB z{eAZ)W=%4WrO%X~3}L)wsw^*gJ(#M!5PKr~U#rI*yGOm*%bS#Q`|mILwCTxE(Sn*) zPY3f^%jKSRhRXk#|DxyO)&Z`fpYh_;A|*er$o&y|nWz`h>|UOt5!8O}^}S;^t4~&> z9gHqJUisie(og;OITo42JF7Fj3MP#{X1EkhnASd<-&Dd@U&#G6Z$V>;(5qC@=Hlg* z8H+zXS@kberLAD?Xz+&5xtoTgSATuHt@HM}@6lhB*{=VLZQRTi-+8@8W?5+WwThK| zmwIpgJ-Aw6iLg*xSgv7n&j{7mHV$s ztZ()4-S1X@mpZYhMq*mQ$K-?LsOs4RujD=~H1sW7_jRORU>~lrc>_X|5syAcoOS*f9N9HXX?E3MSu>T$%n_yWujkEm%o-t4E z_whR4c%Cu5&&HhO0=Bu=%)L_W$_*ASCIa#QAIux_ z%pK-oMit_y1nW^vt=y1m+rE<~^D1l10pk zd2=0b%#Gn1f_7^G?imiO}59|8*RT|91h?Gv@~9t`P*af6R8xlDQNA>p13S989&3|2;Qs zl;5PFxOt1xRyFlq8k$<5mUxSWi)AM}s6AqKs@Ma!hm+zFah#NRMJzsVfdX9>e5I}o z^17+yN2)IBDyN{E$_m(bg>mv#TL{T#n~^PaJzVG>N6yeFP!KJLXXCoyA0|(0WRQwL1Lz+dnD{cq`q#dy9z!@U15sZ8% zIY8cypdm>oV)4t7H~l$LI>KcA>t{e}YByA88sNh9!)T~C48@F7Fki$!kTlfAk^^pV zurm{GeX1p|YEtpKx-RDY;Kc|-E27&z3KhvN3~MnSZpw_%n~Cku#!=CDhQ>)i{{x165$9(k+m^UyPA~dF0~31}J3MPg9u-u|7o~BoyMn zT2B;)ZZ%=kOQ!nbdSh6uCPg-XG=O&(V`!$6Fg{)-PqQSeQ2(zh)P1=DfquDU+d2_= zw`Myj7MOvJUG>DR&<*nQo)K_qhYjYjFd?M`-aOTG{GkV|`?8W6|5^Yk$sopRf-<+~=WQPM=lQw4=;8u9&NA3WA%fgF!k zLFN1!9Fg{;Vyj-_WY=rr&vy={?c$JK!5PCDXT7yQC$LpZf<9>GKBk`vw-bGE9eWcAif)`VE)akAas=j8_sjX>L5{Uuf7aH z3#9P-ei?c|9{Z9yrBBXkFtdTF!o@&uqHjE59#Ey&R0o zYr<)a Date: Mon, 5 Sep 2022 19:26:28 +0530 Subject: [PATCH 280/824] Add lockfile changes action (#818) --- .github/workflows/lockfile.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/lockfile.yml diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml new file mode 100644 index 00000000..ff7bf6f1 --- /dev/null +++ b/.github/workflows/lockfile.yml @@ -0,0 +1,26 @@ +name: NPM Lockfile Changes + +on: + pull_request: + paths: + - 'package-lock.json' + +jobs: + lockfile_changes: + runs-on: ubuntu-latest + # Permission overwrite is required for Dependabot PRs, see "Common issues" below. + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v3.0.2 + - name: NPM Lockfile Changes + uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 + with: + token: ${{ secrets.GITHUB_TOKEN }} + # Optional inputs, can be deleted safely if you are happy with default values. + collapsibleThreshold: 25 + failOnDowngrade: false + path: package-lock.json + updateComment: true \ No newline at end of file From e1adc6a3bce6900b07ffc242c63bfeb0cced5811 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:43:11 +0530 Subject: [PATCH 281/824] Configure Renovate (#819) * Add renovate.json * Add renovate config Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- .github/renovate.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/renovate.json diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..d74593fb --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base" + ], + "labels": [ "Dependencies" ], + "packageRules": [ + { + "matchUpdateTypes": [ "lockFileMaintenance" ] + } + ], + "lockFileMaintenance": { "enabled": true }, + "dependencyDashboard": true, + "dependencyDashboardApproval": true +} \ No newline at end of file From 790bf5eac3761d65debe6766801474750b312b84 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:22:56 +0530 Subject: [PATCH 282/824] Fix wrong notification count --- src/app/organisms/navigation/DrawerBreadcrumb.jsx | 8 ++++---- src/client/state/Notifications.js | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/app/organisms/navigation/DrawerBreadcrumb.jsx b/src/app/organisms/navigation/DrawerBreadcrumb.jsx index be5b345b..face349d 100644 --- a/src/app/organisms/navigation/DrawerBreadcrumb.jsx +++ b/src/app/organisms/navigation/DrawerBreadcrumb.jsx @@ -21,7 +21,7 @@ import ChevronRightIC from '../../../../public/res/ic/outlined/chevron-right.svg function DrawerBreadcrumb({ spaceId }) { const [, forceUpdate] = useState({}); const scrollRef = useRef(null); - const { roomList, notifications } = initMatrix; + const { roomList, notifications, accountData } = initMatrix; const mx = initMatrix.matrixClient; const spacePath = navigation.selectedSpacePath; @@ -49,9 +49,9 @@ function DrawerBreadcrumb({ spaceId }) { }, [spaceId]); function getHomeNotiExcept(childId) { - const orphans = roomList.getOrphans(); - const childIndex = orphans.indexOf(childId); - if (childId !== -1) orphans.splice(childIndex, 1); + const orphans = roomList.getOrphans() + .filter((id) => (id !== childId)) + .filter((id) => !accountData.spaceShortcut.has(id)); let noti = null; diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 90f9b4ad..309c322a 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -114,8 +114,7 @@ class Notifications extends EventEmitter { } getTotalNoti(roomId) { - const { total, highlight } = this.getNoti(roomId); - if (highlight > total) return highlight; + const { total } = this.getNoti(roomId); return total; } @@ -166,7 +165,7 @@ class Notifications extends EventEmitter { _setNoti(roomId, total, highlight) { const addNoti = (id, t, h, fromId) => { - const prevTotal = this.roomIdToNoti.get(id)?.total ?? null; + const prevTotal = this.roomIdToNoti.has(id) ? this.getT : null; const noti = this.getNoti(id); noti.total += t; @@ -181,7 +180,7 @@ class Notifications extends EventEmitter { }; const noti = this.getNoti(roomId); - const addT = total - noti.total; + const addT = (highlight > total ? highlight : total) - noti.total; const addH = highlight - noti.highlight; if (addT < 0 || addH < 0) return; From 19f674cf5f20f2a2f933107ca728b8cc0cd6bd61 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:25:13 +0530 Subject: [PATCH 283/824] Fix unwanted changes --- src/client/state/Notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 309c322a..d332f1f2 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -165,7 +165,7 @@ class Notifications extends EventEmitter { _setNoti(roomId, total, highlight) { const addNoti = (id, t, h, fromId) => { - const prevTotal = this.roomIdToNoti.has(id) ? this.getT : null; + const prevTotal = this.roomIdToNoti.get(id)?.total ?? null; const noti = this.getNoti(id); noti.total += t; From 2ded7d9b1f4f44b9e5749f554e14fd42a4b9ebb9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 7 Sep 2022 08:40:10 +0530 Subject: [PATCH 284/824] Fix crash with unknown mime type --- src/util/mimetypes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/mimetypes.js b/src/util/mimetypes.js index 7a94e0c8..bf7efbce 100644 --- a/src/util/mimetypes.js +++ b/src/util/mimetypes.js @@ -26,6 +26,7 @@ export const ALLOWED_BLOB_MIMETYPES = [ ]; export function getBlobSafeMimeType(mimetype) { + if (typeof mimetype !== 'string') return 'application/octet-stream'; const [type] = mimetype.split(';'); if (!ALLOWED_BLOB_MIMETYPES.includes(type)) { return 'application/octet-stream'; From 4a35aa72722d7b2d0182dc65cbea89ab13fa316c Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 7 Sep 2022 13:14:15 +0530 Subject: [PATCH 285/824] Fix crash in manage device --- .../organisms/profile-editor/ProfileEditor.jsx | 6 +++--- src/app/organisms/settings/DeviceManage.jsx | 16 +++++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index 972192ef..5085bfb9 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -16,11 +16,11 @@ import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import './ProfileEditor.scss'; -// TODO Fix bug that prevents 'Save' button from enabling up until second changed. function ProfileEditor({ userId }) { const [isEditing, setIsEditing] = useState(false); const mx = initMatrix.matrixClient; const user = mx.getUser(mx.getUserId()); + const fallbackUsername = userId.match(/^@?(\S+):(\S+)$/)[1]; const displayNameRef = useRef(null); const [avatarSrc, setAvatarSrc] = useState(user.avatarUrl ? mx.mxcUrlToHttp(user.avatarUrl, 80, 80, 'crop') : null); @@ -96,7 +96,7 @@ function ProfileEditor({ userId }) { const renderInfo = () => (
    - {twemojify(username)} + {twemojify(username) ?? fallbackUsername} - - Last activity - - {dateFormat(new Date(lastTS), ' hh:MM TT, dd/mm/yyyy')} - - {lastIP ? ` at ${lastIP}` : ''} - + {lastTS && ( + + Last activity + + {dateFormat(new Date(lastTS), ' hh:MM TT, dd/mm/yyyy')} + + {lastIP ? ` at ${lastIP}` : ''} + + )} {isCurrentDevice && ( {`Session Key: ${initMatrix.matrixClient.getDeviceEd25519Key().match(/.{1,4}/g).join(' ')}`} From b8a8babc88201a5745238e85a9bf79de5f489a29 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 7 Sep 2022 13:24:26 +0530 Subject: [PATCH 286/824] Fix emojiboard icon background --- src/app/organisms/emoji-board/EmojiBoard.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/emoji-board/EmojiBoard.scss b/src/app/organisms/emoji-board/EmojiBoard.scss index 7f2e2384..683026f0 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.scss +++ b/src/app/organisms/emoji-board/EmojiBoard.scss @@ -38,7 +38,7 @@ @extend .cp-fx__column; } &__nav-twemoji { - background: inherit; + background-color: var(--bg-surface); position: sticky; bottom: -70%; z-index: 999; From 831bb83f4edc385538606d9e0af6463c7eec4c75 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 7 Sep 2022 13:46:44 +0530 Subject: [PATCH 287/824] Update and simplify actions (#831) * Replace action with one we use already * Simplify PR actions * fix name --- .github/workflows/build-pull-request.yml | 24 +++---- .github/workflows/deploy-pull-request.yml | 76 +++++++---------------- .github/workflows/netlify-dev.yml | 26 +++++--- .github/workflows/prod-deploy.yml | 51 +++++++-------- 4 files changed, 75 insertions(+), 102 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 1b7e0aa8..c43d007a 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -6,6 +6,7 @@ on: jobs: build-pull-request: + name: 'Build pull request' runs-on: ubuntu-latest env: PR_NUMBER: ${{github.event.number}} @@ -16,23 +17,22 @@ jobs: uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 + cache: 'npm' + - name: Install dependencies + run: npm ci - name: Build app - run: npm ci && npm run build + run: npm run build - name: Upload artifact uses: actions/upload-artifact@v3.1.0 with: - name: previewbuild + name: preview path: dist retention-days: 1 - - name: Get PR info - uses: actions/github-script@v6.2.0 - with: - script: | - var fs = require('fs'); - fs.writeFileSync('${{github.workspace}}/pr.json', JSON.stringify(context.payload.pull_request)); - - name: Upload PR Info + - name: Save pr number + run: echo ${PR_NUMBER} > ./pr.txt + - name: Upload pr number uses: actions/upload-artifact@v3.1.0 with: - name: pr.json - path: pr.json - retention-days: 1 + name: pr + path: ./pr.txt + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 97aba4a3..f5dbacc5 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -1,68 +1,40 @@ -name: Upload Preview Build to Netlify +name: Deploy PR to Netlify on: workflow_run: workflows: ["Build pull request"] - types: - - completed + types: [completed] jobs: - get-build-and-deploy: + deploy-pull-request: + name: 'Deploy pull request' + runs-on: ubuntu-latest permissions: contents: read pull-requests: write - runs-on: ubuntu-latest - if: > - ${{ github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - # There's a 'download artifact' action but it hasn't been updated for the - # workflow_run action (https://github.com/actions/download-artifact/issues/60) - # so instead we get this mess: + - name: Download pr number + uses: dawidd6/action-download-artifact@7847792dd435a50521b8e3bd3576dae7459d1fa8 + with: + workflow: ${{ github.event.workflow.id }} + run_id: ${{ github.event.workflow_run.id }} + name: pr + - name: Output pr number + id: pr + run: echo "::set-output name=id::$( { - return artifact.name == "previewbuild" - })[0]; - var download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', - }); - var fs = require('fs'); - fs.writeFileSync('${{github.workspace}}/previewbuild.zip', Buffer.from(download.data)); - var prInfoArtifact = artifacts.data.artifacts.filter((artifact) => { - return artifact.name == "pr.json" - })[0]; - var download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: prInfoArtifact.id, - archive_format: 'zip', - }); - var fs = require('fs'); - fs.writeFileSync('${{github.workspace}}/pr.json.zip', Buffer.from(download.data)); - - name: Extract Artifacts - run: unzip -d dist previewbuild.zip && rm previewbuild.zip && unzip pr.json.zip && rm pr.json.zip - - name: Read PR Info - id: readctx - uses: actions/github-script@v6.2.0 - with: - script: | - var fs = require('fs'); - var pr = JSON.parse(fs.readFileSync('${{github.workspace}}/pr.json')); - console.log(`::set-output name=prnumber::${pr.number}`); + workflow: ${{ github.event.workflow.id }} + run_id: ${{ github.event.workflow_run.id }} + name: preview + path: dist - name: Deploy to Netlify id: netlify uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 with: publish-dir: dist - deploy-message: "Deploy from GitHub Actions" + deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" + alias: ${{ steps.pr.outputs.id }} # These don't work because we're in workflow_run enable-pull-request-comment: false enable-commit-comment: false @@ -75,7 +47,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - pull-request-number: ${{ steps.readctx.outputs.prnumber }} + pull-request-number: ${{ steps.pr.outputs.id }} description-message: | Preview: ${{ steps.netlify.outputs.deploy-url }} - ⚠️ Exercise caution. Use test accounts. ⚠️ + ⚠️ Exercise caution. Use test accounts. ⚠️ \ No newline at end of file diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 89d526b6..4a068d2e 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -7,10 +7,8 @@ on: jobs: deploy-to-netlify: - name: 'Deploy' + name: 'Deploy to Netlify' runs-on: ubuntu-latest - permissions: - contents: read steps: - name: Checkout repository uses: actions/checkout@v3.0.2 @@ -18,12 +16,22 @@ jobs: uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - - name: Build and deploy to Netlify - uses: jsmrcaga/action-netlify-deploy@53de32e559b0b3833615b9788c7a090cd2fddb03 + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Build app + run: npm run build + - name: Deploy to Netlify + uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 with: - install_command: "npm ci" + publish-dir: dist + deploy-message: "Dev deploy ${{ github.sha }}" + enable-commit-comment: false + github-token: ${{ secrets.GITHUB_TOKEN }} + production-deploy: true + github-deployment-environment: nightly + github-deployment-description: 'Nightly deployment on each commit to dev branch' + env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE2_ID }} - BUILD_DIRECTORY: "dist" - NETLIFY_DEPLOY_MESSAGE: "Dev deploy v${{ github.ref }}" - NETLIFY_DEPLOY_TO_PROD: true + timeout-minutes: 1 diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 37b51791..3c7a4c35 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -5,8 +5,8 @@ on: types: [published] jobs: - create-release-tar: - name: 'Create release tar' + deploy-and-tarball: + name: 'Netlify deploy and tarball' runs-on: ubuntu-latest steps: - name: Checkout repository @@ -15,10 +15,25 @@ jobs: uses: actions/setup-node@v3.4.1 with: node-version: 17.9.0 - - name: Build - run: | - npm ci - npm run build + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Build app + run: npm run build + - name: Deploy to Netlify + uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 + with: + publish-dir: dist + deploy-message: "Prod deploy ${{ github.ref_name }}" + enable-commit-comment: false + github-token: ${{ secrets.GITHUB_TOKEN }} + production-deploy: true + github-deployment-environment: stable + github-deployment-description: 'Stable deployment on each release' + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 - name: Get version from tag id: vars run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} @@ -41,29 +56,7 @@ jobs: cinny-${{ steps.vars.outputs.tag }}.tar.gz cinny-${{ steps.vars.outputs.tag }}.tar.gz.asc - deploy-to-netlify: - name: 'Deploy to Netlify' - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v3.0.2 - - name: Setup node - uses: actions/setup-node@v3.4.1 - with: - node-version: 17.9.0 - - name: Build and deploy to Netlify - uses: jsmrcaga/action-netlify-deploy@53de32e559b0b3833615b9788c7a090cd2fddb03 - with: - install_command: "npm ci" - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - BUILD_DIRECTORY: "dist" - NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}" - NETLIFY_DEPLOY_TO_PROD: true - - push-to-dockerhub: + publish-image: name: Push Docker image to Docker Hub, ghcr runs-on: ubuntu-latest permissions: From 29ddcfa1f9ca253c50286126ae42d261f1ca29fc Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 11 Sep 2022 08:27:59 +0530 Subject: [PATCH 288/824] Update command strings --- .github/workflows/docker-pr.yml | 2 -- src/app/organisms/profile-editor/ProfileEditor.jsx | 5 ++--- src/app/organisms/room/commands.jsx | 8 ++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 1e7a71f3..922e0c0e 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -9,8 +9,6 @@ on: jobs: docker-build: runs-on: ubuntu-latest - env: - PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository uses: actions/checkout@v3.0.2 diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index 5085bfb9..bb7359da 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -20,7 +20,6 @@ function ProfileEditor({ userId }) { const [isEditing, setIsEditing] = useState(false); const mx = initMatrix.matrixClient; const user = mx.getUser(mx.getUserId()); - const fallbackUsername = userId.match(/^@?(\S+):(\S+)$/)[1]; const displayNameRef = useRef(null); const [avatarSrc, setAvatarSrc] = useState(user.avatarUrl ? mx.mxcUrlToHttp(user.avatarUrl, 80, 80, 'crop') : null); @@ -96,7 +95,7 @@ function ProfileEditor({ userId }) { const renderInfo = () => (
    - {twemojify(username) ?? fallbackUsername} + {twemojify(username) ?? userId} { const mx = initMatrix.matrixClient; const rawIds = data.split(' '); @@ -78,7 +78,7 @@ const commands = { }, join: { name: 'join', - description: 'Join room with alias. Example: /join alias1 alias2', + description: 'Join room with address. Example: /join address1 address2', exe: (roomId, data) => { const rawIds = data.split(' '); const roomIds = rawIds.filter((id) => id.match(ROOM_ID_ALIAS_REG)); @@ -159,7 +159,7 @@ const commands = { }, myroomnick: { name: 'myroomnick', - description: 'Change my room nick', + description: 'Change nick in current room.', exe: (roomId, data) => { const nick = data.trim(); if (nick === '') return; @@ -168,7 +168,7 @@ const commands = { }, myroomavatar: { name: 'myroomavatar', - description: 'Change my room avatar. Example /myroomavatar mxc://xyzabc', + description: 'Change profile picture in current room. Example /myroomavatar mxc://xyzabc', exe: (roomId, data) => { if (data.match(MXC_REG)) { roomActions.setMyRoomAvatar(roomId, data); From 5848c02d508db8b75fa1de82a19f9f038d23294e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 11 Sep 2022 09:19:22 +0530 Subject: [PATCH 289/824] Remove markdown icon from input --- src/app/organisms/room/RoomViewInput.jsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 0a0a171c..8f2780cd 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -30,7 +30,6 @@ import StickerIC from '../../../../public/res/ic/outlined/sticker.svg'; import ShieldIC from '../../../../public/res/ic/outlined/shield.svg'; import VLCIC from '../../../../public/res/ic/outlined/vlc.svg'; import VolumeFullIC from '../../../../public/res/ic/outlined/volume-full.svg'; -import MarkdownIC from '../../../../public/res/ic/outlined/markdown.svg'; import FileIC from '../../../../public/res/ic/outlined/file.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; @@ -44,7 +43,6 @@ function RoomViewInput({ roomId, roomTimeline, viewEvent, }) { const [attachment, setAttachment] = useState(null); - const [isMarkdown, setIsMarkdown] = useState(settings.isMarkdown); const [replyTo, setReplyTo] = useState(null); const textAreaRef = useRef(null); @@ -63,11 +61,9 @@ function RoomViewInput({ } useEffect(() => { - settings.on(cons.events.settings.MARKDOWN_TOGGLED, setIsMarkdown); roomsInput.on(cons.events.roomsInput.ATTACHMENT_SET, setAttachment); viewEvent.on('focus_msg_input', requestFocusInput); return () => { - settings.removeListener(cons.events.settings.MARKDOWN_TOGGLED, setIsMarkdown); roomsInput.removeListener(cons.events.roomsInput.ATTACHMENT_SET, setAttachment); viewEvent.removeListener('focus_msg_input', requestFocusInput); }; @@ -379,7 +375,6 @@ function RoomViewInput({ /> - {isMarkdown && }
    Date: Sun, 11 Sep 2022 12:18:32 +0530 Subject: [PATCH 290/824] Add plain text command --- src/app/organisms/room/RoomViewInput.jsx | 13 ++++++++----- src/app/organisms/room/commands.jsx | 13 +++++++++++-- src/client/state/RoomsInput.js | 24 ++++++++++++++---------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 8f2780cd..de72e2bb 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -181,7 +181,10 @@ function RoomViewInput({ }; }, [roomId]); - const sendBody = async (body, msgType = 'm.text') => { + const sendBody = async (body, options) => { + const opt = options ?? {}; + if (!opt.msgType) opt.msgType = 'm.text'; + if (typeof opt.autoMarkdown !== 'boolean') opt.autoMarkdown = true; if (roomsInput.isSending(roomId)) return; sendIsTyping(false); @@ -191,7 +194,7 @@ function RoomViewInput({ } textAreaRef.current.disabled = true; textAreaRef.current.style.cursor = 'not-allowed'; - await roomsInput.sendInput(roomId, msgType); + await roomsInput.sendInput(roomId, opt); textAreaRef.current.disabled = false; textAreaRef.current.style.cursor = 'unset'; focusInput(); @@ -209,8 +212,8 @@ function RoomViewInput({ confirmDialog('Invalid Command', `"${cmdName}" is not a valid command.`, 'Alright'); return; } - if (['me', 'shrug'].includes(cmdName)) { - commands[cmdName].exe(roomId, cmdData, (message, msgType) => sendBody(message, msgType)); + if (['me', 'shrug', 'plain'].includes(cmdName)) { + commands[cmdName].exe(roomId, cmdData, sendBody); return; } commands[cmdName].exe(roomId, cmdData); @@ -226,7 +229,7 @@ function RoomViewInput({ return; } if (msgBody === '' && attachment === null) return; - sendBody(msgBody, 'm.text'); + sendBody(msgBody); }; const handleSendSticker = async (data) => { diff --git a/src/app/organisms/room/commands.jsx b/src/app/organisms/room/commands.jsx index cceaf045..463f9d94 100644 --- a/src/app/organisms/room/commands.jsx +++ b/src/app/organisms/room/commands.jsx @@ -38,7 +38,7 @@ const commands = { exe: (roomId, data, onSuccess) => { const body = data.trim(); if (body === '') return; - onSuccess(body, 'm.emote'); + onSuccess(body, { msgType: 'm.emote' }); }, }, shrug: { @@ -46,9 +46,18 @@ const commands = { description: 'Send ¯\\_(ツ)_/¯ as message', exe: (roomId, data, onSuccess) => onSuccess( `¯\\_(ツ)_/¯${data.trim() !== '' ? ` ${data}` : ''}`, - 'm.text', + { msgType: 'm.text' }, ), }, + plain: { + name: 'plain', + description: 'Send plain text message', + exe: (roomId, data, onSuccess) => { + const body = data.trim(); + if (body === '') return; + onSuccess(body, { msgType: 'm.text', autoMarkdown: false }); + }, + }, help: { name: 'help', description: 'View all commands', diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 4277b2f0..e6778711 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -274,7 +274,8 @@ class RoomsInput extends EventEmitter { return this.roomIdToInput.get(roomId)?.isSending || false; } - async sendInput(roomId, msgType) { + async sendInput(roomId, options) { + const { msgType, autoMarkdown } = options; const room = this.matrixClient.getRoom(roomId); const input = this.getInput(roomId); input.isSending = true; @@ -292,19 +293,22 @@ class RoomsInput extends EventEmitter { }; // Apply formatting if relevant - let formattedBody = settings.isMarkdown + let formattedBody = settings.isMarkdown && autoMarkdown ? getFormattedBody(rawMessage) : sanitizeText(rawMessage); - formattedBody = formatUserPill(room, formattedBody); - formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + if (autoMarkdown) { + formattedBody = formatUserPill(room, formattedBody); + formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); + } - content.body = findAndReplace( - content.body, - MXID_REGEX, - (match) => room.currentState.userIdsToDisplayNames[match[0]], - (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, - ); if (formattedBody !== sanitizeText(rawMessage)) { // Formatting was applied, and we need to switch to custom HTML content.format = 'org.matrix.custom.html'; From 0a2cca6e40f2fe5f2798f2fb81835fbcef576924 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 11 Sep 2022 13:14:39 +0200 Subject: [PATCH 291/824] Change UI label (#832) --- src/app/organisms/navigation/DrawerHeader.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/navigation/DrawerHeader.jsx b/src/app/organisms/navigation/DrawerHeader.jsx index ba1882b7..e8782e38 100644 --- a/src/app/organisms/navigation/DrawerHeader.jsx +++ b/src/app/organisms/navigation/DrawerHeader.jsx @@ -57,7 +57,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) { iconSrc={HashGlobeIC} onClick={() => { afterOptionSelect(); openPublicRooms(); }} > - Join public room + Explore public rooms )} { !spaceId && ( From a343d9999e1cddbde72ce6570517783e507dcd47 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 11 Sep 2022 15:21:05 +0200 Subject: [PATCH 292/824] Handle messages with invalid body (#833) --- src/app/molecules/message/Message.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 7d3ee63b..ab05e0e8 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -737,7 +737,6 @@ function Message({ replyTo(senderId, mEvent.getId(), body); }, [body]); - if (body === undefined) return null; if (msgType === 'm.emote') className.push('message--type-emote'); let isCustomHTML = content.format === 'org.matrix.custom.html'; @@ -752,13 +751,14 @@ function Message({ const editedList = editedTimeline.get(eventId); const editedMEvent = editedList[editedList.length - 1]; [body, isCustomHTML, customHTML] = getEditedBody(editedMEvent); - if (typeof body !== 'string') return null; } if (isReply) { body = parseReply(body)?.body ?? body; } + if (typeof body !== 'string') body = ''; + return (
    { From b0174f3acc1448d32c10e8977e64195b4e5265d1 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 11 Sep 2022 15:21:59 +0200 Subject: [PATCH 293/824] Delete notifications after messages have been read or deleted (#830) * Delete read notifications * Delete notifications for deleted messages * Correctly remove notification --- src/client/state/Notifications.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index d332f1f2..da4521dd 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -43,6 +43,8 @@ class Notifications extends EventEmitter { this.roomList = roomList; this.roomIdToNoti = new Map(); + this.roomIdToPopupNotis = new Map(); + this.eventIdToPopupNoti = new Map(); // this._initNoti(); this._listenEvents(); @@ -258,17 +260,38 @@ class Notifications extends EventEmitter { const noti = new window.Notification(title, { body: mEvent.getContent().body, icon, + tag: mEvent.getId(), silent: settings.isNotificationSounds, }); if (settings.isNotificationSounds) { noti.onshow = () => this._playNotiSound(); } noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); + + this.eventIdToPopupNoti.set(mEvent.getId(), noti); + if (this.roomIdToPopupNotis.has(room.roomId)) { + this.roomIdToPopupNotis.get(room.roomId).push(noti); + } else { + this.roomIdToPopupNotis.set(room.roomId, [noti]); + } } else { this._playNotiSound(); } } + _deletePopupNoti(eventId) { + this.eventIdToPopupNoti.get(eventId)?.close(); + this.eventIdToPopupNoti.delete(eventId); + } + + _deletePopupRoomNotis(roomId) { + this.roomIdToPopupNotis.get(roomId)?.forEach((n) => { + this.eventIdToPopupNoti.delete(n.tag); + n.close(); + }); + this.roomIdToPopupNotis.delete(roomId); + } + _playNotiSound() { if (!this._notiAudio) { this._notiAudio = document.getElementById('notificationSound'); @@ -285,6 +308,8 @@ class Notifications extends EventEmitter { _listenEvents() { this.matrixClient.on('Room.timeline', (mEvent, room) => { + if (mEvent.isRedaction()) this._deletePopupNoti(mEvent.event.redacts); + if (room.isSpaceRoom()) return; if (!isNotifEvent(mEvent)) return; @@ -355,6 +380,8 @@ class Notifications extends EventEmitter { if (readerUserId !== this.matrixClient.getUserId()) return; this.deleteNoti(room.roomId); + + this._deletePopupRoomNotis(room.roomId); } }); From a6c339e13a31e354f8fe1dedbcd69eece33dbb32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:53:03 +0530 Subject: [PATCH 294/824] Bump html-webpack-plugin from 5.3.1 to 5.5.0 (#829) Bumps [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin) from 5.3.1 to 5.5.0. - [Release notes](https://github.com/jantimon/html-webpack-plugin/releases) - [Changelog](https://github.com/jantimon/html-webpack-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/jantimon/html-webpack-plugin/compare/v5.3.1...v5.5.0) --- updated-dependencies: - dependency-name: html-webpack-plugin dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 226 ++++++++-------------------------------------- package.json | 2 +- 2 files changed, 38 insertions(+), 190 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ffd934e..7cd416cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,7 +60,7 @@ "eslint-plugin-react": "7.31.1", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.1.0", - "html-webpack-plugin": "5.3.1", + "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.54.5", @@ -2172,9 +2172,9 @@ } }, "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "node_modules/@types/http-proxy": { @@ -6475,15 +6475,15 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", "tapable": "^2.0.0" }, "engines": { @@ -6497,71 +6497,6 @@ "webpack": "^5.20.0" } }, - "node_modules/html-webpack-plugin/node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-webpack-plugin/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/terser/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 - }, "node_modules/htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -9328,13 +9263,13 @@ } }, "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "dependencies": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, "node_modules/process-nextick-args": { @@ -9826,25 +9761,16 @@ } }, "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "strip-ansi": "^6.0.1" } }, "node_modules/renderkid/node_modules/dom-serializer": { @@ -9918,18 +9844,6 @@ "entities": "^2.0.0" } }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -13448,9 +13362,9 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "@types/http-proxy": { @@ -16841,67 +16755,16 @@ } }, "html-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "requires": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", "tapable": "^2.0.0" - }, - "dependencies": { - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - } - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "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 - } - } - } } }, "htmlparser2": { @@ -18921,13 +18784,13 @@ "dev": true }, "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, "process-nextick-args": { @@ -19305,24 +19168,18 @@ "dev": true }, "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" + "strip-ansi": "^6.0.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -19371,15 +19228,6 @@ "domutils": "^2.5.2", "entities": "^2.0.0" } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } } } }, diff --git a/package.json b/package.json index cd9967e5..7919511b 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-plugin-react": "7.31.1", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.1.0", - "html-webpack-plugin": "5.3.1", + "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.54.5", From 3e2cc8bfae93339efcab603c9786204161928036 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:54:24 +0530 Subject: [PATCH 295/824] Bump @babel/preset-env from 7.18.10 to 7.19.0 (#825) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.10 to 7.19.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.19.0/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 312 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 158 insertions(+), 156 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cd416cb..3b33d015 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@babel/core": "7.18.13", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", @@ -105,9 +105,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", - "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -144,12 +144,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.13", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -197,12 +197,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -236,9 +236,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -290,13 +290,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -339,9 +339,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -349,9 +349,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -370,9 +370,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -563,13 +563,13 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", + "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -1081,16 +1081,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -1277,14 +1278,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1312,13 +1313,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1500,12 +1501,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { @@ -1592,18 +1593,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", + "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.0", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1637,9 +1638,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -1649,9 +1650,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -1659,14 +1660,14 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.2", "babel-plugin-polyfill-corejs3": "^0.5.3", "babel-plugin-polyfill-regenerator": "^0.4.0", @@ -1766,19 +1767,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1787,9 +1788,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.18.10", @@ -11873,9 +11874,9 @@ } }, "@babel/compat-data": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", - "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", "dev": true }, "@babel/core": { @@ -11902,12 +11903,12 @@ } }, "@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "requires": { - "@babel/types": "^7.18.13", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -11945,12 +11946,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -11972,9 +11973,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -12011,13 +12012,13 @@ } }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { @@ -12048,9 +12049,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -12058,9 +12059,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helper-optimise-call-expression": { @@ -12073,9 +12074,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -12183,9 +12184,9 @@ } }, "@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12209,13 +12210,13 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", + "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } @@ -12550,16 +12551,17 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -12674,14 +12676,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -12697,13 +12699,13 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { @@ -12813,12 +12815,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, @@ -12869,18 +12871,18 @@ } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", + "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.0", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -12914,9 +12916,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -12926,9 +12928,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -12936,14 +12938,14 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.2", "babel-plugin-polyfill-corejs3": "^0.5.3", "babel-plugin-polyfill-regenerator": "^0.4.0", @@ -13023,27 +13025,27 @@ } }, "@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.18.10", diff --git a/package.json b/package.json index 7919511b..0e2e2c04 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ }, "devDependencies": { "@babel/core": "7.18.13", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", From 2be706fb3f2dd3b44c3e8ee7d80cba5099077625 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:57:15 +0530 Subject: [PATCH 296/824] Bump eslint-plugin-react from 7.31.1 to 7.31.8 (#838) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.1 to 7.31.8. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.1...v7.31.8) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b33d015..07a9ccf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.1", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.1.0", "html-webpack-plugin": "5.5.0", @@ -5127,9 +5127,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -15823,9 +15823,9 @@ } }, "eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "dev": true, "requires": { "array-includes": "^3.1.5", diff --git a/package.json b/package.json index 0e2e2c04..9c8f63b6 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.1", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.1.0", "html-webpack-plugin": "5.5.0", From 55c652a02a687341b8c544ca8e2e5a188c3a2488 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:58:33 +0530 Subject: [PATCH 297/824] Bump webpack-merge from 5.7.3 to 5.8.0 (#822) Bumps [webpack-merge](https://github.com/survivejs/webpack-merge) from 5.7.3 to 5.8.0. - [Release notes](https://github.com/survivejs/webpack-merge/releases) - [Changelog](https://github.com/survivejs/webpack-merge/blob/develop/CHANGELOG.md) - [Commits](https://github.com/survivejs/webpack-merge/compare/v5.7.3...v5.8.0) --- updated-dependencies: - dependency-name: webpack-merge dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07a9ccf4..e05d983d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,7 @@ "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.10.1", - "webpack-merge": "5.7.3" + "webpack-merge": "5.8.0" }, "engines": { "node": ">=14.15.0", @@ -11630,9 +11630,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -20577,9 +20577,9 @@ } }, "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { "clone-deep": "^4.0.1", diff --git a/package.json b/package.json index 9c8f63b6..ee85a50b 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,6 @@ "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.10.1", - "webpack-merge": "5.7.3" + "webpack-merge": "5.8.0" } } From 9fb651a04eeff6547bdd5b965e180ba612e230da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:59:16 +0530 Subject: [PATCH 298/824] Bump @babel/core from 7.18.13 to 7.19.0 (#824) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.13 to 7.19.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.19.0/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 66 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index e05d983d..9050a309 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.18.13", + "@babel/core": "7.19.0", "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "assert": "2.0.0", @@ -114,21 +114,21 @@ } }, "node_modules/@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -491,14 +491,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -11880,21 +11880,21 @@ "dev": true }, "@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -12162,14 +12162,14 @@ } }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/highlight": { diff --git a/package.json b/package.json index ee85a50b..1538d5fe 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.18.13", + "@babel/core": "7.19.0", "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "assert": "2.0.0", From efda9991f2e92dfbf9e5fc7ae7aa7dddbc8c0ce6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:59:31 +0530 Subject: [PATCH 299/824] Bump sass from 1.54.5 to 1.54.9 (#837) Bumps [sass](https://github.com/sass/dart-sass) from 1.54.5 to 1.54.9. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.54.5...1.54.9) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9050a309..f08260ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.54.5", + "sass": "1.54.9", "sass-loader": "13.0.2", "stream-browserify": "3.0.0", "style-loader": "3.3.1", @@ -10118,9 +10118,9 @@ } }, "node_modules/sass": { - "version": "1.54.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.5.tgz", - "integrity": "sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==", + "version": "1.54.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", + "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19432,9 +19432,9 @@ } }, "sass": { - "version": "1.54.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.5.tgz", - "integrity": "sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==", + "version": "1.54.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", + "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 1538d5fe..7c9eb1ee 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.54.5", + "sass": "1.54.9", "sass-loader": "13.0.2", "stream-browserify": "3.0.0", "style-loader": "3.3.1", From 15c1f6dadf2ade072ffd6fb8ad51781953de88d8 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Wed, 14 Sep 2022 11:00:06 +0200 Subject: [PATCH 300/824] Allow rendering messages as plaintext (#805) * Parse room input from user id and emoji * Add more plain outputs * Add reply support * Always include formatted reply * Add room mention parser * Allow single linebreak after codeblock * Remove margin from math display blocks * Escape shrug * Rewrite HTML tag function * Normalize def keys * Fix embedding replies into replies * Don't add margin to file name * Collapse spaces in HTML message body * Don't crash with no plaintext rendering * Add blockquote support * Remove ref support * Fix image html rendering * Remove debug output * Remove duplicate default option value * Add table plain rendering support * Correctly handle paragraph padding when mixed with block content * Simplify links if possible * Make blockquote plain rendering better * Don't error when emojis are matching but not found * Allow plain only messages with newlines * Set user id as user mention fallback * Fix mixed up variable name * Replace replaceAll with replace --- src/app/atoms/math/Math.jsx | 1 + src/app/atoms/math/Math.scss | 3 + src/app/molecules/message/Message.jsx | 15 +- src/app/molecules/message/Message.scss | 6 +- src/app/organisms/room/RoomViewInput.jsx | 6 +- src/client/action/navigation.js | 3 +- src/client/state/RoomsInput.js | 247 ++++++------------- src/client/state/navigation.js | 1 + src/util/markdown.js | 287 ++++++++++++++++++++--- src/util/matrixUtil.js | 10 + 10 files changed, 368 insertions(+), 211 deletions(-) create mode 100644 src/app/atoms/math/Math.scss diff --git a/src/app/atoms/math/Math.jsx b/src/app/atoms/math/Math.jsx index 87f85899..ab52a478 100644 --- a/src/app/atoms/math/Math.jsx +++ b/src/app/atoms/math/Math.jsx @@ -1,5 +1,6 @@ import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; +import './Math.scss'; import katex from 'katex'; import 'katex/dist/katex.min.css'; diff --git a/src/app/atoms/math/Math.scss b/src/app/atoms/math/Math.scss new file mode 100644 index 00000000..306b147c --- /dev/null +++ b/src/app/atoms/math/Math.scss @@ -0,0 +1,3 @@ +.katex-display { + margin: 0 !important; +} diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index ab05e0e8..02a5562c 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -8,7 +8,9 @@ import './Message.scss'; import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; -import { getUsername, getUsernameOfRoomMember, parseReply } from '../../../util/matrixUtil'; +import { + getUsername, getUsernameOfRoomMember, parseReply, trimHTMLReply, +} from '../../../util/matrixUtil'; import colorMXID from '../../../util/colorMXID'; import { getEventCords } from '../../../util/common'; import { redactEvent, sendReaction } from '../../../client/action/roomTimeline'; @@ -248,7 +250,7 @@ const MessageBody = React.memo(({ if (!isCustomHTML) { // If this is a plaintext message, wrap it in a

    element (automatically applying // white-space: pre-wrap) in order to preserve newlines - content = (

    {content}

    ); + content = (

    {content}

    ); } return ( @@ -729,23 +731,23 @@ function Message({ let { body } = content; const username = mEvent.sender ? getUsernameOfRoomMember(mEvent.sender) : getUsername(senderId); const avatarSrc = mEvent.sender?.getAvatarUrl(initMatrix.matrixClient.baseUrl, 36, 36, 'crop') ?? null; + let isCustomHTML = content.format === 'org.matrix.custom.html'; + let customHTML = isCustomHTML ? content.formatted_body : null; const edit = useCallback(() => { setEdit(eventId); }, []); const reply = useCallback(() => { - replyTo(senderId, mEvent.getId(), body); - }, [body]); + replyTo(senderId, mEvent.getId(), body, customHTML); + }, [body, customHTML]); if (msgType === 'm.emote') className.push('message--type-emote'); - let isCustomHTML = content.format === 'org.matrix.custom.html'; const isEdited = roomTimeline ? editedTimeline.has(eventId) : false; const haveReactions = roomTimeline ? reactionTimeline.has(eventId) || !!mEvent.getServerAggregatedRelation('m.annotation') : false; const isReply = !!mEvent.replyEventId; - let customHTML = isCustomHTML ? content.formatted_body : null; if (isEdited) { const editedList = editedTimeline.get(eventId); @@ -755,6 +757,7 @@ function Message({ if (isReply) { body = parseReply(body)?.body ?? body; + customHTML = trimHTMLReply(customHTML); } if (typeof body !== 'string') body = ''; diff --git a/src/app/molecules/message/Message.scss b/src/app/molecules/message/Message.scss index 66d0c7ec..5dda9c98 100644 --- a/src/app/molecules/message/Message.scss +++ b/src/app/molecules/message/Message.scss @@ -163,7 +163,7 @@ .message__body { word-break: break-word; - & > .text > * { + & > .text > .message__body-plain { white-space: pre-wrap; } @@ -174,8 +174,8 @@ white-space: initial !important; } - & p:not(:last-child) { - margin-bottom: var(--sp-normal); + & > .text > p + p { + margin-top: var(--sp-normal); } & span[data-mx-pill] { diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index de72e2bb..c43eb601 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -143,9 +143,11 @@ function RoomViewInput({ textAreaRef.current.focus(); } - function setUpReply(userId, eventId, body) { + function setUpReply(userId, eventId, body, formattedBody) { setReplyTo({ userId, eventId, body }); - roomsInput.setReplyTo(roomId, { userId, eventId, body }); + roomsInput.setReplyTo(roomId, { + userId, eventId, body, formattedBody, + }); focusInput(); } diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index 1292d56d..4ee78a63 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -139,12 +139,13 @@ export function openViewSource(event) { }); } -export function replyTo(userId, eventId, body) { +export function replyTo(userId, eventId, body, formattedBody) { appDispatcher.dispatch({ type: cons.actions.navigation.CLICK_REPLY_TO, userId, eventId, body, + formattedBody, }); } diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index e6778711..fb4b6c31 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -6,11 +6,9 @@ import { getBlobSafeMimeType } from '../../util/mimetypes'; import { sanitizeText } from '../../util/sanitize'; import cons from './cons'; import settings from './settings'; -import { htmlOutput, parser } from '../../util/markdown'; +import { markdown, plain } from '../../util/markdown'; const blurhashField = 'xyz.amorgan.blurhash'; -const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; -const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; function encodeBlurhash(img) { const canvas = document.createElement('canvas'); @@ -100,91 +98,6 @@ function getVideoThumbnail(video, width, height, mimeType) { }); } -function getFormattedBody(markdown) { - let content = parser(markdown); - if (content.length === 1 && content[0].type === 'paragraph') { - content = content[0].content; - } - return htmlOutput(content); -} - -function getReplyFormattedBody(roomId, reply) { - const replyToLink = `In reply to`; - const userLink = `${reply.userId}`; - const formattedReply = getFormattedBody(reply.body.replace(/\n/g, '\n> ')); - return `
    ${replyToLink}${userLink}
    ${formattedReply}
    `; -} - -function bindReplyToContent(roomId, reply, content) { - const newContent = { ...content }; - newContent.body = `> <${reply.userId}> ${reply.body.replace(/\n/g, '\n> ')}`; - newContent.body += `\n\n${content.body}`; - newContent.format = 'org.matrix.custom.html'; - newContent['m.relates_to'] = content['m.relates_to'] || {}; - newContent['m.relates_to']['m.in_reply_to'] = { event_id: reply.eventId }; - - const formattedReply = getReplyFormattedBody(roomId, reply); - newContent.formatted_body = formattedReply + (content.formatted_body || content.body); - return newContent; -} - -function findAndReplace(text, regex, filter, replace) { - let copyText = text; - Array.from(copyText.matchAll(regex)) - .filter(filter) - .reverse() /* to replace backward to forward */ - .forEach((match) => { - const matchText = match[0]; - const tag = replace(match); - - copyText = copyText.substr(0, match.index) - + tag - + copyText.substr(match.index + matchText.length); - }); - return copyText; -} - -function formatUserPill(room, text) { - const { userIdsToDisplayNames } = room.currentState; - return findAndReplace( - text, - MXID_REGEX, - (match) => userIdsToDisplayNames[match[0]], - (match) => ( - `@${userIdsToDisplayNames[match[0]]}` - ), - ); -} - -function formatEmoji(mx, room, roomList, text) { - const parentIds = roomList.getAllParentSpaces(room.roomId); - const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); - const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); - - return findAndReplace( - text, - SHORTCODE_REGEX, - (match) => allEmoji.has(match[1]), - (match) => { - const emoji = allEmoji.get(match[1]); - - let tag; - if (emoji.mxc) { - tag = `:${
-          emoji.shortcode
-        }:`; - } else { - tag = emoji.unicode; - } - return tag; - }, - ); -} - class RoomsInput extends EventEmitter { constructor(mx, roomList) { super(); @@ -274,9 +187,76 @@ class RoomsInput extends EventEmitter { return this.roomIdToInput.get(roomId)?.isSending || false; } - async sendInput(roomId, options) { - const { msgType, autoMarkdown } = options; + getContent(roomId, options, message, reply, edit) { + const msgType = options?.msgType || 'm.text'; + const autoMarkdown = options?.autoMarkdown ?? true; + const room = this.matrixClient.getRoom(roomId); + + const userNames = room.currentState.userIdsToDisplayNames; + const parentIds = this.roomList.getAllParentSpaces(room.roomId); + const parentRooms = [...parentIds].map((id) => this.matrixClient.getRoom(id)); + const emojis = getShortcodeToEmoji(this.matrixClient, [room, ...parentRooms]); + + const output = settings.isMarkdown && autoMarkdown ? markdown : plain; + const body = output(message, { userNames, emojis }); + + const content = { + body: body.plain, + msgtype: msgType, + }; + + if (!body.onlyPlain || reply) { + content.format = 'org.matrix.custom.html'; + content.formatted_body = body.html; + } + + if (edit) { + content['m.new_content'] = { ...content }; + content['m.relates_to'] = { + event_id: edit.getId(), + rel_type: 'm.replace', + }; + + const isReply = edit.getWireContent()['m.relates_to']?.['m.in_reply_to']; + if (isReply) { + content.format = 'org.matrix.custom.html'; + content.formatted_body = body.html; + } + + content.body = ` * ${content.body}`; + if (content.formatted_body) content.formatted_body = ` * ${content.formatted_body}`; + + if (isReply) { + const eBody = edit.getContent().body; + const replyHead = eBody.substring(0, eBody.indexOf('\n\n')); + if (replyHead) content.body = `${replyHead}\n\n${content.body}`; + + const eFBody = edit.getContent().formatted_body; + const fReplyHead = eFBody.substring(0, eFBody.indexOf('')); + if (fReplyHead) content.formatted_body = `${fReplyHead}${content.formatted_body}`; + } + } + + if (reply) { + content['m.relates_to'] = { + 'm.in_reply_to': { + event_id: reply.eventId, + }, + }; + + content.body = `> <${reply.userId}> ${reply.body.replace(/\n/g, '\n> ')}\n\n${content.body}`; + + const replyToLink = `In reply to`; + const userLink = `${sanitizeText(reply.userId)}`; + const fallback = `
    ${replyToLink}${userLink}
    ${reply.formattedBody || sanitizeText(reply.body)}
    `; + content.formatted_body = fallback + content.formatted_body; + } + + return content; + } + + async sendInput(roomId, options) { const input = this.getInput(roomId); input.isSending = true; this.roomIdToInput.set(roomId, input); @@ -286,38 +266,7 @@ class RoomsInput extends EventEmitter { } if (this.getMessage(roomId).trim() !== '') { - const rawMessage = input.message; - let content = { - body: rawMessage, - msgtype: msgType ?? 'm.text', - }; - - // Apply formatting if relevant - let formattedBody = settings.isMarkdown && autoMarkdown - ? getFormattedBody(rawMessage) - : sanitizeText(rawMessage); - - if (autoMarkdown) { - formattedBody = formatUserPill(room, formattedBody); - formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); - - content.body = findAndReplace( - content.body, - MXID_REGEX, - (match) => room.currentState.userIdsToDisplayNames[match[0]], - (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, - ); - } - - if (formattedBody !== sanitizeText(rawMessage)) { - // Formatting was applied, and we need to switch to custom HTML - content.format = 'org.matrix.custom.html'; - content.formatted_body = formattedBody; - } - - if (typeof input.replyTo !== 'undefined') { - content = bindReplyToContent(roomId, input.replyTo, content); - } + const content = this.getContent(roomId, options, input.message, input.replyTo); this.matrixClient.sendMessage(roomId, content); } @@ -460,55 +409,13 @@ class RoomsInput extends EventEmitter { } async sendEditedMessage(roomId, mEvent, editedBody) { - const room = this.matrixClient.getRoom(roomId); - const isReply = typeof mEvent.getWireContent()['m.relates_to']?.['m.in_reply_to'] !== 'undefined'; - - const msgtype = mEvent.getWireContent().msgtype ?? 'm.text'; - - const content = { - body: ` * ${editedBody}`, - msgtype, - 'm.new_content': { - body: editedBody, - msgtype, - }, - 'm.relates_to': { - event_id: mEvent.getId(), - rel_type: 'm.replace', - }, - }; - - // Apply formatting if relevant - let formattedBody = settings.isMarkdown - ? getFormattedBody(editedBody) - : sanitizeText(editedBody); - formattedBody = formatUserPill(room, formattedBody); - formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); - - content.body = findAndReplace( - content.body, - MXID_REGEX, - (match) => room.currentState.userIdsToDisplayNames[match[0]], - (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + const content = this.getContent( + roomId, + { msgType: mEvent.getWireContent().msgtype }, + editedBody, + null, + mEvent, ); - if (formattedBody !== sanitizeText(editedBody)) { - content.formatted_body = ` * ${formattedBody}`; - content.format = 'org.matrix.custom.html'; - content['m.new_content'].formatted_body = formattedBody; - content['m.new_content'].format = 'org.matrix.custom.html'; - } - if (isReply) { - const evBody = mEvent.getContent().body; - const replyHead = evBody.slice(0, evBody.indexOf('\n\n')); - const evFBody = mEvent.getContent().formatted_body; - const fReplyHead = evFBody.slice(0, evFBody.indexOf('')); - - content.format = 'org.matrix.custom.html'; - content.formatted_body = `${fReplyHead}${(content.formatted_body || content.body)}`; - - content.body = `${replyHead}\n\n${content.body}`; - } - this.matrixClient.sendMessage(roomId, content); } } diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 7b13dd18..07231cd4 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -375,6 +375,7 @@ class Navigation extends EventEmitter { action.userId, action.eventId, action.body, + action.formattedBody, ); }, [cons.actions.navigation.OPEN_SEARCH]: () => { diff --git a/src/util/markdown.js b/src/util/markdown.js index 2e4f53d0..324a12b5 100644 --- a/src/util/markdown.js +++ b/src/util/markdown.js @@ -1,25 +1,82 @@ import SimpleMarkdown from '@khanacademy/simple-markdown'; const { - defaultRules, parserFor, outputFor, anyScopeRegex, blockRegex, inlineRegex, htmlTag, sanitizeText, + defaultRules, parserFor, outputFor, anyScopeRegex, blockRegex, inlineRegex, + sanitizeText, sanitizeUrl, } = SimpleMarkdown; +function htmlTag(tagName, content, attributes, isClosed) { + let s = ''; + Object.entries(attributes || {}).forEach(([k, v]) => { + if (v !== undefined) { + s += ` ${sanitizeText(k)}`; + if (v !== null) s += `="${sanitizeText(v)}"`; + } + }); + + s = `<${tagName}${s}>`; + + if (isClosed === false) { + return s; + } + return `${s}${content}`; +} + function mathHtml(wrap, node) { return htmlTag(wrap, htmlTag('code', sanitizeText(node.content)), { 'data-mx-maths': node.content }); } -const rules = { - ...defaultRules, +const emojiRegex = /^:([\w-]+):/; + +const plainRules = { Array: { ...defaultRules.Array, plain: (arr, output, state) => arr.map((node) => output(node, state)).join(''), }, - displayMath: { - order: defaultRules.list.order + 0.5, - match: blockRegex(/^\$\$\n*([\s\S]+?)\n*\$\$/), - parse: (capture) => ({ content: capture[1] }), - plain: (node) => `$$\n${node.content}\n$$`, - html: (node) => mathHtml('div', node), + userMention: { + order: defaultRules.em.order - 0.9, + match: inlineRegex(/^(@\S+:\S+)/), + parse: (capture, _, state) => ({ + content: state.userNames[capture[1]] ? `@${state.userNames[capture[1]]}` : capture[1], + id: capture[1], + }), + plain: (node) => node.content, + html: (node) => htmlTag('a', sanitizeText(node.content), { + href: `https://matrix.to/#/${encodeURIComponent(node.id)}`, + }), + }, + roomMention: { + order: defaultRules.em.order - 0.8, + match: inlineRegex(/^(#\S+:\S+)/), // TODO: Handle line beginning with roomMention (instead of heading) + parse: (capture) => ({ content: capture[1], id: capture[1] }), + plain: (node) => node.content, + html: (node) => htmlTag('a', sanitizeText(node.content), { + href: `https://matrix.to/#/${encodeURIComponent(node.id)}`, + }), + }, + emoji: { + order: defaultRules.em.order - 0.1, + match: (source, state) => { + if (!state.inline) return null; + const capture = emojiRegex.exec(source); + if (!capture) return null; + const emoji = state.emojis.get(capture[1]); + if (emoji) return capture; + return null; + }, + parse: (capture, _, state) => ({ content: capture[1], emoji: state.emojis.get(capture[1]) }), + plain: ({ emoji }) => (emoji.mxc + ? `:${emoji.shortcode}:` + : emoji.unicode), + html: ({ emoji }) => (emoji.mxc + ? htmlTag('img', null, { + 'data-mx-emoticon': null, + src: emoji.mxc, + alt: `:${emoji.shortcode}:`, + title: `:${emoji.shortcode}:`, + height: 32, + }, false) + : emoji.unicode), }, newline: { ...defaultRules.newline, @@ -30,10 +87,163 @@ const rules = { plain: (node, output, state) => `${output(node.content, state)}\n\n`, html: (node, output, state) => htmlTag('p', output(node.content, state)), }, + br: { + ...defaultRules.br, + match: anyScopeRegex(/^ *\n/), + plain: () => '\n', + }, + text: { + ...defaultRules.text, + match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]| *\n|\w+:\S|$)/), + plain: (node) => node.content, + }, +}; + +const markdownRules = { + ...defaultRules, + ...plainRules, + heading: { + ...defaultRules.heading, + plain: (node, output, state) => { + const out = output(node.content, state); + if (node.level <= 2) { + return `${out}\n${(node.level === 1 ? '=' : '-').repeat(out.length)}\n\n`; + } + return `${'#'.repeat(node.level)} ${out}\n\n`; + }, + }, + hr: { + ...defaultRules.hr, + plain: () => '---\n\n', + }, + codeBlock: { + ...defaultRules.codeBlock, + plain: (node) => `\`\`\`${node.lang || ''}\n${node.content}\n\`\`\``, + }, + fence: { + ...defaultRules.fence, + match: blockRegex(/^ *(`{3,}|~{3,}) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)*\n/), + }, + blockQuote: { + ...defaultRules.blockQuote, + plain: (node, output, state) => `> ${output(node.content, state).trim().replace(/\n/g, '\n> ')}\n\n`, + }, + list: { + ...defaultRules.list, + plain: (node, output, state) => `${node.items.map((item, i) => { + const prefix = node.ordered ? `${node.start + i + 1}. ` : '* '; + return prefix + output(item, state).replace(/\n/g, `\n${' '.repeat(prefix.length)}`); + }).join('\n')}\n`, + }, + def: undefined, + table: { + ...defaultRules.table, + plain: (node, output, state) => { + const header = node.header.map((content) => output(content, state)); + + function lineWidth(i) { + switch (node.align[i]) { + case 'left': + case 'right': + return 2; + case 'center': + return 3; + default: + return 1; + } + } + const colWidth = header.map((s, i) => Math.max(s.length, lineWidth(i))); + + const cells = node.cells.map((row) => row.map((content, i) => { + const s = output(content, state); + if (s.length > colWidth[i]) { + colWidth[i] = s.length; + } + return s; + })); + + function pad(s, i) { + switch (node.align[i]) { + case 'right': + return s.padStart(colWidth[i]); + case 'center': + return s + .padStart(s.length + Math.floor((colWidth[i] - s.length) / 2)) + .padEnd(colWidth[i]); + default: + return s.padEnd(colWidth[i]); + } + } + + const line = colWidth.map((len, i) => { + switch (node.align[i]) { + case 'left': + return `:${'-'.repeat(len - 1)}`; + case 'center': + return `:${'-'.repeat(len - 2)}:`; + case 'right': + return `${'-'.repeat(len - 1)}:`; + default: + return '-'.repeat(len); + } + }); + + const table = [ + header.map(pad), + line, + ...cells.map((row) => row.map(pad))]; + + return table.map((row) => `| ${row.join(' | ')} |\n`).join(''); + }, + }, + displayMath: { + order: defaultRules.table.order + 0.1, + match: blockRegex(/^ *\$\$ *\n?([\s\S]+?)\n?\$\$ *(?:\n *)*\n/), + parse: (capture) => ({ content: capture[1] }), + plain: (node) => (node.content.includes('\n') + ? `$$\n${node.content}\n$$\n` + : `$$${node.content}$$\n`), + html: (node) => mathHtml('div', node), + }, + shrug: { + order: defaultRules.escape.order - 0.1, + match: inlineRegex(/^¯\\_\(ツ\)_\/¯/), + parse: (capture) => ({ type: 'text', content: capture[0] }), + }, escape: { ...defaultRules.escape, plain: (node, output, state) => `\\${output(node.content, state)}`, }, + tableSeparator: { + ...defaultRules.tableSeparator, + plain: () => ' | ', + }, + link: { + ...defaultRules.link, + plain: (node, output, state) => { + const out = output(node.content, state); + const target = sanitizeUrl(node.target) || ''; + if (out !== target || node.title) { + return `[${out}](${target}${node.title ? ` "${node.title}"` : ''})`; + } + return out; + }, + html: (node, output, state) => htmlTag('a', output(node.content, state), { + href: sanitizeUrl(node.target) || '', + title: node.title, + }), + }, + image: { + ...defaultRules.image, + plain: (node) => `![${node.alt}](${sanitizeUrl(node.target) || ''}${node.title ? ` "${node.title}"` : ''})`, + html: (node) => htmlTag('img', '', { + src: sanitizeUrl(node.target) || '', + alt: node.alt, + title: node.title, + }, false), + }, + reflink: undefined, + refimage: undefined, em: { ...defaultRules.em, plain: (node, output, state) => `_${output(node.content, state)}_`, @@ -50,40 +260,59 @@ const rules = { ...defaultRules.del, plain: (node, output, state) => `~~${output(node.content, state)}~~`, }, + inlineCode: { + ...defaultRules.inlineCode, + plain: (node) => `\`${node.content}\``, + }, spoiler: { - order: defaultRules.em.order - 0.5, + order: defaultRules.inlineCode.order + 0.1, match: inlineRegex(/^\|\|([\s\S]+?)\|\|(?:\(([\s\S]+?)\))?/), parse: (capture, parse, state) => ({ content: parse(capture[1], state), reason: capture[2], }), - plain: (node) => `[spoiler${node.reason ? `: ${node.reason}` : ''}](mxc://somewhere)`, - html: (node, output, state) => `${output(node.content, state)}`, + plain: (node, output, state) => `[spoiler${node.reason ? `: ${node.reason}` : ''}](${output(node.content, state)})`, + html: (node, output, state) => htmlTag( + 'span', + output(node.content, state), + { 'data-mx-spoiler': node.reason || null }, + ), }, inlineMath: { - order: defaultRules.del.order + 0.5, + order: defaultRules.del.order + 0.2, match: inlineRegex(/^\$(\S[\s\S]+?\S|\S)\$(?!\d)/), parse: (capture) => ({ content: capture[1] }), plain: (node) => `$${node.content}$`, html: (node) => mathHtml('span', node), }, - br: { - ...defaultRules.br, - match: anyScopeRegex(/^ *\n/), - plain: () => '\n', - }, - text: { - ...defaultRules.text, - match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]| *\n|\w+:\S|$)/), - plain: (node) => node.content, - }, }; -const parser = parserFor(rules); +function genOut(rules) { + const parser = parserFor(rules); -const plainOutput = outputFor(rules, 'plain'); -const htmlOutput = outputFor(rules, 'html'); + const plainOut = outputFor(rules, 'plain'); + const htmlOut = outputFor(rules, 'html'); -export { - parser, plainOutput, htmlOutput, -}; + return (source, state) => { + let content = parser(source, state); + + if (content.length === 1 && content[0].type === 'paragraph') { + content = content[0].content; + } + + const plain = plainOut(content, state).trim(); + const html = htmlOut(content, state); + + const plainHtml = html.replace(/
    /g, '\n').replace(/<\/p>

    /g, '\n\n').replace(/<\/?p>/g, ''); + const onlyPlain = sanitizeText(plain) === plainHtml; + + return { + onlyPlain, + plain, + html, + }; + }; +} + +export const plain = genOut(plainRules); +export const markdown = genOut(markdownRules); diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index ef016eda..54ee31bb 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -79,6 +79,16 @@ export function parseReply(rawBody) { }; } +export function trimHTMLReply(html) { + if (!html) return html; + const suffix = ''; + const i = html.indexOf(suffix); + if (i < 0) { + return html; + } + return html.slice(i + suffix.length); +} + export function hasDMWith(userId) { const mx = initMatrix.matrixClient; const directIds = [...initMatrix.roomList.directs]; From b5a317e021723cbc03031f41be8604a17960dfb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:44:47 +0530 Subject: [PATCH 301/824] Bump eslint from 8.23.0 to 8.23.1 (#840) Bumps [eslint](https://github.com/eslint/eslint) from 8.23.0 to 8.23.1. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.23.0...v8.23.1) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 58 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index f08260ab..85b5df97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.0.0", - "eslint": "8.23.0", + "eslint": "8.23.1", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -1811,9 +1811,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -4905,12 +4905,12 @@ } }, "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.1", + "@eslint/eslintrc": "^1.3.2", "@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", @@ -4929,7 +4929,6 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", "globby": "^11.1.0", @@ -4938,6 +4937,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -6020,12 +6020,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -7227,6 +7221,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -13060,9 +13060,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -15552,12 +15552,12 @@ "dev": true }, "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.1", + "@eslint/eslintrc": "^1.3.2", "@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", @@ -15576,7 +15576,6 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", "globby": "^11.1.0", @@ -15585,6 +15584,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -16404,12 +16404,6 @@ "functions-have-names": "^1.2.2" } }, - "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": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -17266,6 +17260,12 @@ } } }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index 7c9eb1ee..8dee6534 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.0.0", - "eslint": "8.23.0", + "eslint": "8.23.1", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From 0783c43169e9d3abe92c770b35d1893d97fbf7b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:46:11 +0530 Subject: [PATCH 302/824] Bump webpack-dev-server from 4.10.1 to 4.11.0 (#841) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.10.1 to 4.11.0. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.10.1...v4.11.0) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85b5df97..5fdaa866 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "util": "0.12.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", - "webpack-dev-server": "4.10.1", + "webpack-dev-server": "4.11.0", "webpack-merge": "5.8.0" }, "engines": { @@ -11507,9 +11507,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.1.tgz", - "integrity": "sha512-FIzMq3jbBarz3ld9l7rbM7m6Rj1lOsgq/DyLGMX/fPEB1UBUPtf5iL/4eNfhx8YYJTRlzfv107UfWSWcBK5Odw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -20490,9 +20490,9 @@ } }, "webpack-dev-server": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.1.tgz", - "integrity": "sha512-FIzMq3jbBarz3ld9l7rbM7m6Rj1lOsgq/DyLGMX/fPEB1UBUPtf5iL/4eNfhx8YYJTRlzfv107UfWSWcBK5Odw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", diff --git a/package.json b/package.json index 8dee6534..e5312411 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "util": "0.12.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", - "webpack-dev-server": "4.10.1", + "webpack-dev-server": "4.11.0", "webpack-merge": "5.8.0" } } From 060ed859d4b12122b59ab40d511cb65171c9ad4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:48:42 +0530 Subject: [PATCH 303/824] Bump blurhash from 1.1.5 to 2.0.0 (#842) Bumps [blurhash](https://github.com/woltapp/blurhash) from 1.1.5 to 2.0.0. - [Release notes](https://github.com/woltapp/blurhash/releases) - [Commits](https://github.com/woltapp/blurhash/commits) --- updated-dependencies: - dependency-name: blurhash dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fdaa866..7d8de9e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "1.1.5", + "blurhash": "2.0.0", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", @@ -3050,9 +3050,9 @@ "dev": true }, "node_modules/blurhash": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz", - "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", + "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -14106,9 +14106,9 @@ } }, "blurhash": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz", - "integrity": "sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", + "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" }, "bn.js": { "version": "5.2.1", diff --git a/package.json b/package.json index e5312411..84d1c613 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "1.1.5", + "blurhash": "2.0.0", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", From de218409ab332d07dcb0a54084d9db2976c8e354 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:51:02 +0530 Subject: [PATCH 304/824] Update dependency matrix-js-sdk to v19.5.0 (#845) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d8de9e1..9c32178c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0-beta.5", "linkifyjs": "4.0.0-beta.5", - "matrix-js-sdk": "19.4.0", + "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7786,9 +7786,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.4.0.tgz", - "integrity": "sha512-B8Mm4jCsCHaMaChcdM3VhZDVKrn0nMSDtYvHmS15Iu8Pe0G4qmIpk2AoADBAL9U9yN3pCqvs3TDXaQhM8UxRRA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.5.0.tgz", + "integrity": "sha512-WTmXMwyhGjUVv3eR71P9wdZj4qqNPgzg9Ud7V6kB3avhZJTZlIpNdHuldXXUdPJ8WTDKY+/yDtEFLIg8pj2Q8A==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17743,9 +17743,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.4.0.tgz", - "integrity": "sha512-B8Mm4jCsCHaMaChcdM3VhZDVKrn0nMSDtYvHmS15Iu8Pe0G4qmIpk2AoADBAL9U9yN3pCqvs3TDXaQhM8UxRRA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.5.0.tgz", + "integrity": "sha512-WTmXMwyhGjUVv3eR71P9wdZj4qqNPgzg9Ud7V6kB3avhZJTZlIpNdHuldXXUdPJ8WTDKY+/yDtEFLIg8pj2Q8A==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 84d1c613..c1ef6549 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0-beta.5", "linkifyjs": "4.0.0-beta.5", - "matrix-js-sdk": "19.4.0", + "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 437ac4c59b7a65b062fadddf1fb06813c61510c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:53:47 +0530 Subject: [PATCH 305/824] Bump css-minimizer-webpack-plugin from 4.0.0 to 4.1.0 (#843) Bumps [css-minimizer-webpack-plugin](https://github.com/webpack-contrib/css-minimizer-webpack-plugin) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: css-minimizer-webpack-plugin dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 17 ++++++++++------- package.json | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c32178c..ff95a38f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", "css-loader": "6.7.1", - "css-minimizer-webpack-plugin": "4.0.0", + "css-minimizer-webpack-plugin": "4.1.0", "eslint": "8.23.1", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", @@ -4058,9 +4058,9 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", "dev": true, "dependencies": { "cssnano": "^5.1.8", @@ -4092,6 +4092,9 @@ }, "esbuild": { "optional": true + }, + "lightningcss": { + "optional": true } } }, @@ -14911,9 +14914,9 @@ } }, "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", "dev": true, "requires": { "cssnano": "^5.1.8", diff --git a/package.json b/package.json index c1ef6549..f0965729 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", "css-loader": "6.7.1", - "css-minimizer-webpack-plugin": "4.0.0", + "css-minimizer-webpack-plugin": "4.1.0", "eslint": "8.23.1", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", From d43e41e1ba3bc770b26736b422a6c73515aae6e1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Sep 2022 19:03:59 +0530 Subject: [PATCH 306/824] Lock file maintenance (#846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 355 ++++++++++++++++++++++------------------------ 1 file changed, 168 insertions(+), 187 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff95a38f..3dfd2e4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -215,14 +215,14 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", - "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -252,9 +252,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -476,15 +476,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1405,16 +1405,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1718,9 +1718,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1729,9 +1729,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", + "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", "dev": true, "dependencies": { "core-js-pure": "^3.20.2", @@ -2140,9 +2140,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -2152,9 +2152,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -2212,9 +2212,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", "dev": true }, "node_modules/@types/prop-types": { @@ -2235,9 +2235,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", - "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2897,13 +2897,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { @@ -2924,12 +2924,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -3408,9 +3408,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001388", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", - "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", + "version": "1.0.30001399", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001399.tgz", + "integrity": "sha512-4vQ90tMKS+FkvuVWS5/QY1+d805ODxZiKFzsU8o/RsVJz49ZSRR8EjykLJbqhzdPgadbX6wB538wOzle3JniRA==", "dev": true, "funding": [ { @@ -3879,32 +3879,22 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", - "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" + "browserslist": "^4.21.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", "dev": true, "hasInstallScript": true, "funding": { @@ -4345,9 +4335,9 @@ } }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -4698,9 +4688,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.241", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz", - "integrity": "sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==", + "version": "1.4.249", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.249.tgz", + "integrity": "sha512-GMCxR3p2HQvIw47A599crTKYZprqihoBL4lDSAUmr7IYekXFK5t/WgEBrGJDCa2HWIZFQEkGuMqPCi05ceYqPQ==", "dev": true }, "node_modules/elliptic": { @@ -5620,9 +5610,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5857,9 +5847,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -6069,9 +6059,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6836,9 +6826,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true, "engines": { "node": ">= 0.4" @@ -9657,9 +9647,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -10209,9 +10199,9 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "dependencies": { "node-forge": "^1" @@ -11154,9 +11144,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" @@ -11180,9 +11170,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "funding": [ { @@ -11961,14 +11951,14 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", - "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -11986,9 +11976,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.17.7", @@ -12153,15 +12143,15 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helpers": { @@ -12758,16 +12748,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.19.0" } }, "@babel/plugin-transform-react-jsx-development": { @@ -12984,9 +12974,9 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -12999,9 +12989,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", + "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", "dev": true, "requires": { "core-js-pure": "^3.20.2", @@ -13334,9 +13324,9 @@ "dev": true }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "requires": { "@types/body-parser": "*", @@ -13346,9 +13336,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "requires": { "@types/node": "*", @@ -13406,9 +13396,9 @@ "dev": true }, "@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", "dev": true }, "@types/prop-types": { @@ -13429,9 +13419,9 @@ "dev": true }, "@types/react": { - "version": "18.0.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", - "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -13981,13 +13971,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" } }, @@ -14002,12 +13992,12 @@ } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "babel-polyfill": { @@ -14401,9 +14391,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001388", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", - "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", + "version": "1.0.30001399", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001399.tgz", + "integrity": "sha512-4vQ90tMKS+FkvuVWS5/QY1+d805ODxZiKFzsU8o/RsVJz49ZSRR8EjykLJbqhzdPgadbX6wB538wOzle3JniRA==", "dev": true }, "caseless": { @@ -14769,27 +14759,18 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", - "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.21.3" } }, "core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", "dev": true }, "core-util-is": { @@ -15106,9 +15087,9 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "damerau-levenshtein": { "version": "1.0.8", @@ -15392,9 +15373,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.241", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz", - "integrity": "sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==", + "version": "1.4.249", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.249.tgz", + "integrity": "sha512-GMCxR3p2HQvIw47A599crTKYZprqihoBL4lDSAUmr7IYekXFK5t/WgEBrGJDCa2HWIZFQEkGuMqPCi05ceYqPQ==", "dev": true }, "elliptic": { @@ -16092,9 +16073,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -16290,9 +16271,9 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { @@ -16449,9 +16430,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -17002,9 +16983,9 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true }, "is-core-module": { @@ -19090,9 +19071,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -19482,9 +19463,9 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" @@ -20212,9 +20193,9 @@ "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, "universalify": { @@ -20229,9 +20210,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "requires": { "escalade": "^3.1.1", From a8f374dd436ac58ac6101cc39ecabb453f844a4c Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Fri, 16 Sep 2022 17:51:53 +0200 Subject: [PATCH 307/824] Parsing HTML to Markdown AST (#847) * Force mentions to have a space after the # * Use types for rendering * Parse HTML * Add code block support * Add table support * Allow starting heading without a space * Escape relevant plaintext areas * Resolve many crashes * Use better matrix id regex * Don't match . after id * Don't parse mentions as links * Add emote support * Only emit HTML link if necessary * Implement review changes --- src/app/molecules/message/Message.jsx | 5 +- src/client/state/Notifications.js | 13 +- src/util/common.js | 24 +++ src/util/markdown.js | 269 +++++++++++++++++++++----- 4 files changed, 265 insertions(+), 46 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 02a5562c..6becae1c 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -40,6 +40,7 @@ import BinIC from '../../../../public/res/ic/outlined/bin.svg'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; import { getBlobSafeMimeType } from '../../../util/mimetypes'; +import { html, plain } from '../../../util/markdown'; function PlaceholderMessage() { return ( @@ -802,7 +803,9 @@ function Message({ )} {isEdit && ( { if (newBody !== body) { initMatrix.roomsInput.sendEditedMessage(roomId, mEvent, newBody); diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index da4521dd..db4610a3 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -10,6 +10,7 @@ import { setFavicon } from '../../util/common'; import LogoSVG from '../../../public/res/svg/cinny.svg'; import LogoUnreadSVG from '../../../public/res/svg/cinny-unread.svg'; import LogoHighlightSVG from '../../../public/res/svg/cinny-highlight.svg'; +import { html, plain } from '../../util/markdown'; function isNotifEvent(mEvent) { const eType = mEvent.getType(); @@ -257,8 +258,18 @@ class Notifications extends EventEmitter { scale: 8, }); + const content = mEvent.getContent(); + + const state = { kind: 'notification', onlyPlain: true }; + let body; + if (content.format === 'org.matrix.custom.html') { + body = html(content.formatted_body, state); + } else { + body = plain(content.body, state); + } + const noti = new window.Notification(title, { - body: mEvent.getContent().body, + body: body.plain, icon, tag: mEvent.getId(), silent: settings.isNotificationSounds, diff --git a/src/util/common.js b/src/util/common.js index 1de2bf0f..2affe27d 100644 --- a/src/util/common.js +++ b/src/util/common.js @@ -204,3 +204,27 @@ export function scaleDownImage(imageFile, width, height) { img.src = imgURL; }); } + +/** + * @param {sigil} string sigil to search for (for example '@', '#' or '$') + * @param {flags} string regex flags + * @param {prefix} string prefix appended at the beginning of the regex + * @returns {RegExp} + */ +export function idRegex(sigil, flags, prefix) { + const servername = '(?:[a-zA-Z0-9-.]*[a-zA-Z0-9]+|\\[\\S+?\\])(?::\\d+)?'; + return new RegExp(`${prefix}(${sigil}\\S+:${servername})`, flags); +} + +const matrixToRegex = /^https?:\/\/matrix.to\/#\/(\S+:\S+)/; +/** + * Parses a matrix.to URL into an matrix id. + * This function can later be extended to support matrix: URIs + * @param {string} uri The URI to parse + * @returns {string|null} The id or null if the URI does not match + */ +export function parseIdUri(uri) { + const res = decodeURIComponent(uri).match(matrixToRegex); + if (!res) return null; + return res[1]; +} diff --git a/src/util/markdown.js b/src/util/markdown.js index 324a12b5..bc83cb33 100644 --- a/src/util/markdown.js +++ b/src/util/markdown.js @@ -1,4 +1,6 @@ +/* eslint-disable no-use-before-define */ import SimpleMarkdown from '@khanacademy/simple-markdown'; +import { idRegex, parseIdUri } from './common'; const { defaultRules, parserFor, outputFor, anyScopeRegex, blockRegex, inlineRegex, @@ -31,25 +33,24 @@ const emojiRegex = /^:([\w-]+):/; const plainRules = { Array: { ...defaultRules.Array, - plain: (arr, output, state) => arr.map((node) => output(node, state)).join(''), + plain: defaultRules.Array.html, }, userMention: { order: defaultRules.em.order - 0.9, - match: inlineRegex(/^(@\S+:\S+)/), + match: inlineRegex(idRegex('@', undefined, '^')), parse: (capture, _, state) => ({ + type: 'mention', content: state.userNames[capture[1]] ? `@${state.userNames[capture[1]]}` : capture[1], id: capture[1], }), - plain: (node) => node.content, - html: (node) => htmlTag('a', sanitizeText(node.content), { - href: `https://matrix.to/#/${encodeURIComponent(node.id)}`, - }), }, roomMention: { order: defaultRules.em.order - 0.8, - match: inlineRegex(/^(#\S+:\S+)/), // TODO: Handle line beginning with roomMention (instead of heading) - parse: (capture) => ({ content: capture[1], id: capture[1] }), - plain: (node) => node.content, + match: inlineRegex(idRegex('#', undefined, '^')), + parse: (capture) => ({ type: 'mention', content: capture[1], id: capture[1] }), + }, + mention: { + plain: (node, _, state) => (state.kind === 'edit' ? node.id : node.content), html: (node) => htmlTag('a', sanitizeText(node.content), { href: `https://matrix.to/#/${encodeURIComponent(node.id)}`, }), @@ -95,7 +96,7 @@ const plainRules = { text: { ...defaultRules.text, match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]| *\n|\w+:\S|$)/), - plain: (node) => node.content, + plain: (node) => node.content.replace(/(\*|_|!\[|\[|\|\||\$\$?)/g, '\\$1'), }, }; @@ -104,12 +105,13 @@ const markdownRules = { ...plainRules, heading: { ...defaultRules.heading, + match: blockRegex(/^ *(#{1,6})([^\n:]*?(?: [^\n]*?)?)#* *(?:\n *)+\n/), plain: (node, output, state) => { const out = output(node.content, state); - if (node.level <= 2) { - return `${out}\n${(node.level === 1 ? '=' : '-').repeat(out.length)}\n\n`; + if (state.kind === 'edit' || state.kind === 'notification' || node.level > 2) { + return `${'#'.repeat(node.level)} ${out}\n\n`; } - return `${'#'.repeat(node.level)} ${out}\n\n`; + return `${out}\n${(node.level === 1 ? '=' : '-').repeat(out.length)}\n\n`; }, }, hr: { @@ -119,6 +121,9 @@ const markdownRules = { codeBlock: { ...defaultRules.codeBlock, plain: (node) => `\`\`\`${node.lang || ''}\n${node.content}\n\`\`\``, + html: (node) => htmlTag('pre', htmlTag('code', sanitizeText(node.content), { + class: node.lang ? `language-${node.lang}` : undefined, + })), }, fence: { ...defaultRules.fence, @@ -131,7 +136,7 @@ const markdownRules = { list: { ...defaultRules.list, plain: (node, output, state) => `${node.items.map((item, i) => { - const prefix = node.ordered ? `${node.start + i + 1}. ` : '* '; + const prefix = node.ordered ? `${node.start + i}. ` : '* '; return prefix + output(item, state).replace(/\n/g, `\n${' '.repeat(prefix.length)}`); }).join('\n')}\n`, }, @@ -141,8 +146,8 @@ const markdownRules = { plain: (node, output, state) => { const header = node.header.map((content) => output(content, state)); - function lineWidth(i) { - switch (node.align[i]) { + const colWidth = node.align.map((align) => { + switch (align) { case 'left': case 'right': return 2; @@ -151,12 +156,14 @@ const markdownRules = { default: return 1; } - } - const colWidth = header.map((s, i) => Math.max(s.length, lineWidth(i))); + }); + header.forEach((s, i) => { + if (s.length > colWidth[i])colWidth[i] = s.length; + }); const cells = node.cells.map((row) => row.map((content, i) => { const s = output(content, state); - if (s.length > colWidth[i]) { + if (colWidth[i] === undefined || s.length > colWidth[i]) { colWidth[i] = s.length; } return s; @@ -228,10 +235,17 @@ const markdownRules = { } return out; }, - html: (node, output, state) => htmlTag('a', output(node.content, state), { - href: sanitizeUrl(node.target) || '', - title: node.title, - }), + html: (node, output, state) => { + const out = output(node.content, state); + const target = sanitizeUrl(node.target) || ''; + if (out !== target || node.title) { + return htmlTag('a', out, { + href: target, + title: node.title, + }); + } + return target; + }, }, image: { ...defaultRules.image, @@ -271,7 +285,17 @@ const markdownRules = { content: parse(capture[1], state), reason: capture[2], }), - plain: (node, output, state) => `[spoiler${node.reason ? `: ${node.reason}` : ''}](${output(node.content, state)})`, + plain: (node, output, state) => { + const warning = `spoiler${node.reason ? `: ${node.reason}` : ''}`; + switch (state.kind) { + case 'edit': + return `||${output(node.content, state)}||${node.reason ? `(${node.reason})` : ''}`; + case 'notification': + return `<${warning}>`; + default: + return `[${warning}](${output(node.content, state)})`; + } + }, html: (node, output, state) => htmlTag( 'span', output(node.content, state), @@ -287,32 +311,189 @@ const markdownRules = { }, }; -function genOut(rules) { - const parser = parserFor(rules); +function mapElement(el) { + switch (el.tagName) { + case 'MX-REPLY': + return []; - const plainOut = outputFor(rules, 'plain'); - const htmlOut = outputFor(rules, 'html'); + case 'P': + return [{ type: 'paragraph', content: mapChildren(el) }]; + case 'BR': + return [{ type: 'br' }]; - return (source, state) => { - let content = parser(source, state); - - if (content.length === 1 && content[0].type === 'paragraph') { - content = content[0].content; + case 'H1': + case 'H2': + case 'H3': + case 'H4': + case 'H5': + case 'H6': + return [{ type: 'heading', level: Number(el.tagName[1]), content: mapChildren(el) }]; + case 'HR': + return [{ type: 'hr' }]; + case 'PRE': { + let lang; + if (el.firstChild) { + Array.from(el.firstChild.classList).some((c) => { + const langPrefix = 'language-'; + if (c.startsWith(langPrefix)) { + lang = c.slice(langPrefix.length); + return true; + } + return false; + }); + } + return [{ type: 'codeBlock', lang, content: el.innerText }]; } + case 'BLOCKQUOTE': + return [{ type: 'blockQuote', content: mapChildren(el) }]; + case 'UL': + return [{ type: 'list', items: mapChildren(el) }]; + case 'OL': + return [{ + type: 'list', + ordered: true, + start: Number(el.getAttribute('start')), + items: mapChildren(el), + }]; + case 'TABLE': { + const headerEl = Array.from(el.querySelector('thead > tr').childNodes); + const align = headerEl.map((childE) => childE.style['text-align']); + return [{ + type: 'table', + header: headerEl.map(mapChildren), + align, + cells: Array.from(el.querySelectorAll('tbody > tr')).map((rowEl) => Array.from(rowEl.childNodes).map((childEl, i) => { + if (align[i] === undefined) align[i] = childEl.style['text-align']; + return mapChildren(childEl); + })), + }]; + } + case 'A': { + const href = el.getAttribute('href'); - const plain = plainOut(content, state).trim(); - const html = htmlOut(content, state); + const id = parseIdUri(href); + if (id) return [{ type: 'mention', content: el.innerText, id }]; - const plainHtml = html.replace(/
    /g, '\n').replace(/<\/p>

    /g, '\n\n').replace(/<\/?p>/g, ''); - const onlyPlain = sanitizeText(plain) === plainHtml; + return [{ + type: 'link', + target: el.getAttribute('href'), + title: el.getAttribute('title'), + content: mapChildren(el), + }]; + } + case 'IMG': { + const src = el.getAttribute('src'); + let title = el.getAttribute('title'); + if (el.hasAttribute('data-mx-emoticon')) { + if (title.length > 2 && title.startsWith(':') && title.endsWith(':')) { + title = title.slice(1, -1); + } + return [{ + type: 'emoji', + content: title, + emoji: { + mxc: src, + shortcode: title, + }, + }]; + } - return { - onlyPlain, - plain, - html, - }; + return [{ + type: 'image', + alt: el.getAttribute('alt'), + target: src, + title, + }]; + } + case 'EM': + case 'I': + return [{ type: 'em', content: mapChildren(el) }]; + case 'STRONG': + case 'B': + return [{ type: 'strong', content: mapChildren(el) }]; + case 'U': + return [{ type: 'u', content: mapChildren(el) }]; + case 'DEL': + case 'STRIKE': + return [{ type: 'del', content: mapChildren(el) }]; + case 'CODE': + return [{ type: 'inlineCode', content: el.innerText }]; + + case 'DIV': + if (el.hasAttribute('data-mx-maths')) { + return [{ type: 'displayMath', content: el.getAttribute('data-mx-maths') }]; + } + return mapChildren(el); + case 'SPAN': + if (el.hasAttribute('data-mx-spoiler')) { + return [{ type: 'spoiler', reason: el.getAttribute('data-mx-spoiler'), content: mapChildren(el) }]; + } + if (el.hasAttribute('data-mx-maths')) { + return [{ type: 'inlineMath', content: el.getAttribute('data-mx-maths') }]; + } + return mapChildren(el); + default: + return mapChildren(el); + } +} + +function mapNode(n) { + switch (n.nodeType) { + case Node.TEXT_NODE: + return [{ type: 'text', content: n.textContent }]; + case Node.ELEMENT_NODE: + return mapElement(n); + default: + return []; + } +} + +function mapChildren(n) { + return Array.from(n.childNodes).reduce((ast, childN) => { + ast.push(...mapNode(childN)); + return ast; + }, []); +} + +function render(content, state, plainOut, htmlOut) { + let c = content; + if (content.length === 1 && content[0].type === 'paragraph') { + c = c[0].content; + } + + const plainStr = plainOut(c, state).trim(); + if (state.onlyPlain) return { plain: plainStr }; + + const htmlStr = htmlOut(c, state); + + const plainHtml = htmlStr.replace(/
    /g, '\n').replace(/<\/p>

    /g, '\n\n').replace(/<\/?p>/g, ''); + const onlyPlain = sanitizeText(plainStr) === plainHtml; + + return { + onlyPlain, + plain: plainStr, + html: htmlStr, }; } -export const plain = genOut(plainRules); -export const markdown = genOut(markdownRules); +const plainParser = parserFor(plainRules); +const plainPlainOut = outputFor(plainRules, 'plain'); +const plainHtmlOut = outputFor(plainRules, 'html'); + +const mdParser = parserFor(markdownRules); +const mdPlainOut = outputFor(markdownRules, 'plain'); +const mdHtmlOut = outputFor(markdownRules, 'html'); + +export function plain(source, state) { + return render(plainParser(source, state), state, plainPlainOut, plainHtmlOut); +} + +export function markdown(source, state) { + return render(mdParser(source, state), state, mdPlainOut, mdHtmlOut); +} + +export function html(source, state) { + const el = document.createElement('template'); + el.innerHTML = source; + return render(mapChildren(el.content), state, mdPlainOut, mdHtmlOut); +} From 4848bef0dd24c628c9e6bcc1ce44f31577328e93 Mon Sep 17 00:00:00 2001 From: morguldir Date: Sat, 17 Sep 2022 09:51:22 +0200 Subject: [PATCH 308/824] Add Clear cache and reload button (#793) Inspired by: https://github.com/matrix-org/matrix-react-sdk/blob/3c5c2bef6dbac51ce6e1864056523815ca4c38d9/src/components/views/elements/ErrorBoundary.tsx#L61-L68 Signed-off-by: morguldir Signed-off-by: morguldir --- src/app/organisms/settings/Settings.jsx | 1 + src/client/state/settings.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 2e0f64bd..8baf589c 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -239,6 +239,7 @@ function AboutSection() {

    +
    diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 32f55fcc..7b9635d3 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -147,6 +147,14 @@ class Settings extends EventEmitter { return settings.isNotificationSounds; } + clearCacheAndReload() { + const mx = initMatrix.matrixClient; + mx.stopClient() + mx.store.deleteAllData().then(() => { + window.location.reload(); + }); +} + setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { From c1be57b205666bb0082fa36b9e263885e53d5b59 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 17 Sep 2022 15:48:45 +0530 Subject: [PATCH 309/824] Add clear cache btn in loading screen --- src/app/organisms/settings/Settings.jsx | 5 ++--- src/app/templates/client/Client.jsx | 22 ++++++++++++++++++---- src/app/templates/client/Client.scss | 8 ++++---- src/client/action/logout.js | 16 ---------------- src/client/initMatrix.js | 23 +++++++++++++++++++++-- src/client/state/settings.js | 8 -------- 6 files changed, 45 insertions(+), 37 deletions(-) delete mode 100644 src/client/action/logout.js diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 8baf589c..a0869b61 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -9,7 +9,6 @@ import { toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents, toggleNotifications, toggleNotificationSounds, } from '../../../client/action/settings'; -import logout from '../../../client/action/logout'; import { usePermission } from '../../hooks/usePermission'; import Text from '../../atoms/text/Text'; @@ -239,7 +238,7 @@ function AboutSection() {
    - +
    @@ -328,7 +327,7 @@ function Settings() { const handleTabChange = (tabItem) => setSelectedTab(tabItem); const handleLogout = async () => { if (await confirmDialog('Logout', 'Are you sure that you want to logout your session?', 'Logout', 'danger')) { - logout(); + initMatrix.logout(); } }; diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index 8610b62c..d83845b8 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -7,18 +7,21 @@ import { initRoomListListener } from '../../../client/event/roomList'; import Text from '../../atoms/text/Text'; import Spinner from '../../atoms/spinner/Spinner'; import Navigation from '../../organisms/navigation/Navigation'; +import ContextMenu, { MenuItem } from '../../atoms/context-menu/ContextMenu'; +import IconButton from '../../atoms/button/IconButton'; import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; import Room from '../../organisms/room/Room'; import Windows from '../../organisms/pw/Windows'; import Dialogs from '../../organisms/pw/Dialogs'; import EmojiBoardOpener from '../../organisms/emoji-board/EmojiBoardOpener'; -import logout from '../../../client/action/logout'; import initMatrix from '../../../client/initMatrix'; import navigation from '../../../client/state/navigation'; import cons from '../../../client/state/cons'; import DragDrop from '../../organisms/drag-drop/DragDrop'; +import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; + function Client() { const [isLoading, changeLoading] = useState(true); const [loadingMsg, setLoadingMsg] = useState('Heating up'); @@ -74,9 +77,20 @@ function Client() { if (isLoading) { return (
    - +
    + + initMatrix.clearCacheAndReload()}> + Clear cache & reload + + initMatrix.logout()}>Logout + + )} + render={(toggle) => } + /> +
    {loadingMsg} diff --git a/src/app/templates/client/Client.scss b/src/app/templates/client/Client.scss index 67d5dfd5..cdb8fcc9 100644 --- a/src/app/templates/client/Client.scss +++ b/src/app/templates/client/Client.scss @@ -45,12 +45,12 @@ position: absolute; bottom: var(--sp-normal); } -.loading__logout { +.loading__menu { position: absolute; - bottom: var(--sp-extra-tight); + top: var(--sp-extra-tight); right: var(--sp-extra-tight); cursor: pointer; - .text { - color: var(--tc-link); + .context-menu__item .text { + margin: 0 !important; } } diff --git a/src/client/action/logout.js b/src/client/action/logout.js deleted file mode 100644 index c4047bb7..00000000 --- a/src/client/action/logout.js +++ /dev/null @@ -1,16 +0,0 @@ -import initMatrix from '../initMatrix'; - -async function logout() { - const mx = initMatrix.matrixClient; - mx.stopClient(); - try { - await mx.logout(); - } catch { - // ignore if failed to logout - } - mx.clearStores(); - window.localStorage.clear(); - window.location.reload(); -} - -export default logout; diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index fccfe514..cd961573 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -98,13 +98,32 @@ class InitMatrix extends EventEmitter { } listenEvents() { - this.matrixClient.on('Session.logged_out', () => { + this.matrixClient.on('Session.logged_out', async () => { this.matrixClient.stopClient(); - this.matrixClient.clearStores(); + await this.matrixClient.clearStores(); window.localStorage.clear(); window.location.reload(); }); } + + async logout() { + this.matrixClient.stopClient(); + try { + await this.matrixClient.logout(); + } catch { + // ignore if failed to logout + } + await this.matrixClient.clearStores(); + window.localStorage.clear(); + window.location.reload(); + } + + clearCacheAndReload() { + this.matrixClient.stopClient(); + this.matrixClient.store.deleteAllData().then(() => { + window.location.reload(); + }); + } } const initMatrix = new InitMatrix(); diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 7b9635d3..32f55fcc 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -147,14 +147,6 @@ class Settings extends EventEmitter { return settings.isNotificationSounds; } - clearCacheAndReload() { - const mx = initMatrix.matrixClient; - mx.stopClient() - mx.store.deleteAllData().then(() => { - window.location.reload(); - }); -} - setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { From cbd1bf35c66a034e59389a1addbc0fce900af959 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sat, 17 Sep 2022 13:25:26 +0200 Subject: [PATCH 310/824] Only escape when editing (#852) * Only escape when editing * Base edit change detection on rendered content --- src/app/molecules/message/Message.jsx | 8 ++++---- src/util/markdown.js | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx index 6becae1c..26a5b29d 100644 --- a/src/app/molecules/message/Message.jsx +++ b/src/app/molecules/message/Message.jsx @@ -300,12 +300,12 @@ function MessageEdit({ body, onSave, onCancel }) { if (e.key === 'Enter' && e.shiftKey === false) { e.preventDefault(); - onSave(editInputRef.current.value); + onSave(editInputRef.current.value, body); } }; return ( -
    { e.preventDefault(); onSave(editInputRef.current.value); }}> + { e.preventDefault(); onSave(editInputRef.current.value, body); }}> { - if (newBody !== body) { + onSave={(newBody, oldBody) => { + if (newBody !== oldBody) { initMatrix.roomsInput.sendEditedMessage(roomId, mEvent, newBody); } cancelEdit(); diff --git a/src/util/markdown.js b/src/util/markdown.js index bc83cb33..d0f5d6b2 100644 --- a/src/util/markdown.js +++ b/src/util/markdown.js @@ -96,7 +96,9 @@ const plainRules = { text: { ...defaultRules.text, match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]| *\n|\w+:\S|$)/), - plain: (node) => node.content.replace(/(\*|_|!\[|\[|\|\||\$\$?)/g, '\\$1'), + plain: (node, _, state) => (state.kind === 'edit' + ? node.content.replace(/(\*|_|!\[|\[|\|\||\$\$?)/g, '\\$1') + : node.content), }, }; From 80d9a2ca7d716ae7c088058cdcd1a335da5b4a87 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sat, 17 Sep 2022 19:04:13 +0530 Subject: [PATCH 311/824] Release v2.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3dfd2e4a..b7ff471d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.1.3", + "version": "2.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.1.3", + "version": "2.2.0", "license": "MIT", "dependencies": { "@fontsource/inter": "4.5.12", diff --git a/package.json b/package.json index f0965729..c4484df7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.1.3", + "version": "2.2.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 4c1ca1de..474dc04e 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.1.3', + version: '2.2.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 2200ae143e19cda2ea0b9b7ab97c14ca19ebc771 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 18 Sep 2022 20:18:23 +0530 Subject: [PATCH 312/824] Update sdk doc link so that it's not fixed to one version --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ba03fbca..fea421b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,4 +41,4 @@ Also, we use [ESLint](https://eslint.org/) for clean and stylistically consisten ## Helpful links - [BEM methodology](http://getbem.com/introduction/) - [Atomic design](https://bradfrost.com/blog/post/atomic-web-design/) -- [Matrix JavaScript SDK documentation](https://matrix-org.github.io/matrix-js-sdk/19.2.0/index.html) \ No newline at end of file +- [Matrix JavaScript SDK documentation](https://matrix-org.github.io/matrix-js-sdk/index.html) From 9bddf6451019b9b9eeb1eca9209e3e811fb4164b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 08:58:19 +0530 Subject: [PATCH 313/824] Lock file maintenance (#857) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> From 91f1ee748e0d16fdcff870ba9d07ff1a19dca0f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 09:13:58 +0530 Subject: [PATCH 314/824] Update babel monorepo to v7.19.1 (#859) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 176 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7ff471d..c6c03054 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,8 +41,8 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.0", - "@babel/preset-env": "7.19.0", + "@babel/core": "7.19.1", + "@babel/preset-env": "7.19.1", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", @@ -105,29 +105,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", - "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", + "@babel/traverse": "^7.19.1", "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -197,14 +197,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.0", + "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "engines": { @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -563,9 +563,9 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", - "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1313,9 +1313,9 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", - "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.19.0", @@ -1593,18 +1593,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", - "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.19.0", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1652,7 +1652,7 @@ "@babel/plugin-transform-modules-commonjs": "^7.18.6", "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -1668,10 +1668,10 @@ "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { @@ -1767,9 +1767,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", @@ -1778,7 +1778,7 @@ "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2911,13 +2911,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -11867,26 +11867,26 @@ } }, "@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true }, "@babel/core": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", - "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", + "@babel/traverse": "^7.19.1", "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -11939,14 +11939,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.0", + "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" } }, @@ -12177,9 +12177,9 @@ } }, "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12203,9 +12203,9 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", - "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -12692,9 +12692,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", - "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.19.0", @@ -12864,18 +12864,18 @@ } }, "@babel/preset-env": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", - "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.19.0", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -12923,7 +12923,7 @@ "@babel/plugin-transform-modules-commonjs": "^7.18.6", "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -12939,10 +12939,10 @@ "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" } }, @@ -13018,9 +13018,9 @@ } }, "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", @@ -13029,7 +13029,7 @@ "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -13982,13 +13982,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { diff --git a/package.json b/package.json index c4484df7..702c7ec9 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.0", - "@babel/preset-env": "7.19.0", + "@babel/core": "7.19.1", + "@babel/preset-env": "7.19.1", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", From 76e49d1bd028555b4a3db825bc9c8f9a8059ec41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:02:15 +0530 Subject: [PATCH 315/824] Update dependency linkify-html to v4.0.0 (#860) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6c03054..2555706f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.0-beta.5", + "linkify-html": "4.0.0", "linkifyjs": "4.0.0-beta.5", "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", @@ -7618,11 +7618,11 @@ } }, "node_modules/linkify-html": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0-beta.5.tgz", - "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0.tgz", + "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==", "peerDependencies": { - "linkifyjs": "^4.0.0-beta.1" + "linkifyjs": "^4.0.0" } }, "node_modules/linkifyjs": { @@ -17598,9 +17598,9 @@ } }, "linkify-html": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0-beta.5.tgz", - "integrity": "sha512-7upWBgItubM1yQhO1MozvSzl2bCWModOgcc1Wd7kPpndlbR1JxmqH/N0UzmdvX6g0PX0ftnCQdYV4RZHLP9D5g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0.tgz", + "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==" }, "linkifyjs": { "version": "4.0.0-beta.5", diff --git a/package.json b/package.json index 702c7ec9..796dd29b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.0-beta.5", + "linkify-html": "4.0.0", "linkifyjs": "4.0.0-beta.5", "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", From 2ddb3595c757b2a834542f8b9cd3ab9afbf3759f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:02:57 +0530 Subject: [PATCH 316/824] Update dependency sanitize-html to v2.7.2 (#862) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2555706f..49c7bb7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.15.1", - "sanitize-html": "2.7.1", + "sanitize-html": "2.7.2", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, @@ -10013,9 +10013,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-html": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", - "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", + "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -19347,9 +19347,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", - "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", + "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", diff --git a/package.json b/package.json index 796dd29b..3f4f7e83 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.15.1", - "sanitize-html": "2.7.1", + "sanitize-html": "2.7.2", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, From 0181cb26d2cd7092224481d012187f5628d77bc8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:03:45 +0530 Subject: [PATCH 317/824] Update dependency linkifyjs to v4.0.0 (#861) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49c7bb7a..4277e2f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.0", - "linkifyjs": "4.0.0-beta.5", + "linkifyjs": "4.0.0", "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", "react": "17.0.2", @@ -7626,9 +7626,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", - "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0.tgz", + "integrity": "sha512-RJuSqTcPSE7lHqZzVaZbg5w231QhIHkytiCjM6lxVHhodkt2rCBNDONCYVBYRXXIBvUl/Z+xOhRwOJnVrZB4Wg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -17603,9 +17603,9 @@ "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==" }, "linkifyjs": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0-beta.5.tgz", - "integrity": "sha512-j0YWN/Qd9XuReN4QdU/aMNFtfzBzyi1e07FkxEyeRjfxMKpfmMAofNT80q1vgQ4/U0WUZ/73nBOEpjdyfoUhGw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0.tgz", + "integrity": "sha512-RJuSqTcPSE7lHqZzVaZbg5w231QhIHkytiCjM6lxVHhodkt2rCBNDONCYVBYRXXIBvUl/Z+xOhRwOJnVrZB4Wg==" }, "loader-runner": { "version": "4.3.0", diff --git a/package.json b/package.json index 3f4f7e83..8254f773 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.0", - "linkifyjs": "4.0.0-beta.5", + "linkifyjs": "4.0.0", "matrix-js-sdk": "19.5.0", "prop-types": "15.8.1", "react": "17.0.2", From 478957803df9654c72b397e5d5166511fb84ba8b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:07:01 +0530 Subject: [PATCH 318/824] Lock file maintenance (#858) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 184 +++++++++++++++++++++++----------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4277e2f1..2daf6639 100644 --- a/package-lock.json +++ b/package-lock.json @@ -397,16 +397,16 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -458,9 +458,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1729,12 +1729,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", - "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", "dev": true, "dependencies": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -3278,9 +3278,9 @@ ] }, "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { @@ -3293,10 +3293,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" @@ -3408,9 +3408,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001399", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001399.tgz", - "integrity": "sha512-4vQ90tMKS+FkvuVWS5/QY1+d805ODxZiKFzsU8o/RsVJz49ZSRR8EjykLJbqhzdPgadbX6wB538wOzle3JniRA==", + "version": "1.0.30001405", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001405.tgz", + "integrity": "sha512-lbm+F6HaYFGfjejrTlgB6IZQSZjpA1qcrjGsuvecatP93emI66a41hmQJIW+KNMhcuusgQW0R0E9qvP+Hq7eLg==", "dev": true, "funding": [ { @@ -3879,12 +3879,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", - "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", + "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.3" + "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", @@ -3892,9 +3892,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", - "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", + "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==", "dev": true, "hasInstallScript": true, "funding": { @@ -4688,9 +4688,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.249", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.249.tgz", - "integrity": "sha512-GMCxR3p2HQvIw47A599crTKYZprqihoBL4lDSAUmr7IYekXFK5t/WgEBrGJDCa2HWIZFQEkGuMqPCi05ceYqPQ==", + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", "dev": true }, "node_modules/elliptic": { @@ -6826,9 +6826,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -9702,15 +9702,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -9719,15 +9719,15 @@ } }, "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -12085,16 +12085,16 @@ } }, "@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" } }, "@babel/helper-simple-access": { @@ -12131,9 +12131,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -12989,12 +12989,12 @@ } }, "@babel/runtime-corejs3": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", - "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", "dev": true, "requires": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" }, "dependencies": { @@ -14298,15 +14298,15 @@ } }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" } }, "bs58": { @@ -14391,9 +14391,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001399", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001399.tgz", - "integrity": "sha512-4vQ90tMKS+FkvuVWS5/QY1+d805ODxZiKFzsU8o/RsVJz49ZSRR8EjykLJbqhzdPgadbX6wB538wOzle3JniRA==", + "version": "1.0.30001405", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001405.tgz", + "integrity": "sha512-lbm+F6HaYFGfjejrTlgB6IZQSZjpA1qcrjGsuvecatP93emI66a41hmQJIW+KNMhcuusgQW0R0E9qvP+Hq7eLg==", "dev": true }, "caseless": { @@ -14759,18 +14759,18 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", - "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", + "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", "dev": true, "requires": { - "browserslist": "^4.21.3" + "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", - "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", + "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==", "dev": true }, "core-util-is": { @@ -15373,9 +15373,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.249", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.249.tgz", - "integrity": "sha512-GMCxR3p2HQvIw47A599crTKYZprqihoBL4lDSAUmr7IYekXFK5t/WgEBrGJDCa2HWIZFQEkGuMqPCi05ceYqPQ==", + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", "dev": true }, "elliptic": { @@ -16983,9 +16983,9 @@ } }, "is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", "dev": true }, "is-core-module": { @@ -19111,29 +19111,29 @@ "dev": true }, "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dev": true, "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" From 0225204b4d52106da01569b775ca71e0bf6ee9c3 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 19 Sep 2022 20:32:40 +0530 Subject: [PATCH 319/824] Require approval before opening dep update PR (#865) --- .github/renovate.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index d74593fb..46ce4fdf 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,7 +1,8 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "config:base" + "config:base", + ":dependencyDashboardApproval" ], "labels": [ "Dependencies" ], "packageRules": [ @@ -10,6 +11,5 @@ } ], "lockFileMaintenance": { "enabled": true }, - "dependencyDashboard": true, - "dependencyDashboardApproval": true + "dependencyDashboard": true } \ No newline at end of file From 83d8f2821ae301ee441426adc6ba84bbecc3d503 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:33:28 +0530 Subject: [PATCH 320/824] Update dependency @khanacademy/simple-markdown to v0.8.4 (#868) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2daf6639..c0927997 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@fontsource/inter": "4.5.12", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.3", + "@khanacademy/simple-markdown": "0.8.4", "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", @@ -1973,9 +1973,9 @@ } }, "node_modules/@khanacademy/simple-markdown": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.3.tgz", - "integrity": "sha512-mPK4PkGHDoue+pVA5HPIPyZa3iB8TwdAKEcoQWWQQueyWMsetaVM1L0QeFeuvYMqV+YdTAdUxTlLtibYhkwZig==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.4.tgz", + "integrity": "sha512-LzpAJY5G4xpmfAc1HHdHVg8ocyijXI5F3vLHRbUz3NrJHHi9UecUXrprEWHsgIrI0MrzwZk7cAINSXDf467yUg==", "dependencies": { "@types/react": ">=16.0.0" }, @@ -13181,9 +13181,9 @@ } }, "@khanacademy/simple-markdown": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.3.tgz", - "integrity": "sha512-mPK4PkGHDoue+pVA5HPIPyZa3iB8TwdAKEcoQWWQQueyWMsetaVM1L0QeFeuvYMqV+YdTAdUxTlLtibYhkwZig==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.4.tgz", + "integrity": "sha512-LzpAJY5G4xpmfAc1HHdHVg8ocyijXI5F3vLHRbUz3NrJHHi9UecUXrprEWHsgIrI0MrzwZk7cAINSXDf467yUg==", "requires": { "@types/react": ">=16.0.0" } diff --git a/package.json b/package.json index 8254f773..5e0ffb93 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "@fontsource/inter": "4.5.12", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.3", + "@khanacademy/simple-markdown": "0.8.4", "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", From 8b6cecdbf83a54ce4492e9234484e47b78c7579d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:35:29 +0530 Subject: [PATCH 321/824] Update dependency webpack-dev-server to v4.11.1 (#869) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0927997..815afac9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "util": "0.12.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", - "webpack-dev-server": "4.11.0", + "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" }, "engines": { @@ -11500,9 +11500,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -11528,7 +11528,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -20474,9 +20474,9 @@ } }, "webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -20502,7 +20502,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", diff --git a/package.json b/package.json index 5e0ffb93..c53807ae 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "util": "0.12.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", - "webpack-dev-server": "4.11.0", + "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" } } From c2d353b973eb58e6818a3b28fe6572d527367c28 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:37:41 +0530 Subject: [PATCH 322/824] Update dependency eslint to v8.24.0 (#870) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 815afac9..266c84d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.23.1", + "eslint": "8.24.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -1859,9 +1859,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -4898,13 +4898,13 @@ } }, "node_modules/eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/config-array": "^0.10.5", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", @@ -13091,9 +13091,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -15536,13 +15536,13 @@ "dev": true }, "eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/config-array": "^0.10.5", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", diff --git a/package.json b/package.json index c53807ae..bc84e336 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.23.1", + "eslint": "8.24.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From 9a4b40f2426d3b9969edbd3c0a5d88608551bccc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:40:16 +0530 Subject: [PATCH 323/824] Update dependency html-loader to v4.2.0 (#871) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 92 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 266c84d8..4e29be33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", - "html-loader": "4.1.0", + "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", @@ -6408,12 +6408,12 @@ "dev": true }, "node_modules/html-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", - "integrity": "sha512-QDDNmLgn96NWtTPx/VXRerFXH0hn7cm4bruqsZ333GCb+rqiqGurcxtP/M52wcui1/iLiu0l5ms/McE7/Ik6aQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", + "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", "dev": true, "dependencies": { - "html-minifier-terser": "^6.1.0", + "html-minifier-terser": "^7.0.0", "parse5": "^7.0.0" }, "engines": { @@ -6427,6 +6427,48 @@ "webpack": "^5.0.0" } }, + "node_modules/html-loader/node_modules/clean-css": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/html-loader/node_modules/commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/html-loader/node_modules/html-minifier-terser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", + "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "5.2.0", + "commander": "^9.4.0", + "entities": "^4.3.1", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.14.2" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -16699,13 +16741,45 @@ "dev": true }, "html-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", - "integrity": "sha512-QDDNmLgn96NWtTPx/VXRerFXH0hn7cm4bruqsZ333GCb+rqiqGurcxtP/M52wcui1/iLiu0l5ms/McE7/Ik6aQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", + "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", "dev": true, "requires": { - "html-minifier-terser": "^6.1.0", + "html-minifier-terser": "^7.0.0", "parse5": "^7.0.0" + }, + "dependencies": { + "clean-css": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true + }, + "html-minifier-terser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", + "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "5.2.0", + "commander": "^9.4.0", + "entities": "^4.3.1", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.14.2" + } + } } }, "html-minifier-terser": { diff --git a/package.json b/package.json index bc84e336..03040b84 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", - "html-loader": "4.1.0", + "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", From 7fea21f22185bd9678d4148baaf15e1454d83ed0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:43:13 +0530 Subject: [PATCH 324/824] Update dependency sass to v1.55.0 (#872) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e29be33..88c3a8d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.54.9", + "sass": "1.55.0", "sass-loader": "13.0.2", "stream-browserify": "3.0.0", "style-loader": "3.3.1", @@ -10153,9 +10153,9 @@ } }, "node_modules/sass": { - "version": "1.54.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", - "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19490,9 +19490,9 @@ } }, "sass": { - "version": "1.54.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", - "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 03040b84..c92ad32b 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.54.9", + "sass": "1.55.0", "sass-loader": "13.0.2", "stream-browserify": "3.0.0", "style-loader": "3.3.1", From ee144ccb2b5642f1eb96c136530fbabe12b5b900 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:45:50 +0530 Subject: [PATCH 325/824] Lock file maintenance (#873) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88c3a8d5..9f9e1d68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3408,9 +3408,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001405", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001405.tgz", - "integrity": "sha512-lbm+F6HaYFGfjejrTlgB6IZQSZjpA1qcrjGsuvecatP93emI66a41hmQJIW+KNMhcuusgQW0R0E9qvP+Hq7eLg==", + "version": "1.0.30001406", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", + "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", "dev": true, "funding": [ { @@ -14433,9 +14433,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001405", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001405.tgz", - "integrity": "sha512-lbm+F6HaYFGfjejrTlgB6IZQSZjpA1qcrjGsuvecatP93emI66a41hmQJIW+KNMhcuusgQW0R0E9qvP+Hq7eLg==", + "version": "1.0.30001406", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", + "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", "dev": true }, "caseless": { From 4291005161747500f1c983543f5ddd8325f588fe Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Sun, 25 Sep 2022 16:01:59 +0200 Subject: [PATCH 326/824] Handle nested lists (#853) * Handle nested lists * Allow heading to not be followed by an empty line * Don't parse as inline code if contains newlines * Use escape rule in plain as well --- src/util/markdown.js | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/util/markdown.js b/src/util/markdown.js index d0f5d6b2..c6c1a490 100644 --- a/src/util/markdown.js +++ b/src/util/markdown.js @@ -1,3 +1,4 @@ +/* eslint-disable no-param-reassign */ /* eslint-disable no-use-before-define */ import SimpleMarkdown from '@khanacademy/simple-markdown'; import { idRegex, parseIdUri } from './common'; @@ -88,6 +89,10 @@ const plainRules = { plain: (node, output, state) => `${output(node.content, state)}\n\n`, html: (node, output, state) => htmlTag('p', output(node.content, state)), }, + escape: { + ...defaultRules.escape, + plain: (node, output, state) => `\\${output(node.content, state)}`, + }, br: { ...defaultRules.br, match: anyScopeRegex(/^ *\n/), @@ -107,7 +112,7 @@ const markdownRules = { ...plainRules, heading: { ...defaultRules.heading, - match: blockRegex(/^ *(#{1,6})([^\n:]*?(?: [^\n]*?)?)#* *(?:\n *)+\n/), + match: blockRegex(/^ *(#{1,6})([^\n:]*?(?: [^\n]*?)?)#* *(?:\n *)*\n/), plain: (node, output, state) => { const out = output(node.content, state); if (state.kind === 'edit' || state.kind === 'notification' || node.level > 2) { @@ -122,7 +127,7 @@ const markdownRules = { }, codeBlock: { ...defaultRules.codeBlock, - plain: (node) => `\`\`\`${node.lang || ''}\n${node.content}\n\`\`\``, + plain: (node) => `\`\`\`${node.lang || ''}\n${node.content}\n\`\`\`\n`, html: (node) => htmlTag('pre', htmlTag('code', sanitizeText(node.content), { class: node.lang ? `language-${node.lang}` : undefined, })), @@ -137,10 +142,22 @@ const markdownRules = { }, list: { ...defaultRules.list, - plain: (node, output, state) => `${node.items.map((item, i) => { - const prefix = node.ordered ? `${node.start + i}. ` : '* '; - return prefix + output(item, state).replace(/\n/g, `\n${' '.repeat(prefix.length)}`); - }).join('\n')}\n`, + plain: (node, output, state) => { + const oldList = state._list; + state._list = true; + + let items = node.items.map((item, i) => { + const prefix = node.ordered ? `${node.start + i}. ` : '* '; + return prefix + output(item, state).replace(/\n/g, `\n${' '.repeat(prefix.length)}`); + }).join('\n'); + + state._list = oldList; + + if (!state._list) { + items += '\n\n'; + } + return items; + }, }, def: undefined, table: { @@ -219,10 +236,6 @@ const markdownRules = { match: inlineRegex(/^¯\\_\(ツ\)_\/¯/), parse: (capture) => ({ type: 'text', content: capture[0] }), }, - escape: { - ...defaultRules.escape, - plain: (node, output, state) => `\\${output(node.content, state)}`, - }, tableSeparator: { ...defaultRules.tableSeparator, plain: () => ' | ', @@ -278,6 +291,7 @@ const markdownRules = { }, inlineCode: { ...defaultRules.inlineCode, + match: inlineRegex(/^(`+)([^\n]*?[^`\n])\1(?!`)/), plain: (node) => `\`${node.content}\``, }, spoiler: { @@ -349,13 +363,13 @@ function mapElement(el) { case 'BLOCKQUOTE': return [{ type: 'blockQuote', content: mapChildren(el) }]; case 'UL': - return [{ type: 'list', items: mapChildren(el) }]; + return [{ type: 'list', items: Array.from(el.childNodes).map(mapNode) }]; case 'OL': return [{ type: 'list', ordered: true, start: Number(el.getAttribute('start')), - items: mapChildren(el), + items: Array.from(el.childNodes).map(mapNode), }]; case 'TABLE': { const headerEl = Array.from(el.querySelector('thead > tr').childNodes); From d0ddedc2b20fc30a1c8b2f9d3d02b6a5ae6e9c49 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 28 Sep 2022 13:54:58 +0530 Subject: [PATCH 327/824] Wrap view source text --- src/app/organisms/view-source/ViewSource.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/organisms/view-source/ViewSource.scss b/src/app/organisms/view-source/ViewSource.scss index 81b53f39..9ceab8b0 100644 --- a/src/app/organisms/view-source/ViewSource.scss +++ b/src/app/organisms/view-source/ViewSource.scss @@ -5,6 +5,8 @@ & pre { padding: var(--sp-extra-tight); + white-space: pre-wrap; + word-break: break-all; } &__card { From 759f16d5b98548f004c6c2678c45f60f7faf671b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 28 Sep 2022 18:17:15 +0530 Subject: [PATCH 328/824] Fix crash on space leave --- src/app/organisms/navigation/Home.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/navigation/Home.jsx b/src/app/organisms/navigation/Home.jsx index 9e749560..6bfa6c0d 100644 --- a/src/app/organisms/navigation/Home.jsx +++ b/src/app/organisms/navigation/Home.jsx @@ -25,7 +25,7 @@ function Home({ spaceId }) { let directIds = []; if (spaceId) { - const spaceChildIds = roomList.getSpaceChildren(spaceId); + const spaceChildIds = roomList.getSpaceChildren(spaceId) ?? []; spaceIds = spaceChildIds.filter((roomId) => spaces.has(roomId)); roomIds = spaceChildIds.filter((roomId) => rooms.has(roomId)); directIds = spaceChildIds.filter((roomId) => directs.has(roomId)); From e2de51832cf704ee1d60fb6374eb47eade74b433 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 19:16:07 +0530 Subject: [PATCH 329/824] Update dependency matrix-js-sdk to v19.7.0 (#876) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f9e1d68..39774eee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "19.5.0", + "matrix-js-sdk": "19.7.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7821,9 +7821,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.5.0.tgz", - "integrity": "sha512-WTmXMwyhGjUVv3eR71P9wdZj4qqNPgzg9Ud7V6kB3avhZJTZlIpNdHuldXXUdPJ8WTDKY+/yDtEFLIg8pj2Q8A==", + "version": "19.7.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.7.0.tgz", + "integrity": "sha512-mFN1LBmEpYHCH6II1F8o7y8zJr0kn1yX7ga7tRXHbLJAlBS4bAXRsEoAzdv6OrV8/dS325JlVUYQLHFHQWjYxg==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17801,9 +17801,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.5.0.tgz", - "integrity": "sha512-WTmXMwyhGjUVv3eR71P9wdZj4qqNPgzg9Ud7V6kB3avhZJTZlIpNdHuldXXUdPJ8WTDKY+/yDtEFLIg8pj2Q8A==", + "version": "19.7.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.7.0.tgz", + "integrity": "sha512-mFN1LBmEpYHCH6II1F8o7y8zJr0kn1yX7ga7tRXHbLJAlBS4bAXRsEoAzdv6OrV8/dS325JlVUYQLHFHQWjYxg==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index c92ad32b..2be74604 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "19.5.0", + "matrix-js-sdk": "19.7.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 9185ee0cf94d3340aef2d464a91afcbd0471a96d Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 28 Sep 2022 19:26:12 +0530 Subject: [PATCH 330/824] Release v2.2.1 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39774eee..b26300d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.0", + "version": "2.2.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.0", + "version": "2.2.1", "license": "MIT", "dependencies": { "@fontsource/inter": "4.5.12", diff --git a/package.json b/package.json index 2be74604..8bd76220 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.0", + "version": "2.2.1", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 474dc04e..38b79f45 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.0', + version: '2.2.1', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 78374d03010c6c1918510aab0da916b5af7b73e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:43:56 +0530 Subject: [PATCH 331/824] Update dependency matrix-js-sdk to v20 (#879) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b26300d6..65f70d0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "19.7.0", + "matrix-js-sdk": "20.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7821,9 +7821,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "19.7.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.7.0.tgz", - "integrity": "sha512-mFN1LBmEpYHCH6II1F8o7y8zJr0kn1yX7ga7tRXHbLJAlBS4bAXRsEoAzdv6OrV8/dS325JlVUYQLHFHQWjYxg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.0.tgz", + "integrity": "sha512-eOKTiWhvUxiPtl4bHFLJh/kQRdaR3ucTUTTvGXZAWh1Ljo6emU2VILPCQWyl7HTOzjCvkRHAvuGlBypMQZf+MQ==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17801,9 +17801,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "19.7.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.7.0.tgz", - "integrity": "sha512-mFN1LBmEpYHCH6II1F8o7y8zJr0kn1yX7ga7tRXHbLJAlBS4bAXRsEoAzdv6OrV8/dS325JlVUYQLHFHQWjYxg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.0.tgz", + "integrity": "sha512-eOKTiWhvUxiPtl4bHFLJh/kQRdaR3ucTUTTvGXZAWh1Ljo6emU2VILPCQWyl7HTOzjCvkRHAvuGlBypMQZf+MQ==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index 8bd76220..f83fbb29 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "19.7.0", + "matrix-js-sdk": "20.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 91a6916f4ca1b876028280856cba8ce12115a81e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:48:41 +0530 Subject: [PATCH 332/824] Release v2.2.2 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65f70d0b..b78d03d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.1", + "version": "2.2.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.1", + "version": "2.2.2", "license": "MIT", "dependencies": { "@fontsource/inter": "4.5.12", diff --git a/package.json b/package.json index f83fbb29..0f6e25d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.1", + "version": "2.2.2", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 38b79f45..785047d7 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.1', + version: '2.2.2', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 7db4146c8d4f020ec05f817588e1f94bf14af1ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:13:06 +0530 Subject: [PATCH 333/824] Update actions/setup-node action to v3.5.0 (#878) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index c43d007a..88b6f20a 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.4.1 + uses: actions/setup-node@v3.5.0 with: node-version: 17.9.0 cache: 'npm' diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 4a068d2e..d812c215 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.4.1 + uses: actions/setup-node@v3.5.0 with: node-version: 17.9.0 cache: 'npm' diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 3c7a4c35..8fa199d5 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.0.2 - name: Setup node - uses: actions/setup-node@v3.4.1 + uses: actions/setup-node@v3.5.0 with: node-version: 17.9.0 cache: 'npm' From 820f255929a8a49a5e18cb7fd9e8ee1d9f462097 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:15:39 +0530 Subject: [PATCH 334/824] Update babel monorepo to v7.19.3 (#880) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 156 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/package-lock.json b/package-lock.json index b78d03d7..06c108be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,8 +41,8 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.1", - "@babel/preset-env": "7.19.1", + "@babel/core": "7.19.3", + "@babel/preset-env": "7.19.3", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", @@ -105,30 +105,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -144,12 +144,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", + "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", "dev": true, "dependencies": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -197,12 +197,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.1", + "@babel/compat-data": "^7.19.3", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1593,13 +1593,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -1667,7 +1667,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1767,19 +1767,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", + "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.19.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/types": "^7.19.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1788,13 +1788,13 @@ } }, "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -11909,27 +11909,27 @@ } }, "@babel/compat-data": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", "dev": true }, "@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -11938,12 +11938,12 @@ } }, "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", + "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", "dev": true, "requires": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -11981,12 +11981,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.1", + "@babel/compat-data": "^7.19.3", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -12219,9 +12219,9 @@ } }, "@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12906,13 +12906,13 @@ } }, "@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -12980,7 +12980,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -13060,31 +13060,31 @@ } }, "@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", + "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.19.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/types": "^7.19.3", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, diff --git a/package.json b/package.json index 0f6e25d1..76bbde50 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.1", - "@babel/preset-env": "7.19.1", + "@babel/core": "7.19.3", + "@babel/preset-env": "7.19.3", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", From 593cc03962d9ec2bd81d3232ed3838d6f799eaa3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:17:11 +0530 Subject: [PATCH 335/824] Update dependency blurhash to v2.0.2 (#881) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06c108be..b0473bb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.0", + "blurhash": "2.0.2", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", @@ -3050,9 +3050,9 @@ "dev": true }, "node_modules/blurhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", - "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", + "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -14141,9 +14141,9 @@ } }, "blurhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", - "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", + "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" }, "bn.js": { "version": "5.2.1", diff --git a/package.json b/package.json index 76bbde50..b9eb6392 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.0", + "blurhash": "2.0.2", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", From a07a7676b7d4983bb031635c4aea3f683df70ee7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 09:48:16 +0530 Subject: [PATCH 336/824] Update dependency matrix-js-sdk to v20.0.1 (#882) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0473bb1..b3cd4aac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "20.0.0", + "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7821,9 +7821,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.0.tgz", - "integrity": "sha512-eOKTiWhvUxiPtl4bHFLJh/kQRdaR3ucTUTTvGXZAWh1Ljo6emU2VILPCQWyl7HTOzjCvkRHAvuGlBypMQZf+MQ==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.1.tgz", + "integrity": "sha512-LibgM1pYFSg4hyLMaZpG3wdWJwdax5e0dEmiKZLWG6CVLA+Z796gDjK/LXalLGWjuCz2ej6THjK23U/sndhzFg==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17801,9 +17801,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.0.tgz", - "integrity": "sha512-eOKTiWhvUxiPtl4bHFLJh/kQRdaR3ucTUTTvGXZAWh1Ljo6emU2VILPCQWyl7HTOzjCvkRHAvuGlBypMQZf+MQ==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.1.tgz", + "integrity": "sha512-LibgM1pYFSg4hyLMaZpG3wdWJwdax5e0dEmiKZLWG6CVLA+Z796gDjK/LXalLGWjuCz2ej6THjK23U/sndhzFg==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index b9eb6392..27901c05 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.0", "linkifyjs": "4.0.0", - "matrix-js-sdk": "20.0.0", + "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 3fe5a9d222bf5a4e69f81800b024194b8c8b0dff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 10:35:00 +0530 Subject: [PATCH 337/824] Bump linkifyjs from 4.0.0 to 4.0.1 (#884) Bumps [linkifyjs](https://github.com/Hypercontext/linkifyjs/tree/HEAD/packages/linkifyjs) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/Hypercontext/linkifyjs/releases) - [Changelog](https://github.com/Hypercontext/linkifyjs/blob/main/CHANGELOG.md) - [Commits](https://github.com/Hypercontext/linkifyjs/commits/v4.0.1/packages/linkifyjs) --- updated-dependencies: - dependency-name: linkifyjs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3cd4aac..cab30ff7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.0", - "linkifyjs": "4.0.0", + "linkifyjs": "4.0.1", "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", "react": "17.0.2", @@ -7668,9 +7668,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0.tgz", - "integrity": "sha512-RJuSqTcPSE7lHqZzVaZbg5w231QhIHkytiCjM6lxVHhodkt2rCBNDONCYVBYRXXIBvUl/Z+xOhRwOJnVrZB4Wg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.1.tgz", + "integrity": "sha512-33dNbzpMEPXqei6i13+DXubONuBdiBLKRGMtYAin44CajYTgg25XunP8Vyua1TAuXhVQ1nocDl0D/qDWfY+GuQ==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -17677,9 +17677,9 @@ "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==" }, "linkifyjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.0.tgz", - "integrity": "sha512-RJuSqTcPSE7lHqZzVaZbg5w231QhIHkytiCjM6lxVHhodkt2rCBNDONCYVBYRXXIBvUl/Z+xOhRwOJnVrZB4Wg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.1.tgz", + "integrity": "sha512-33dNbzpMEPXqei6i13+DXubONuBdiBLKRGMtYAin44CajYTgg25XunP8Vyua1TAuXhVQ1nocDl0D/qDWfY+GuQ==" }, "loader-runner": { "version": "4.3.0", diff --git a/package.json b/package.json index 27901c05..8448677b 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.0", - "linkifyjs": "4.0.0", + "linkifyjs": "4.0.1", "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", "react": "17.0.2", From a900b0425417a78fe39a45a17f707f3ae28aab1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 10:43:08 +0530 Subject: [PATCH 338/824] Bump linkify-html from 4.0.0 to 4.0.1 (#883) Bumps [linkify-html](https://github.com/Hypercontext/linkifyjs/tree/HEAD/packages/linkify-html) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/Hypercontext/linkifyjs/releases) - [Changelog](https://github.com/Hypercontext/linkifyjs/blob/main/CHANGELOG.md) - [Commits](https://github.com/Hypercontext/linkifyjs/commits/v4.0.1/packages/linkify-html) --- updated-dependencies: - dependency-name: linkify-html dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index cab30ff7..84ca883d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.0", + "linkify-html": "4.0.1", "linkifyjs": "4.0.1", "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", @@ -7660,9 +7660,9 @@ } }, "node_modules/linkify-html": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0.tgz", - "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.1.tgz", + "integrity": "sha512-90z1uPTtnclis7tkUbl6qaCorx96U1c4w2YFPF2Ug5AUaKgCmMuxLJvRQZkSPMPRJ319p/mFhIoNhgCaGXzB3A==", "peerDependencies": { "linkifyjs": "^4.0.0" } @@ -17672,9 +17672,9 @@ } }, "linkify-html": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.0.tgz", - "integrity": "sha512-I8W8rhaExwKDEWoqIa6UGyLQK5nrLyXIX1poMZq0CNpsBPDSYNqkVyDNiSpXs7pRmQYIOg2zDGcVHBWj+GuYLA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.1.tgz", + "integrity": "sha512-90z1uPTtnclis7tkUbl6qaCorx96U1c4w2YFPF2Ug5AUaKgCmMuxLJvRQZkSPMPRJ319p/mFhIoNhgCaGXzB3A==" }, "linkifyjs": { "version": "4.0.1", diff --git a/package.json b/package.json index 8448677b..dae8f6a1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.0", + "linkify-html": "4.0.1", "linkifyjs": "4.0.1", "matrix-js-sdk": "20.0.1", "prop-types": "15.8.1", From bf94550a84d87cb79f389b65dbafc4103b41a2fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Oct 2022 09:07:04 +0530 Subject: [PATCH 339/824] Bump matrix-js-sdk from 20.0.1 to 20.0.2 (#888) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 20.0.1 to 20.0.2. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v20.0.1...v20.0.2) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84ca883d..fc9d6043 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.1", "linkifyjs": "4.0.1", - "matrix-js-sdk": "20.0.1", + "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7821,9 +7821,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.1.tgz", - "integrity": "sha512-LibgM1pYFSg4hyLMaZpG3wdWJwdax5e0dEmiKZLWG6CVLA+Z796gDjK/LXalLGWjuCz2ej6THjK23U/sndhzFg==", + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.2.tgz", + "integrity": "sha512-PZMiLQHtmV+c5wZxS7EyWUKgHMJ/Syad7S5RxZVg80wug3qlX3oXkfyxZwrcMK4T1xE31upizspTZLm5Bkl2Vw==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17801,9 +17801,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.1.tgz", - "integrity": "sha512-LibgM1pYFSg4hyLMaZpG3wdWJwdax5e0dEmiKZLWG6CVLA+Z796gDjK/LXalLGWjuCz2ej6THjK23U/sndhzFg==", + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.2.tgz", + "integrity": "sha512-PZMiLQHtmV+c5wZxS7EyWUKgHMJ/Syad7S5RxZVg80wug3qlX3oXkfyxZwrcMK4T1xE31upizspTZLm5Bkl2Vw==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index dae8f6a1..02b26cac 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.1", "linkifyjs": "4.0.1", - "matrix-js-sdk": "20.0.1", + "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From f577435e98933ff21ba11e7e722c24dac8a7463d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:00:39 +0530 Subject: [PATCH 340/824] Bump blurhash from 2.0.2 to 2.0.3 (#893) Bumps [blurhash](https://github.com/woltapp/blurhash) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/woltapp/blurhash/releases) - [Commits](https://github.com/woltapp/blurhash/commits) --- updated-dependencies: - dependency-name: blurhash dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc9d6043..d56a671b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.2", + "blurhash": "2.0.3", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", @@ -3050,9 +3050,9 @@ "dev": true }, "node_modules/blurhash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", - "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", + "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -14141,9 +14141,9 @@ } }, "blurhash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", - "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", + "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" }, "bn.js": { "version": "5.2.1", diff --git a/package.json b/package.json index 02b26cac..7c537d77 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@matrix-org/olm": "3.2.12", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.2", + "blurhash": "2.0.3", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", From bcdc1d8915dabf1d9709f2a710025d3e42581b70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:02:35 +0530 Subject: [PATCH 341/824] Bump @fontsource/inter from 4.5.12 to 4.5.13 (#895) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.12 to 4.5.13. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d56a671b..141e0beb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.2.2", "license": "MIT", "dependencies": { - "@fontsource/inter": "4.5.12", + "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.4", "@matrix-org/olm": "3.2.12", @@ -1849,9 +1849,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.12.tgz", - "integrity": "sha512-bGKk4/8tube/nCk8hav0ZDBVbzJzc7m0Vt4xF5p15IN4YImwGdtKG38Oq5bU8xHNS+VfvbFFCepgQNj7Pr/Lvg==" + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.13.tgz", + "integrity": "sha512-nABtF6jNZZHrotLRiGBByhG7NKJGJHgMbX5W8v6C/7nSdyiWtMRfZX7AMIECDLYGUOEArZDeVO/SbkgwKLrLJw==" }, "node_modules/@fontsource/roboto": { "version": "4.5.8", @@ -13123,9 +13123,9 @@ } }, "@fontsource/inter": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.12.tgz", - "integrity": "sha512-bGKk4/8tube/nCk8hav0ZDBVbzJzc7m0Vt4xF5p15IN4YImwGdtKG38Oq5bU8xHNS+VfvbFFCepgQNj7Pr/Lvg==" + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.13.tgz", + "integrity": "sha512-nABtF6jNZZHrotLRiGBByhG7NKJGJHgMbX5W8v6C/7nSdyiWtMRfZX7AMIECDLYGUOEArZDeVO/SbkgwKLrLJw==" }, "@fontsource/roboto": { "version": "4.5.8", diff --git a/package.json b/package.json index 7c537d77..d266ea3b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "4.5.12", + "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.4", "@matrix-org/olm": "3.2.12", From 1f872a9b0c2859ca5133dd583e95dd456a39f7d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:03:14 +0530 Subject: [PATCH 342/824] Bump linkifyjs from 4.0.1 to 4.0.2 (#896) Bumps [linkifyjs](https://github.com/Hypercontext/linkifyjs/tree/HEAD/packages/linkifyjs) from 4.0.1 to 4.0.2. - [Release notes](https://github.com/Hypercontext/linkifyjs/releases) - [Changelog](https://github.com/Hypercontext/linkifyjs/blob/main/CHANGELOG.md) - [Commits](https://github.com/Hypercontext/linkifyjs/commits/v4.0.2/packages/linkifyjs) --- updated-dependencies: - dependency-name: linkifyjs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 141e0beb..ba8c5442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.1", - "linkifyjs": "4.0.1", + "linkifyjs": "4.0.2", "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", "react": "17.0.2", @@ -7668,9 +7668,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.1.tgz", - "integrity": "sha512-33dNbzpMEPXqei6i13+DXubONuBdiBLKRGMtYAin44CajYTgg25XunP8Vyua1TAuXhVQ1nocDl0D/qDWfY+GuQ==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", + "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -17677,9 +17677,9 @@ "integrity": "sha512-90z1uPTtnclis7tkUbl6qaCorx96U1c4w2YFPF2Ug5AUaKgCmMuxLJvRQZkSPMPRJ319p/mFhIoNhgCaGXzB3A==" }, "linkifyjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.1.tgz", - "integrity": "sha512-33dNbzpMEPXqei6i13+DXubONuBdiBLKRGMtYAin44CajYTgg25XunP8Vyua1TAuXhVQ1nocDl0D/qDWfY+GuQ==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", + "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" }, "loader-runner": { "version": "4.3.0", diff --git a/package.json b/package.json index d266ea3b..8aa091a6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "html-react-parser": "3.0.4", "katex": "0.16.2", "linkify-html": "4.0.1", - "linkifyjs": "4.0.1", + "linkifyjs": "4.0.2", "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", "react": "17.0.2", From e170d02bff3eac2eb18c566bed2362e64285e5e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:05:33 +0530 Subject: [PATCH 343/824] Bump linkify-html from 4.0.1 to 4.0.2 (#894) Bumps [linkify-html](https://github.com/Hypercontext/linkifyjs/tree/HEAD/packages/linkify-html) from 4.0.1 to 4.0.2. - [Release notes](https://github.com/Hypercontext/linkifyjs/releases) - [Changelog](https://github.com/Hypercontext/linkifyjs/blob/main/CHANGELOG.md) - [Commits](https://github.com/Hypercontext/linkifyjs/commits/v4.0.2/packages/linkify-html) --- updated-dependencies: - dependency-name: linkify-html dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba8c5442..5321fd8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.1", + "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", @@ -7660,9 +7660,9 @@ } }, "node_modules/linkify-html": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.1.tgz", - "integrity": "sha512-90z1uPTtnclis7tkUbl6qaCorx96U1c4w2YFPF2Ug5AUaKgCmMuxLJvRQZkSPMPRJ319p/mFhIoNhgCaGXzB3A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.2.tgz", + "integrity": "sha512-YcN3tsyutK2Y/uSuoG0zne8FQdoqzrAgNU5ko0DWE7M2oQ3ms4z/202f2W4TvRm9uxKdrsWAullfynANLaVMqw==", "peerDependencies": { "linkifyjs": "^4.0.0" } @@ -17672,9 +17672,9 @@ } }, "linkify-html": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.1.tgz", - "integrity": "sha512-90z1uPTtnclis7tkUbl6qaCorx96U1c4w2YFPF2Ug5AUaKgCmMuxLJvRQZkSPMPRJ319p/mFhIoNhgCaGXzB3A==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.2.tgz", + "integrity": "sha512-YcN3tsyutK2Y/uSuoG0zne8FQdoqzrAgNU5ko0DWE7M2oQ3ms4z/202f2W4TvRm9uxKdrsWAullfynANLaVMqw==" }, "linkifyjs": { "version": "4.0.2", diff --git a/package.json b/package.json index 8aa091a6..6c2bd0ff 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "formik": "2.2.9", "html-react-parser": "3.0.4", "katex": "0.16.2", - "linkify-html": "4.0.1", + "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "20.0.2", "prop-types": "15.8.1", From 8ea2b0b63b286af39bc9e95859e4c489053442b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:19:58 +0530 Subject: [PATCH 344/824] Lock file maintenance (#875) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 386 ++++++++++++++++++++++++++-------------------- 1 file changed, 215 insertions(+), 171 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5321fd8a..bdc7b2d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1859,9 +1859,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2212,9 +2212,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", + "version": "18.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", + "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", "dev": true }, "node_modules/@types/prop-types": { @@ -2235,9 +2235,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", - "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "version": "18.0.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", + "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3408,9 +3408,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001406", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", - "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", "dev": true, "funding": [ { @@ -3501,9 +3501,9 @@ } }, "node_modules/clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -3601,11 +3601,12 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, "engines": { - "node": ">= 12" + "node": "^12.20.0 || >=14" } }, "node_modules/commondir": { @@ -3879,9 +3880,9 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", - "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.4.tgz", + "integrity": "sha512-gCEcIEEqCR6230WroNunK/653CWKhqyCKJ9b+uESqOt/WFJA8B4lTnnQFdpYY5vmBcwJAA90Bo5vXs+CVsf6iA==", "dev": true, "dependencies": { "browserslist": "^4.21.4" @@ -3892,9 +3893,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", - "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.4.tgz", + "integrity": "sha512-qRbgm0ADrsNTU66UcW47YMJjXm+ShhUP2gkoEoAShT2BHO3cb5gGqLtmWpjnM6Wx9h5hMSF4uZ+jEV/8+4KCsw==", "dev": true, "hasInstallScript": true, "funding": { @@ -4688,9 +4689,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", "dev": true }, "node_modules/elliptic": { @@ -4799,22 +4800,22 @@ } }, "node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -4824,6 +4825,7 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -6427,28 +6429,7 @@ "webpack": "^5.0.0" } }, - "node_modules/html-loader/node_modules/clean-css": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", - "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/html-loader/node_modules/commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/html-loader/node_modules/html-minifier-terser": { + "node_modules/html-minifier-terser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", @@ -6469,27 +6450,6 @@ "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-react-parser": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.4.tgz", @@ -6527,6 +6487,48 @@ "webpack": "^5.20.0" } }, + "node_modules/html-webpack-plugin/node_modules/clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -6868,9 +6870,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", - "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -7257,9 +7259,9 @@ } }, "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, "node_modules/js-tokens": { @@ -7388,6 +7390,14 @@ "katex": "cli.js" } }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8784,9 +8794,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "funding": [ { "type": "opencollective", @@ -10049,6 +10059,20 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11831,9 +11855,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13133,9 +13157,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -13438,9 +13462,9 @@ "dev": true }, "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", + "version": "18.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", + "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", "dev": true }, "@types/prop-types": { @@ -13461,9 +13485,9 @@ "dev": true }, "@types/react": { - "version": "18.0.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", - "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "version": "18.0.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", + "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -14433,9 +14457,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001406", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", - "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", "dev": true }, "caseless": { @@ -14498,9 +14522,9 @@ } }, "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -14579,9 +14603,10 @@ } }, "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -14801,18 +14826,18 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", - "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.4.tgz", + "integrity": "sha512-gCEcIEEqCR6230WroNunK/653CWKhqyCKJ9b+uESqOt/WFJA8B4lTnnQFdpYY5vmBcwJAA90Bo5vXs+CVsf6iA==", "dev": true, "requires": { "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", - "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.4.tgz", + "integrity": "sha512-qRbgm0ADrsNTU66UcW47YMJjXm+ShhUP2gkoEoAShT2BHO3cb5gGqLtmWpjnM6Wx9h5hMSF4uZ+jEV/8+4KCsw==", "dev": true }, "core-util-is": { @@ -15415,9 +15440,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", "dev": true }, "elliptic": { @@ -15497,22 +15522,22 @@ } }, "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -15522,6 +15547,7 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -16748,53 +16774,21 @@ "requires": { "html-minifier-terser": "^7.0.0", "parse5": "^7.0.0" - }, - "dependencies": { - "clean-css": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", - "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true - }, - "html-minifier-terser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", - "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "5.2.0", - "commander": "^9.4.0", - "entities": "^4.3.1", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.14.2" - } - } } }, "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", + "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", "dev": true, "requires": { "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", + "clean-css": "5.2.0", + "commander": "^9.4.0", + "entities": "^4.3.1", "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^5.10.0" + "terser": "^5.14.2" } }, "html-react-parser": { @@ -16819,6 +16813,38 @@ "lodash": "^4.17.21", "pretty-error": "^4.0.0", "tapable": "^2.0.0" + }, + "dependencies": { + "clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + } } }, "htmlparser2": { @@ -17057,9 +17083,9 @@ } }, "is-callable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", - "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { @@ -17319,9 +17345,9 @@ } }, "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", "dev": true }, "js-tokens": { @@ -17418,6 +17444,13 @@ "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", "requires": { "commander": "^8.0.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } } }, "kind-of": { @@ -18531,9 +18564,9 @@ } }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -19415,6 +19448,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -20731,9 +20775,9 @@ "dev": true }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", "dev": true }, "xtend": { From c3396780d7255cd4a7573bce3cf97362405ce8d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 08:57:58 +0530 Subject: [PATCH 345/824] Bump actions/checkout from 3.0.2 to 3.1.0 (#904) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.0.2...v3.1.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 88b6f20a..990c1aa2 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: Setup node uses: actions/setup-node@v3.5.0 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 922e0c0e..3a813dcb 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: Build Docker image uses: docker/build-push-action@v3.1.1 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index ff7bf6f1..60178668 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index d812c215..1bd52321 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: Setup node uses: actions/setup-node@v3.5.0 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 8fa199d5..761f06b3 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: Setup node uses: actions/setup-node@v3.5.0 with: @@ -64,7 +64,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 - name: Set up QEMU uses: docker/setup-qemu-action@v2.0.0 - name: Set up Docker Buildx From c8301c6ad672a91ae2b5f1e0d8dfc1a21cc66890 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:00:52 +0530 Subject: [PATCH 346/824] Bump @matrix-org/olm from 3.2.12 to 3.2.13 (#906) Bumps @matrix-org/olm from 3.2.12 to 3.2.13. --- updated-dependencies: - dependency-name: "@matrix-org/olm" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdc7b2d3..cce33b2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.4", - "@matrix-org/olm": "3.2.12", + "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", "blurhash": "2.0.3", @@ -1991,9 +1991,9 @@ "dev": true }, "node_modules/@matrix-org/olm": { - "version": "3.2.12", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" + "version": "3.2.13", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.13.tgz", + "integrity": "sha1-AQn96TvMYd74UfeYJsk4TAc7UXU=" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -13261,9 +13261,9 @@ "dev": true }, "@matrix-org/olm": { - "version": "3.2.12", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" + "version": "3.2.13", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.13.tgz", + "integrity": "sha1-AQn96TvMYd74UfeYJsk4TAc7UXU=" }, "@nodelib/fs.scandir": { "version": "2.1.5", diff --git a/package.json b/package.json index 6c2bd0ff..6f63796a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.4", - "@matrix-org/olm": "3.2.12", + "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", "blurhash": "2.0.3", From 33551089ad15fab381153021c4389ff58ff43cfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:03:45 +0530 Subject: [PATCH 347/824] Bump @khanacademy/simple-markdown from 0.8.4 to 0.8.5 (#910) Bumps [@khanacademy/simple-markdown](https://github.com/Khan/simple-markdown) from 0.8.4 to 0.8.5. - [Release notes](https://github.com/Khan/simple-markdown/releases) - [Commits](https://github.com/Khan/simple-markdown/commits) --- updated-dependencies: - dependency-name: "@khanacademy/simple-markdown" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index cce33b2f..09827eab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.4", + "@khanacademy/simple-markdown": "0.8.5", "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", @@ -1973,9 +1973,9 @@ } }, "node_modules/@khanacademy/simple-markdown": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.4.tgz", - "integrity": "sha512-LzpAJY5G4xpmfAc1HHdHVg8ocyijXI5F3vLHRbUz3NrJHHi9UecUXrprEWHsgIrI0MrzwZk7cAINSXDf467yUg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.5.tgz", + "integrity": "sha512-xPLm0bBqdIMeNA/sjjD6T8YHT28vsyYVM8ewe6S2QkmVELHpj4XdLayVN6PHjBMoSfJXunfs17Nq32GR+j+PZQ==", "dependencies": { "@types/react": ">=16.0.0" }, @@ -13247,9 +13247,9 @@ } }, "@khanacademy/simple-markdown": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.4.tgz", - "integrity": "sha512-LzpAJY5G4xpmfAc1HHdHVg8ocyijXI5F3vLHRbUz3NrJHHi9UecUXrprEWHsgIrI0MrzwZk7cAINSXDf467yUg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.5.tgz", + "integrity": "sha512-xPLm0bBqdIMeNA/sjjD6T8YHT28vsyYVM8ewe6S2QkmVELHpj4XdLayVN6PHjBMoSfJXunfs17Nq32GR+j+PZQ==", "requires": { "@types/react": ">=16.0.0" } diff --git a/package.json b/package.json index 6f63796a..0d5f4eff 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "@fontsource/inter": "4.5.13", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.4", + "@khanacademy/simple-markdown": "0.8.5", "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", From 507f9c3c2221c023f9eca5afaf610de88f5817cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:07:24 +0530 Subject: [PATCH 348/824] Bump @babel/preset-env from 7.19.3 to 7.19.4 (#911) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.19.3 to 7.19.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.19.4/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 130 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 09827eab..6de8e811 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@babel/core": "7.19.3", - "@babel/preset-env": "7.19.3", + "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", @@ -105,9 +105,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -449,9 +449,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -710,14 +710,14 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.18.8" }, @@ -1066,12 +1066,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1119,12 +1119,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1593,12 +1593,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", - "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.19.4", "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", @@ -1613,7 +1613,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", @@ -1637,10 +1637,10 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-block-scoping": "^7.19.4", "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.13", + "@babel/plugin-transform-destructuring": "^7.19.4", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -1667,7 +1667,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1788,12 +1788,12 @@ } }, "node_modules/@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -11933,9 +11933,9 @@ } }, "@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "dev": true }, "@babel/core": { @@ -12191,9 +12191,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true }, "@babel/helper-validator-identifier": { @@ -12362,14 +12362,14 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.18.8" } @@ -12601,12 +12601,12 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-classes": { @@ -12636,12 +12636,12 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-dotall-regex": { @@ -12930,12 +12930,12 @@ } }, "@babel/preset-env": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", - "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.19.4", "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", @@ -12950,7 +12950,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", @@ -12974,10 +12974,10 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-block-scoping": "^7.19.4", "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.13", + "@babel/plugin-transform-destructuring": "^7.19.4", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -13004,7 +13004,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -13102,12 +13102,12 @@ } }, "@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } diff --git a/package.json b/package.json index 0d5f4eff..7a05f08d 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ }, "devDependencies": { "@babel/core": "7.19.3", - "@babel/preset-env": "7.19.3", + "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "8.2.5", From 4297eb34c943bbc2b30e17d263f1fb2dd4554f55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:11:49 +0530 Subject: [PATCH 349/824] Bump eslint from 8.24.0 to 8.25.0 (#908) Bumps [eslint](https://github.com/eslint/eslint) from 8.24.0 to 8.25.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.24.0...v8.25.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6de8e811..b77f1b93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.24.0", + "eslint": "8.25.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -1811,9 +1811,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1872,16 +1872,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4900,14 +4890,13 @@ } }, "node_modules/eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -13119,9 +13108,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -13167,12 +13156,6 @@ "minimatch": "^3.0.4" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -15604,14 +15587,13 @@ "dev": true }, "eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", diff --git a/package.json b/package.json index 7a05f08d..2fb07465 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.24.0", + "eslint": "8.25.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From 90972e938ef7810ee5701f7440c3f50395327837 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:20:21 +0530 Subject: [PATCH 350/824] Bump sass-loader from 13.0.2 to 13.1.0 (#907) Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 13.0.2 to 13.1.0. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v13.0.2...v13.1.0) --- updated-dependencies: - dependency-name: sass-loader dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b77f1b93..106d94fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.55.0", - "sass-loader": "13.0.2", + "sass-loader": "13.1.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", @@ -10183,9 +10183,9 @@ } }, "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", + "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", "dev": true, "dependencies": { "klona": "^2.0.4", @@ -19527,9 +19527,9 @@ } }, "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", + "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", "dev": true, "requires": { "klona": "^2.0.4", diff --git a/package.json b/package.json index 2fb07465..9890b1a4 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.55.0", - "sass-loader": "13.0.2", + "sass-loader": "13.1.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", From 07570f9e8a666016371af4ab26b15f4294d82bf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:26:09 +0530 Subject: [PATCH 351/824] Bump eslint-plugin-react from 7.31.8 to 7.31.10 (#912) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.8 to 7.31.10. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.8...v7.31.10) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 106d94fe..0fb5f9ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.8", + "eslint-plugin-react": "7.31.10", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", @@ -5111,9 +5111,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -15857,9 +15857,9 @@ } }, "eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "requires": { "array-includes": "^3.1.5", diff --git a/package.json b/package.json index 9890b1a4..5a13f290 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.8", + "eslint-plugin-react": "7.31.10", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", From d59a118e83938558ee1ab71f00ec95835dc2b592 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:30:59 +0530 Subject: [PATCH 352/824] Lock file maintenance (#902) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 567 +++++++++++++++++----------------------------- 1 file changed, 214 insertions(+), 353 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fb5f9ab..d0bff095 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,12 +144,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.19.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz", + "integrity": "sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==", "dev": true, "dependencies": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -413,12 +413,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -491,14 +491,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", + "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1718,9 +1718,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1729,9 +1729,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", - "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz", + "integrity": "sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==", "dev": true, "dependencies": { "core-js-pure": "^3.25.1", @@ -1767,19 +1767,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", + "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/parser": "^7.19.4", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1953,13 +1953,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", + "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@khanacademy/simple-markdown": { @@ -2202,9 +2202,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "version": "18.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz", + "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==", "dev": true }, "node_modules/@types/prop-types": { @@ -3051,9 +3051,9 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -3064,7 +3064,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -3098,21 +3098,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", @@ -3247,26 +3232,6 @@ "safe-buffer": "^5.2.0" } }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", @@ -3398,9 +3363,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001418", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", + "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", "dev": true, "funding": [ { @@ -3650,6 +3615,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/compression/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/computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", @@ -3697,6 +3668,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/concat-stream/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/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3733,26 +3710,6 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3762,13 +3719,10 @@ } }, "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" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -3870,9 +3824,9 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.4.tgz", - "integrity": "sha512-gCEcIEEqCR6230WroNunK/653CWKhqyCKJ9b+uESqOt/WFJA8B4lTnnQFdpYY5vmBcwJAA90Bo5vXs+CVsf6iA==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", + "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", "dev": true, "dependencies": { "browserslist": "^4.21.4" @@ -3883,9 +3837,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.4.tgz", - "integrity": "sha512-qRbgm0ADrsNTU66UcW47YMJjXm+ShhUP2gkoEoAShT2BHO3cb5gGqLtmWpjnM6Wx9h5hMSF4uZ+jEV/8+4KCsw==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz", + "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==", "dev": true, "hasInstallScript": true, "funding": { @@ -4024,9 +3978,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4679,9 +4633,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "version": "1.4.276", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", + "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==", "dev": true }, "node_modules/elliptic": { @@ -4790,9 +4744,9 @@ } }, "node_modules/es-abstract": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", - "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -4805,7 +4759,7 @@ "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.6", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -5485,14 +5439,14 @@ "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -5511,7 +5465,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -5547,41 +5501,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6283,26 +6202,6 @@ "node": ">=4" } }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -6374,6 +6273,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/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/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8077,10 +7982,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/ms": { "version": "2.1.2", @@ -10044,9 +9952,23 @@ } }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safe-regex-test": { "version": "1.0.0", @@ -10645,26 +10567,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/string-range": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", @@ -10872,9 +10774,9 @@ } }, "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -11225,9 +11127,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { @@ -11951,12 +11853,12 @@ } }, "@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.19.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz", + "integrity": "sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==", "dev": true, "requires": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -12153,12 +12055,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.19.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -12210,14 +12112,14 @@ } }, "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dev": true, "requires": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" } }, "@babel/highlight": { @@ -12232,9 +12134,9 @@ } }, "@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", + "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -13029,9 +12931,9 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -13044,9 +12946,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", - "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz", + "integrity": "sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==", "dev": true, "requires": { "core-js-pure": "^3.25.1", @@ -13073,19 +12975,19 @@ } }, "@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", + "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/parser": "^7.19.4", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" } @@ -13220,13 +13122,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", + "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@khanacademy/simple-markdown": { @@ -13445,9 +13347,9 @@ "dev": true }, "@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "version": "18.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz", + "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==", "dev": true }, "@types/prop-types": { @@ -14159,9 +14061,9 @@ "dev": true }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", @@ -14172,7 +14074,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -14198,15 +14100,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } } } }, @@ -14336,14 +14229,6 @@ "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "browserslist": { @@ -14440,9 +14325,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001418", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", + "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", "dev": true }, "caseless": { @@ -14635,6 +14520,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "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 } } }, @@ -14682,6 +14573,12 @@ "util-deprecate": "~1.0.1" } }, + "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 + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14712,14 +14609,6 @@ "dev": true, "requires": { "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "content-type": { @@ -14728,13 +14617,10 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "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" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cookie": { "version": "0.5.0", @@ -14809,18 +14695,18 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.4.tgz", - "integrity": "sha512-gCEcIEEqCR6230WroNunK/653CWKhqyCKJ9b+uESqOt/WFJA8B4lTnnQFdpYY5vmBcwJAA90Bo5vXs+CVsf6iA==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", + "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", "dev": true, "requires": { "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.4.tgz", - "integrity": "sha512-qRbgm0ADrsNTU66UcW47YMJjXm+ShhUP2gkoEoAShT2BHO3cb5gGqLtmWpjnM6Wx9h5hMSF4uZ+jEV/8+4KCsw==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz", + "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==", "dev": true }, "core-util-is": { @@ -14934,9 +14820,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15423,9 +15309,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "version": "1.4.276", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", + "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==", "dev": true }, "elliptic": { @@ -15505,9 +15391,9 @@ } }, "es-abstract": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", - "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -15520,7 +15406,7 @@ "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.6", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -16031,14 +15917,14 @@ "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -16057,7 +15943,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -16089,21 +15975,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, @@ -16644,14 +16515,6 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "hash.js": { @@ -16722,6 +16585,12 @@ "util-deprecate": "~1.0.1" } }, + "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 + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -18014,9 +17883,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "ms": { @@ -19426,9 +19295,9 @@ } }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { "version": "1.0.0", @@ -19891,14 +19760,6 @@ "dev": true, "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "string-range": { @@ -20049,9 +19910,9 @@ "dev": true }, "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -20310,9 +20171,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { "escalade": "^3.1.1", From 10a399f7e65d888199c01ccd004bea96bf86c6f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:13:55 +0530 Subject: [PATCH 353/824] Bump actions/setup-node from 3.5.0 to 3.5.1 (#918) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3.5.0...v3.5.1) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 990c1aa2..abc514fb 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.1.0 - name: Setup node - uses: actions/setup-node@v3.5.0 + uses: actions/setup-node@v3.5.1 with: node-version: 17.9.0 cache: 'npm' diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 1bd52321..87eb8310 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.1.0 - name: Setup node - uses: actions/setup-node@v3.5.0 + uses: actions/setup-node@v3.5.1 with: node-version: 17.9.0 cache: 'npm' diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 761f06b3..bab44f29 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.1.0 - name: Setup node - uses: actions/setup-node@v3.5.0 + uses: actions/setup-node@v3.5.1 with: node-version: 17.9.0 cache: 'npm' From 6d8f70454272a6eb5c48e39d04432785e80f19e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:14:48 +0530 Subject: [PATCH 354/824] Bump docker/build-push-action from 3.1.1 to 3.2.0 (#919) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.1.1 to 3.2.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3.1.1...v3.2.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 3a813dcb..18617996 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.1.0 - name: Build Docker image - uses: docker/build-push-action@v3.1.1 + uses: docker/build-push-action@v3.2.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index bab44f29..5a4ddd73 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -88,7 +88,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v3.1.1 + uses: docker/build-push-action@v3.2.0 with: context: . platforms: linux/amd64,linux/arm64 From c825c41aede7bebefe2a79777ba83e0f72d8d826 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:15:17 +0530 Subject: [PATCH 355/824] Bump docker/setup-qemu-action from 2.0.0 to 2.1.0 (#921) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 5a4ddd73..7d3be856 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -66,7 +66,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.1.0 - name: Set up QEMU - uses: docker/setup-qemu-action@v2.0.0 + uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.0.0 - name: Login to Docker Hub From b52aa9ac76bf45bd19d3de6b4b50986111dfa36f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:16:01 +0530 Subject: [PATCH 356/824] Bump nwtgck/actions-netlify from 1.2.3 to 1.2.4 (#920) Bumps [nwtgck/actions-netlify](https://github.com/nwtgck/actions-netlify) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/nwtgck/actions-netlify/releases) - [Changelog](https://github.com/nwtgck/actions-netlify/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nwtgck/actions-netlify/compare/b7c1504e00c6b8a249d1848cc1b522a4865eed99...ac1cb16858bada08a9c71a81240a85cfc3f72913) --- updated-dependencies: - dependency-name: nwtgck/actions-netlify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index f5dbacc5..34b95733 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -30,7 +30,7 @@ jobs: path: dist - name: Deploy to Netlify id: netlify - uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 + uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 with: publish-dir: dist deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 87eb8310..9a4ac6e0 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -22,7 +22,7 @@ jobs: - name: Build app run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 + uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 with: publish-dir: dist deploy-message: "Dev deploy ${{ github.sha }}" diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 7d3be856..1a718e0d 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -21,7 +21,7 @@ jobs: - name: Build app run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@b7c1504e00c6b8a249d1848cc1b522a4865eed99 + uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 with: publish-dir: dist deploy-message: "Prod deploy ${{ github.ref_name }}" From 194eb3004246ccde2d6bc7070cec6b1ec157f8e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:16:49 +0530 Subject: [PATCH 357/824] Bump dawidd6/action-download-artifact from 2.23.0 to 2.24.0 (#922) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 2.23.0 to 2.24.0. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/7847792dd435a50521b8e3bd3576dae7459d1fa8...46b4ae883bf0726f5949d025d31cb62c7a5ac70c) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 34b95733..8cd46714 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -13,7 +13,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download pr number - uses: dawidd6/action-download-artifact@7847792dd435a50521b8e3bd3576dae7459d1fa8 + uses: dawidd6/action-download-artifact@46b4ae883bf0726f5949d025d31cb62c7a5ac70c with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} @@ -22,7 +22,7 @@ jobs: id: pr run: echo "::set-output name=id::$( Date: Sat, 15 Oct 2022 15:17:21 +0530 Subject: [PATCH 358/824] Bump docker/login-action from 2.0.0 to 2.1.0 (#923) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 1a718e0d..c1d270e9 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,12 +70,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.0.0 - name: Login to Docker Hub - uses: docker/login-action@v2.0.0 + uses: docker/login-action@v2.1.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to the Container registry - uses: docker/login-action@v2.0.0 + uses: docker/login-action@v2.1.0 with: registry: ghcr.io username: ${{ github.actor }} From 52376e10a513059358356c08acad7c87dea1ed4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:18:02 +0530 Subject: [PATCH 359/824] Bump docker/setup-buildx-action from 2.0.0 to 2.1.0 (#924) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index c1d270e9..f3a3c4c6 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 + uses: docker/setup-buildx-action@v2.1.0 - name: Login to Docker Hub uses: docker/login-action@v2.1.0 with: From 81b88477bd18dfb771eebd78047494b9ef5557d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:19:18 +0530 Subject: [PATCH 360/824] Bump docker/metadata-action from 4.0.1 to 4.1.0 (#925) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.0.1 to 4.1.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v4.0.1...v4.1.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index f3a3c4c6..10600bdc 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -82,7 +82,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v4.0.1 + uses: docker/metadata-action@v4.1.0 with: images: | ${{ secrets.DOCKER_USERNAME }}/cinny From 9b42077f7aae7b4011ec6a7847130996577a05f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 11:47:57 +0530 Subject: [PATCH 361/824] Bump docker/metadata-action from 4.1.0 to 4.1.1 (#928) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 10600bdc..be5671af 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -82,7 +82,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v4.1.0 + uses: docker/metadata-action@v4.1.1 with: images: | ${{ secrets.DOCKER_USERNAME }}/cinny From 89e93be091e49cf9f11b2d1cbd07cb555b948c75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 11:48:41 +0530 Subject: [PATCH 362/824] Bump docker/setup-buildx-action from 2.1.0 to 2.2.0 (#929) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.1.0...v2.2.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index be5671af..1a747d4d 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.1.0 + uses: docker/setup-buildx-action@v2.2.0 - name: Login to Docker Hub uses: docker/login-action@v2.1.0 with: From 613ffefeb35f9135e3405d2ff6bc17ed52cf9faf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 12:32:09 +0530 Subject: [PATCH 363/824] Bump util from 0.12.4 to 0.12.5 (#933) Bumps [util](https://github.com/browserify/node-util) from 0.12.4 to 0.12.5. - [Release notes](https://github.com/browserify/node-util/releases) - [Changelog](https://github.com/browserify/node-util/blob/master/CHANGELOG.md) - [Commits](https://github.com/browserify/node-util/compare/v0.12.4...v0.12.5) --- updated-dependencies: - dependency-name: util dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++--------- package.json | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0bff095..9cd0a801 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", - "util": "0.12.4", + "util": "0.12.5", "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", @@ -11177,16 +11177,15 @@ "dev": true }, "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -20207,16 +20206,15 @@ } }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, diff --git a/package.json b/package.json index 5a13f290..56e5e259 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", - "util": "0.12.4", + "util": "0.12.5", "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", From 2f4fbc9d4904d7921eb6906e083baa380b8a4949 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 12:33:29 +0530 Subject: [PATCH 364/824] Bump react-blurhash from 0.1.3 to 0.2.0 (#932) Bumps [react-blurhash](https://github.com/woltapp/react-blurhash) from 0.1.3 to 0.2.0. - [Release notes](https://github.com/woltapp/react-blurhash/releases) - [Changelog](https://github.com/woltapp/react-blurhash/blob/master/CHANGELOG.md) - [Commits](https://github.com/woltapp/react-blurhash/commits) --- updated-dependencies: - dependency-name: react-blurhash dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9cd0a801..ed3593d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", - "react-blurhash": "0.1.3", + "react-blurhash": "0.2.0", "react-dnd": "15.1.2", "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", @@ -9435,11 +9435,11 @@ } }, "node_modules/react-blurhash": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.1.3.tgz", - "integrity": "sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.2.0.tgz", + "integrity": "sha512-MfhPLfFTNCX3MCJ8nM5t+T5qAixBUv8QHVcHORs5iVaqdpg+IW/e4lpOphc0bm6AvKz//4MuHESIeKKoxi3wnA==", "peerDependencies": { - "blurhash": "^1.1.1", + "blurhash": "^2.0.3", "react": ">=15" } }, @@ -18910,9 +18910,9 @@ } }, "react-blurhash": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.1.3.tgz", - "integrity": "sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.2.0.tgz", + "integrity": "sha512-MfhPLfFTNCX3MCJ8nM5t+T5qAixBUv8QHVcHORs5iVaqdpg+IW/e4lpOphc0bm6AvKz//4MuHESIeKKoxi3wnA==" }, "react-dnd": { "version": "15.1.2", diff --git a/package.json b/package.json index 56e5e259..f8873984 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", - "react-blurhash": "0.1.3", + "react-blurhash": "0.2.0", "react-dnd": "15.1.2", "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", From 5ab202e5c9482cb28281ee4c4253b484c24895be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 12:34:05 +0530 Subject: [PATCH 365/824] Bump @fontsource/inter from 4.5.13 to 4.5.14 (#931) Bumps [@fontsource/inter](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/inter) from 4.5.13 to 4.5.14. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/inter) --- updated-dependencies: - dependency-name: "@fontsource/inter" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed3593d2..1fe06478 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.2.2", "license": "MIT", "dependencies": { - "@fontsource/inter": "4.5.13", + "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.5", "@matrix-org/olm": "3.2.13", @@ -1849,9 +1849,9 @@ } }, "node_modules/@fontsource/inter": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.13.tgz", - "integrity": "sha512-nABtF6jNZZHrotLRiGBByhG7NKJGJHgMbX5W8v6C/7nSdyiWtMRfZX7AMIECDLYGUOEArZDeVO/SbkgwKLrLJw==" + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", + "integrity": "sha512-JDC9AocdPLuGsASkvWw9hS5gtHE7K9dOwL98XLrk5yjYqxy4uVnScG58NUvFMJDVJRl/7c8Wnap6PEs+7Zvj1Q==" }, "node_modules/@fontsource/roboto": { "version": "4.5.8", @@ -13037,9 +13037,9 @@ } }, "@fontsource/inter": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.13.tgz", - "integrity": "sha512-nABtF6jNZZHrotLRiGBByhG7NKJGJHgMbX5W8v6C/7nSdyiWtMRfZX7AMIECDLYGUOEArZDeVO/SbkgwKLrLJw==" + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", + "integrity": "sha512-JDC9AocdPLuGsASkvWw9hS5gtHE7K9dOwL98XLrk5yjYqxy4uVnScG58NUvFMJDVJRl/7c8Wnap6PEs+7Zvj1Q==" }, "@fontsource/roboto": { "version": "4.5.8", diff --git a/package.json b/package.json index f8873984..41e1d555 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "Ajay Bura", "license": "MIT", "dependencies": { - "@fontsource/inter": "4.5.13", + "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.5", "@matrix-org/olm": "3.2.13", From 1625b8a665fc2a0b83c40512536f6adfdf307ade Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 12:51:42 +0530 Subject: [PATCH 366/824] Bump react-modal from 3.15.1 to 3.16.1 (#936) Bumps [react-modal](https://github.com/reactjs/react-modal) from 3.15.1 to 3.16.1. - [Release notes](https://github.com/reactjs/react-modal/releases) - [Changelog](https://github.com/reactjs/react-modal/blob/master/CHANGELOG.md) - [Commits](https://github.com/reactjs/react-modal/compare/v3.15.1...v3.16.1) --- updated-dependencies: - dependency-name: react-modal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fe06478..266fc13f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", - "react-modal": "3.15.1", + "react-modal": "3.16.1", "sanitize-html": "2.7.2", "tippy.js": "6.3.7", "twemoji": "14.0.2" @@ -9521,9 +9521,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-modal": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.15.1.tgz", - "integrity": "sha512-duB9bxOaYg7Zt6TMFldIFxQRtSP+Dg3F1ZX3FXxSUn+3tZZ/9JCgeAQKDg7rhZSAqopq8TFRw3yIbnx77gyFTw==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -18969,9 +18969,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-modal": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.15.1.tgz", - "integrity": "sha512-duB9bxOaYg7Zt6TMFldIFxQRtSP+Dg3F1ZX3FXxSUn+3tZZ/9JCgeAQKDg7rhZSAqopq8TFRw3yIbnx77gyFTw==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", "requires": { "exenv": "^1.2.0", "prop-types": "^15.7.2", diff --git a/package.json b/package.json index 41e1d555..db322f7c 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", - "react-modal": "3.15.1", + "react-modal": "3.16.1", "sanitize-html": "2.7.2", "tippy.js": "6.3.7", "twemoji": "14.0.2" From dbeac1f8eb846e08db71b192222186f393ad9ef4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 18:28:33 +0530 Subject: [PATCH 367/824] Bump matrix-js-sdk from 20.0.2 to 20.1.0 (#930) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 20.0.2 to 20.1.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v20.0.2...v20.1.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 266fc13f..23a8d1cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.2", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "20.0.2", + "matrix-js-sdk": "20.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7725,9 +7725,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.2.tgz", - "integrity": "sha512-PZMiLQHtmV+c5wZxS7EyWUKgHMJ/Syad7S5RxZVg80wug3qlX3oXkfyxZwrcMK4T1xE31upizspTZLm5Bkl2Vw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.1.0.tgz", + "integrity": "sha512-AjuWVmerJ8aEAIgD6QfmSIg0RrvA8vzvOV+ycvSGg4DgiFlVZbFvBxkVZTRdZ5icJe1/XMaCEf5OZ9Ha2hXUUg==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17684,9 +17684,9 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.0.2.tgz", - "integrity": "sha512-PZMiLQHtmV+c5wZxS7EyWUKgHMJ/Syad7S5RxZVg80wug3qlX3oXkfyxZwrcMK4T1xE31upizspTZLm5Bkl2Vw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.1.0.tgz", + "integrity": "sha512-AjuWVmerJ8aEAIgD6QfmSIg0RrvA8vzvOV+ycvSGg4DgiFlVZbFvBxkVZTRdZ5icJe1/XMaCEf5OZ9Ha2hXUUg==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index db322f7c..37135fb0 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "katex": "0.16.2", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "20.0.2", + "matrix-js-sdk": "20.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From bf7961822124af5d3cd8ef413120c025f2e074b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Oct 2022 21:05:05 +0530 Subject: [PATCH 368/824] Bump docker/setup-buildx-action from 2.2.0 to 2.2.1 (#937) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.2.0 to 2.2.1. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.2.0...v2.2.1) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 1a747d4d..ed981c3c 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.2.0 + uses: docker/setup-buildx-action@v2.2.1 - name: Login to Docker Hub uses: docker/login-action@v2.1.0 with: From 6437970f7f0d2a54c694b7b5347f142e6c670d44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Oct 2022 13:37:09 +0530 Subject: [PATCH 369/824] Lock file maintenance (#927) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 108 +++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23a8d1cb..f60a5bd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1742,15 +1742,15 @@ } }, "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", "dev": true }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "node_modules/@babel/template": { "version": "7.18.10", @@ -1953,9 +1953,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", @@ -2202,9 +2202,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz", - "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==", + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", "dev": true }, "node_modules/@types/prop-types": { @@ -3363,9 +3363,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001422", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", + "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", "dev": true, "funding": [ { @@ -4633,9 +4633,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.276", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", - "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "node_modules/elliptic": { @@ -6776,9 +6776,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -8691,9 +8691,9 @@ } }, "node_modules/postcss": { - "version": "8.4.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", - "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "funding": [ { "type": "opencollective", @@ -11032,9 +11032,9 @@ "dev": true }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", "funding": [ { "type": "opencollective", @@ -12938,9 +12938,9 @@ }, "dependencies": { "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" } } }, @@ -12955,9 +12955,9 @@ }, "dependencies": { "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", "dev": true } } @@ -13121,9 +13121,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", @@ -13346,9 +13346,9 @@ "dev": true }, "@types/node": { - "version": "18.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.4.tgz", - "integrity": "sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==", + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", "dev": true }, "@types/prop-types": { @@ -14324,9 +14324,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001422", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", + "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", "dev": true }, "caseless": { @@ -15308,9 +15308,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.276", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz", - "integrity": "sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "elliptic": { @@ -16939,9 +16939,9 @@ "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -18414,9 +18414,9 @@ } }, "postcss": { - "version": "8.4.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", - "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -20109,9 +20109,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" }, "unbox-primitive": { "version": "1.0.2", From d4da49512c788d19a0d127f31db3d313f9987922 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:39:59 +0530 Subject: [PATCH 370/824] Bump eslint from 8.25.0 to 8.26.0 (#946) Bumps [eslint](https://github.com/eslint/eslint) from 8.25.0 to 8.26.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.25.0...v8.26.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 105 +++++++++++++--------------------------------- package.json | 2 +- 2 files changed, 30 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index f60a5bd8..a81f9151 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -1859,9 +1859,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -4844,14 +4844,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4867,14 +4868,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -5197,15 +5198,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/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/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5267,26 +5259,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5296,10 +5268,10 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { "node": ">=8" @@ -13047,9 +13019,9 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -15472,14 +15444,15 @@ "dev": true }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -15495,14 +15468,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -15526,12 +15499,6 @@ "color-convert": "^2.0.1" } }, - "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 - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -15572,30 +15539,16 @@ "type-fest": "^0.20.2" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, "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 }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "supports-color": { diff --git a/package.json b/package.json index 37135fb0..08b4b6e2 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.1.0", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From 72a8483a23b329285bad744598639784bb8fa3a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:41:07 +0530 Subject: [PATCH 371/824] Bump katex from 0.16.2 to 0.16.3 (#945) Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.16.2 to 0.16.3. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.16.2...v0.16.3) --- updated-dependencies: - dependency-name: katex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a81f9151..ddde663a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "flux": "4.0.3", "formik": "2.2.9", "html-react-parser": "3.0.4", - "katex": "0.16.2", + "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "20.1.0", @@ -7242,9 +7242,9 @@ } }, "node_modules/katex": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.2.tgz", - "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", + "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -17242,9 +17242,9 @@ } }, "katex": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.2.tgz", - "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", + "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", "requires": { "commander": "^8.0.0" }, diff --git a/package.json b/package.json index 08b4b6e2..a64ef4b8 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "flux": "4.0.3", "formik": "2.2.9", "html-react-parser": "3.0.4", - "katex": "0.16.2", + "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "20.1.0", From 9efa05d4def92d592449a60bb18d0bfb2ed1ed95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:45:00 +0530 Subject: [PATCH 372/824] Bump @babel/core from 7.19.3 to 7.19.6 (#944) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.3 to 7.19.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.19.6/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 110 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddde663a..c2daafb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.19.6", "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", @@ -114,21 +114,21 @@ } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -144,9 +144,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz", - "integrity": "sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dev": true, "dependencies": { "@babel/types": "^7.19.4", @@ -339,19 +339,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1767,18 +1767,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", - "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.4", + "@babel/generator": "^7.19.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" @@ -11801,21 +11801,21 @@ "dev": true }, "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -11824,9 +11824,9 @@ } }, "@babel/generator": { - "version": "7.19.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz", - "integrity": "sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dev": true, "requires": { "@babel/types": "^7.19.4", @@ -11970,19 +11970,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" } }, "@babel/helper-optimise-call-expression": { @@ -12105,9 +12105,9 @@ } }, "@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12946,18 +12946,18 @@ } }, "@babel/traverse": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", - "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.4", + "@babel/generator": "^7.19.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" diff --git a/package.json b/package.json index a64ef4b8..7c36d782 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.19.6", "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", From eeb4ec0e734bad46318b888d64fef11e9f31ede6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:45:59 +0530 Subject: [PATCH 373/824] Bump actions/upload-artifact from 3.1.0 to 3.1.1 (#942) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index abc514fb..b6379a53 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -23,7 +23,7 @@ jobs: - name: Build app run: npm run build - name: Upload artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v3.1.1 with: name: preview path: dist @@ -31,7 +31,7 @@ jobs: - name: Save pr number run: echo ${PR_NUMBER} > ./pr.txt - name: Upload pr number - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v3.1.1 with: name: pr path: ./pr.txt From 02f7d7c74d932da716c0900795eb5f8d18978220 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:47:03 +0530 Subject: [PATCH 374/824] Bump nginx from 1.23.1-alpine to 1.23.2-alpine (#943) Bumps nginx from 1.23.1-alpine to 1.23.2-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 987c4c47..7ad952b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN npm run build ## App -FROM nginx:1.23.1-alpine +FROM nginx:1.23.2-alpine COPY --from=builder /src/dist /app From 6d9115f593f9fe8dfb39c93ba18a2d515addfddc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 16:58:04 +0530 Subject: [PATCH 375/824] Bump blurhash from 2.0.3 to 2.0.4 (#956) Bumps [blurhash](https://github.com/woltapp/blurhash) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/woltapp/blurhash/releases) - [Commits](https://github.com/woltapp/blurhash/commits) --- updated-dependencies: - dependency-name: blurhash dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2daafb5..29b8802d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.3", + "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", @@ -3040,9 +3040,9 @@ "dev": true }, "node_modules/blurhash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", - "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", + "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -14021,9 +14021,9 @@ } }, "blurhash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", - "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", + "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" }, "bn.js": { "version": "5.2.1", diff --git a/package.json b/package.json index 7c36d782..3989a890 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", - "blurhash": "2.0.3", + "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", "emojibase-data": "7.0.1", From b6f2f9998e3f9203f0614b1b7f7088dcef03b3ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 16:58:59 +0530 Subject: [PATCH 376/824] Bump sanitize-html from 2.7.2 to 2.7.3 (#957) Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.7.2 to 2.7.3. - [Release notes](https://github.com/apostrophecms/sanitize-html/releases) - [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md) - [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.7.2...2.7.3) --- updated-dependencies: - dependency-name: sanitize-html dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29b8802d..5ec2666e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", - "sanitize-html": "2.7.2", + "sanitize-html": "2.7.3", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, @@ -9962,9 +9962,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-html": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", - "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz", + "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -19268,9 +19268,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", - "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz", + "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", diff --git a/package.json b/package.json index 3989a890..c0c9bdee 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", - "sanitize-html": "2.7.2", + "sanitize-html": "2.7.3", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, From 63023c5266a84cd1f45d7544e5dd3010d3421be3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 17:02:31 +0530 Subject: [PATCH 377/824] Bump babel-loader from 8.2.5 to 9.0.1 (#958) Bumps [babel-loader](https://github.com/babel/babel-loader) from 8.2.5 to 9.0.1. - [Release notes](https://github.com/babel/babel-loader/releases) - [Changelog](https://github.com/babel/babel-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel-loader/compare/v8.2.5...v9.0.1) --- updated-dependencies: - dependency-name: babel-loader dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 646 +++++++--------------------------------------- package.json | 2 +- 2 files changed, 93 insertions(+), 555 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ec2666e..bad76c06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "8.2.5", + "babel-loader": "9.0.1", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", @@ -2859,22 +2859,20 @@ "dev": true }, "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.0.1.tgz", + "integrity": "sha512-szYjslOXFlj/po5KfrVmiuBAcI6GVHFuAgC96Qd6mMPHdwl4lmAJkYtvjQ1RxxPjgdkKjd3LQgXDE4jxEutNuw==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, "node_modules/babel-plugin-dynamic-import-node": { @@ -2994,15 +2992,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3763,59 +3752,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -4033,59 +3969,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -4677,15 +4560,6 @@ "emojibase": "*" } }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -7557,20 +7431,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7876,59 +7736,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10124,23 +9931,58 @@ } }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -11374,59 +11216,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-dev-server": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", @@ -11482,40 +11271,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/webpack-dev-server/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11531,25 +11286,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", @@ -13872,15 +13608,13 @@ "dev": true }, "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.0.1.tgz", + "integrity": "sha512-szYjslOXFlj/po5KfrVmiuBAcI6GVHFuAgC96Qd6mMPHdwl4lmAJkYtvjQ1RxxPjgdkKjd3LQgXDE4jxEutNuw==", "dev": true, "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" } }, "babel-plugin-dynamic-import-node": { @@ -13979,12 +13713,6 @@ "tweetnacl": "^0.14.3" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -14617,47 +14345,6 @@ "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "core-js": { @@ -14813,47 +14500,6 @@ "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "css-select": { @@ -15319,12 +14965,6 @@ "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", "integrity": "sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ==" }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -17523,17 +17163,6 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -17770,47 +17399,6 @@ "dev": true, "requires": { "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "minimalistic-assert": { @@ -19367,14 +18955,44 @@ } }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "select-hose": { @@ -20342,47 +19960,6 @@ "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "webpack-dev-server": { @@ -20422,33 +19999,6 @@ "ws": "^8.4.2" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -20457,18 +20007,6 @@ "requires": { "glob": "^7.1.3" } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } } } }, diff --git a/package.json b/package.json index c0c9bdee..c126381c 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "8.2.5", + "babel-loader": "9.0.1", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", From bef759e358227f9e96084de0c834c935c379fdaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 20:11:14 +0530 Subject: [PATCH 378/824] Bump css-minimizer-webpack-plugin from 4.1.0 to 4.2.2 (#934) Bumps [css-minimizer-webpack-plugin](https://github.com/webpack-contrib/css-minimizer-webpack-plugin) from 4.1.0 to 4.2.2. - [Release notes](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-minimizer-webpack-plugin/compare/v4.1.0...v4.2.2) --- updated-dependencies: - dependency-name: css-minimizer-webpack-plugin dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 520 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 2 files changed, 510 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bad76c06..9b22d29c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", "css-loader": "6.7.1", - "css-minimizer-webpack-plugin": "4.1.0", + "css-minimizer-webpack-plugin": "4.2.2", "eslint": "8.26.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", @@ -1891,6 +1891,105 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -2044,6 +2143,12 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "node_modules/@tippyjs/react": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", @@ -2177,6 +2282,30 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -2281,6 +2410,21 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -3434,6 +3578,12 @@ "node": ">=6.0" } }, + "node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3929,14 +4079,14 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dev": true, "dependencies": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -3955,6 +4105,9 @@ "@parcel/css": { "optional": true }, + "@swc/css": { + "optional": true + }, "clean-css": { "optional": true }, @@ -3969,6 +4122,45 @@ } } }, + "node_modules/css-minimizer-webpack-plugin/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/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/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/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -6960,6 +7152,93 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/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/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -12777,6 +13056,80 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -12903,6 +13256,12 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "@tippyjs/react": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", @@ -13029,6 +13388,30 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -13133,6 +13516,21 @@ "@types/node": "*" } }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -14078,6 +14476,12 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -14489,17 +14893,46 @@ } }, "css-minimizer-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dev": true, "requires": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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" + } + } } }, "css-select": { @@ -16759,6 +17192,71 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", diff --git a/package.json b/package.json index c126381c..92f1ded0 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", "css-loader": "6.7.1", - "css-minimizer-webpack-plugin": "4.1.0", + "css-minimizer-webpack-plugin": "4.2.2", "eslint": "8.26.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", From 6a907b15428e517b84717100e743d8200eda6d85 Mon Sep 17 00:00:00 2001 From: mjarr <87588014+mjarr@users.noreply.github.com> Date: Tue, 1 Nov 2022 16:06:38 +0100 Subject: [PATCH 379/824] Remove MSC3244 use from restricted room creation (#892) * Remove MSC3244 use from restricted room creation * Fix condition --- src/client/action/room.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/client/action/room.js b/src/client/action/room.js index a0a7525f..996c2680 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -236,16 +236,12 @@ async function createRoom(opts) { }); } if (parentId && joinRule === 'restricted') { - try { - const caps = await mx.getCapabilities(); - options.room_version = caps - ?.['m.room_versions'] - ?.['org.matrix.msc3244.room_capabilities'] - ?.restricted - ?.preferred - || undefined; - } catch { - console.error('Can\'t find room version for restricted.'); + const caps = await mx.getCapabilities(); + if (caps['m.room_versions'].available?.['9'] !== 'stable') { + throw new Error("ERROR: The server doesn't support restricted rooms"); + } + if (Number(caps['m.room_versions'].default) < 9) { + options.room_version = '9'; } options.initial_state.push({ type: 'm.room.join_rules', From 1d6ce13a6c69f18526c23874495c29fa99f869a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:40:29 +0530 Subject: [PATCH 380/824] Bump babel-loader from 9.0.1 to 9.1.0 (#967) Bumps [babel-loader](https://github.com/babel/babel-loader) from 9.0.1 to 9.1.0. - [Release notes](https://github.com/babel/babel-loader/releases) - [Changelog](https://github.com/babel/babel-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel-loader/compare/v9.0.1...v9.1.0) --- updated-dependencies: - dependency-name: babel-loader dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b22d29c..b3f48d63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "9.0.1", + "babel-loader": "9.1.0", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", @@ -3003,9 +3003,9 @@ "dev": true }, "node_modules/babel-loader": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.0.1.tgz", - "integrity": "sha512-szYjslOXFlj/po5KfrVmiuBAcI6GVHFuAgC96Qd6mMPHdwl4lmAJkYtvjQ1RxxPjgdkKjd3LQgXDE4jxEutNuw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", + "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.2", @@ -14006,9 +14006,9 @@ "dev": true }, "babel-loader": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.0.1.tgz", - "integrity": "sha512-szYjslOXFlj/po5KfrVmiuBAcI6GVHFuAgC96Qd6mMPHdwl4lmAJkYtvjQ1RxxPjgdkKjd3LQgXDE4jxEutNuw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", + "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", "dev": true, "requires": { "find-cache-dir": "^3.3.2", diff --git a/package.json b/package.json index 92f1ded0..12b81ebb 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@babel/preset-env": "7.19.4", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "9.0.1", + "babel-loader": "9.1.0", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", From 8dc9e01439c623d5e6afbadec28cbf26f9e0397d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:41:13 +0530 Subject: [PATCH 381/824] Bump @babel/preset-env from 7.19.4 to 7.20.2 (#966) Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.19.4 to 7.20.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.20.2/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 338 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 158 insertions(+), 182 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3f48d63..9c88c6b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@babel/core": "7.19.6", - "@babel/preset-env": "7.19.4", + "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "9.1.0", @@ -105,9 +105,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -197,12 +197,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -370,9 +370,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -563,9 +563,9 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", - "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -710,16 +710,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", - "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/plugin-transform-parameters": "^7.20.1" }, "engines": { "node": ">=6.9.0" @@ -875,12 +875,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1066,12 +1066,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", - "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1081,18 +1081,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, @@ -1119,12 +1119,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", - "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1243,14 +1243,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1260,15 +1259,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -1278,16 +1276,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", - "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.6", "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1360,12 +1357,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1593,18 +1590,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", - "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1613,7 +1610,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", @@ -1624,7 +1621,7 @@ "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1637,10 +1634,10 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.19.4", - "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -1648,14 +1645,14 @@ "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", @@ -1667,7 +1664,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1788,9 +1785,9 @@ } }, "node_modules/@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -3019,15 +3016,6 @@ "webpack": ">=5" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -11810,9 +11798,9 @@ } }, "@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", "dev": true }, "@babel/core": { @@ -11882,12 +11870,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -12010,9 +11998,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -12146,9 +12134,9 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", - "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -12239,16 +12227,16 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", - "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/plugin-transform-parameters": "^7.20.1" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -12350,12 +12338,12 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-json-strings": { @@ -12478,27 +12466,27 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", - "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } @@ -12513,12 +12501,12 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", - "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { @@ -12589,39 +12577,36 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", - "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.6", "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { @@ -12664,12 +12649,12 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { @@ -12807,18 +12792,18 @@ } }, "@babel/preset-env": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", - "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -12827,7 +12812,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", @@ -12838,7 +12823,7 @@ "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -12851,10 +12836,10 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.19.4", - "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -12862,14 +12847,14 @@ "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", @@ -12881,7 +12866,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -12979,9 +12964,9 @@ } }, "@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -14015,15 +14000,6 @@ "schema-utils": "^4.0.0" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", diff --git a/package.json b/package.json index 12b81ebb..93c7b515 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ }, "devDependencies": { "@babel/core": "7.19.6", - "@babel/preset-env": "7.19.4", + "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", "babel-loader": "9.1.0", From 7803bd5c06923e10c08cc7f22d8b5b1af7ec1d55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:43:07 +0530 Subject: [PATCH 382/824] Bump eslint from 8.26.0 to 8.27.0 (#963) Bumps [eslint](https://github.com/eslint/eslint) from 8.26.0 to 8.27.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.26.0...v8.27.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c88c6b8..0cb08517 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.2.2", - "eslint": "8.26.0", + "eslint": "8.27.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -4898,9 +4898,9 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", @@ -15493,9 +15493,9 @@ "dev": true }, "eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.3", diff --git a/package.json b/package.json index 93c7b515..ccc17b61 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.1", "css-minimizer-webpack-plugin": "4.2.2", - "eslint": "8.26.0", + "eslint": "8.27.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From 71fdba3c4ac421864c890b8746ebdaa82cac6bbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:43:50 +0530 Subject: [PATCH 383/824] Bump sass from 1.55.0 to 1.56.0 (#964) Bumps [sass](https://github.com/sass/dart-sass) from 1.55.0 to 1.56.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.55.0...1.56.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cb08517..18e6effa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.55.0", + "sass": "1.56.0", "sass-loader": "13.1.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", @@ -10134,9 +10134,9 @@ } }, "node_modules/sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.0.tgz", + "integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19399,9 +19399,9 @@ } }, "sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.0.tgz", + "integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index ccc17b61..84af5d6b 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.55.0", + "sass": "1.56.0", "sass-loader": "13.1.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", From 856e616247f8a84f978afa761a0f490c9ef22685 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:45:02 +0530 Subject: [PATCH 384/824] Bump @babel/core from 7.19.6 to 7.20.2 (#965) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.6 to 7.20.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.20.2/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 154 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 78 insertions(+), 78 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18e6effa..1d5c8b17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.6", + "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", @@ -114,21 +114,21 @@ } }, "node_modules/@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -144,12 +144,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz", + "integrity": "sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -339,19 +339,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -413,12 +413,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -491,14 +491,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1764,19 +1764,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", + "@babel/generator": "^7.20.1", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -11804,21 +11804,21 @@ "dev": true }, "@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -11827,12 +11827,12 @@ } }, "@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz", + "integrity": "sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==", "dev": true, "requires": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -11973,19 +11973,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" } }, "@babel/helper-optimise-call-expression": { @@ -12029,12 +12029,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -12086,14 +12086,14 @@ } }, "@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", "dev": true, "requires": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" } }, "@babel/highlight": { @@ -12108,9 +12108,9 @@ } }, "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12946,19 +12946,19 @@ } }, "@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", + "@babel/generator": "^7.20.1", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", "debug": "^4.1.0", "globals": "^11.1.0" } diff --git a/package.json b/package.json index 84af5d6b..a3426177 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.19.6", + "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", From 62e0821be24a711405d314337b4045fce648a799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:19:22 +0530 Subject: [PATCH 385/824] Bump matrix-js-sdk from 20.1.0 to 21.0.1 (#959) * Bump matrix-js-sdk from 20.1.0 to 21.0.0 Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 20.1.0 to 21.0.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v20.1.0...v21.0.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump matrix-js-sdk from 20.1.0 to 21.0.1 Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 20.1.0 to 21.0.1. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v20.1.0...v21.0.1) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Fix upload content * Change min supported node Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 677 ++---------------- package.json | 5 +- .../molecules/image-pack/ImagePackUpload.jsx | 4 +- .../molecules/image-upload/ImageUpload.jsx | 2 +- src/client/state/RoomsInput.js | 2 +- 5 files changed, 45 insertions(+), 645 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d5c8b17..be484f5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "20.1.0", + "matrix-js-sdk": "21.0.1", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -75,8 +75,7 @@ "webpack-merge": "5.8.0" }, "engines": { - "node": ">=14.15.0", - "npm": ">=6.14.8" + "node": ">=16.0.0" } }, "node_modules/@ampproject/remapping": { @@ -2681,6 +2680,7 @@ "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", @@ -2897,14 +2897,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -2935,25 +2927,12 @@ "util": "^0.12.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/autosize": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", @@ -2971,19 +2950,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "node_modules/axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -3116,14 +3082,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3270,14 +3228,6 @@ "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, - "node_modules/browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==", - "engines": [ - "node" - ] - }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -3499,11 +3449,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3671,17 +3616,6 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", @@ -3924,7 +3858,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/create-ecdh": { "version": "4.0.4", @@ -4353,17 +4288,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dateformat": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", @@ -4492,14 +4416,6 @@ "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": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4680,15 +4596,6 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5527,19 +5434,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5576,7 +5470,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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5817,27 +5712,6 @@ "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/formik": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", @@ -6035,14 +5909,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6126,27 +5992,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6533,20 +6378,6 @@ } } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7079,11 +6910,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -7135,11 +6961,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/jest-util": { "version": "29.2.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", @@ -7288,11 +7109,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7311,15 +7127,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7327,11 +7139,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -7355,20 +7162,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -7824,24 +7617,22 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "node_modules/matrix-js-sdk": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.1.0.tgz", - "integrity": "sha512-AjuWVmerJ8aEAIgD6QfmSIg0RrvA8vzvOV+ycvSGg4DgiFlVZbFvBxkVZTRdZ5icJe1/XMaCEf5OZ9Ha2hXUUg==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.0.1.tgz", + "integrity": "sha512-xrJibvMwj38fMeNX7e9kfEzR9xv5UNwWkYGlyQE+ag81HGLacbJvEix/2zkEQ40TypB9ENVioVFIyVYGN9Rv2Q==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", - "browser-request": "^0.3.3", "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", "matrix-events-sdk": "^0.0.1-beta.7", "p-retry": "4", "qs": "^6.9.6", - "request": "^2.88.2", "unhomoglyph": "^1.0.6" }, "engines": { - "node": ">=12.9.0" + "node": ">=16.0.0" } }, "node_modules/md5.js": { @@ -7960,6 +7751,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -7968,6 +7760,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -8182,14 +7975,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8620,11 +8405,6 @@ "node": ">=0.12" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -9313,11 +9093,6 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -9342,6 +9117,7 @@ "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" } @@ -9833,45 +9609,6 @@ "entities": "^2.0.0" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -10001,6 +9738,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -10033,7 +9771,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/sanitize-html": { "version": "2.7.3", @@ -10589,30 +10328,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -10985,18 +10700,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -11031,22 +10734,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/twemoji": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", @@ -11237,6 +10924,7 @@ "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" } @@ -11291,15 +10979,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -11309,19 +10988,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -13744,6 +13410,7 @@ "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", @@ -13901,14 +13568,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -13941,22 +13600,12 @@ "util": "^0.12.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "autosize": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", @@ -13968,16 +13617,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -14079,14 +13718,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -14224,11 +13855,6 @@ "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, - "browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==" - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -14403,11 +14029,6 @@ "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -14541,14 +14162,6 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "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==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", @@ -14750,7 +14363,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "create-ecdh": { "version": "4.0.4", @@ -15059,14 +14673,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, "dateformat": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", @@ -15164,11 +14770,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -15319,15 +14920,6 @@ } } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -15979,16 +15571,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -16021,7 +15603,8 @@ "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -16213,21 +15796,6 @@ "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "formik": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", @@ -16377,14 +15945,6 @@ "get-intrinsic": "^1.1.1" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -16450,20 +16010,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -16759,16 +16305,6 @@ "micromatch": "^4.0.2" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -17116,11 +16652,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -17163,11 +16694,6 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "jest-util": { "version": "29.2.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", @@ -17281,11 +16807,6 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -17298,15 +16819,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -17314,11 +16831,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -17334,17 +16846,6 @@ "universalify": "^0.1.2" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -17740,20 +17241,18 @@ "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" }, "matrix-js-sdk": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-20.1.0.tgz", - "integrity": "sha512-AjuWVmerJ8aEAIgD6QfmSIg0RrvA8vzvOV+ycvSGg4DgiFlVZbFvBxkVZTRdZ5icJe1/XMaCEf5OZ9Ha2hXUUg==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.0.1.tgz", + "integrity": "sha512-xrJibvMwj38fMeNX7e9kfEzR9xv5UNwWkYGlyQE+ag81HGLacbJvEix/2zkEQ40TypB9ENVioVFIyVYGN9Rv2Q==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", - "browser-request": "^0.3.3", "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", "matrix-events-sdk": "^0.0.1-beta.7", "p-retry": "4", "qs": "^6.9.6", - "request": "^2.88.2", "unhomoglyph": "^1.0.6" } }, @@ -17850,12 +17349,14 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "requires": { "mime-db": "1.52.0" } @@ -18009,11 +17510,6 @@ "boolbase": "^1.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -18343,11 +17839,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -18799,11 +18290,6 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -18829,7 +18315,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.11.0", @@ -19189,40 +18676,6 @@ } } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - } - } - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -19311,7 +18764,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safe-regex-test": { "version": "1.0.0", @@ -19327,7 +18781,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sanitize-html": { "version": "2.7.3", @@ -19759,22 +19214,6 @@ "wbuf": "^1.7.3" } }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -20045,15 +19484,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -20087,19 +19517,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "twemoji": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", @@ -20228,6 +19645,7 @@ "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" } @@ -20281,27 +19699,12 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index a3426177..79f0b3e0 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,7 @@ "description": "Yet another matrix client", "main": "index.js", "engines": { - "npm": ">=6.14.8", - "node": ">=14.15.0" + "node": ">=16.0.0" }, "scripts": { "start": "webpack serve --config ./webpack.dev.js --open", @@ -32,7 +31,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "20.1.0", + "matrix-js-sdk": "21.0.1", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", diff --git a/src/app/molecules/image-pack/ImagePackUpload.jsx b/src/app/molecules/image-pack/ImagePackUpload.jsx index 0b7c23b7..6295de1c 100644 --- a/src/app/molecules/image-pack/ImagePackUpload.jsx +++ b/src/app/molecules/image-pack/ImagePackUpload.jsx @@ -27,9 +27,7 @@ function ImagePackUpload({ onUpload }) { setProgress(true); const image = await scaleDownImage(imgFile, 512, 512); - const url = await mx.uploadContent(image, { - onlyContentUri: true, - }); + const { content_uri: url } = await mx.uploadContent(image); onUpload(shortcode, url); setProgress(false); diff --git a/src/app/molecules/image-upload/ImageUpload.jsx b/src/app/molecules/image-upload/ImageUpload.jsx index 137d23bf..34d0d4be 100644 --- a/src/app/molecules/image-upload/ImageUpload.jsx +++ b/src/app/molecules/image-upload/ImageUpload.jsx @@ -22,7 +22,7 @@ function ImageUpload({ const file = e.target.files.item(0); if (file === null) return; try { - const uPromise = initMatrix.matrixClient.uploadContent(file, { onlyContentUri: false }); + const uPromise = initMatrix.matrixClient.uploadContent(file); setUploadPromise(uPromise); const res = await uPromise; diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index fb4b6c31..d1e0aedb 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -395,7 +395,7 @@ class RoomsInput extends EventEmitter { input.attachment.uploadingPromise = uploadingPromise; this.roomIdToInput.set(roomId, input); - const url = await uploadingPromise; + const { content_uri: url } = await uploadingPromise; delete input.attachment.uploadingPromise; this.roomIdToInput.set(roomId, input); From 1302682900d4a43e73a8bb0080c9eddf75ed0c04 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:20:17 +0530 Subject: [PATCH 386/824] Update server list in config.json (#947) * remove kde.org from config because they have disabled registrations, which is required to be listed on login.register page. * remove halogen.city seems dead hs now * add converser.eu seems to be working again * Update config.json * halogen.city is back --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index 2aa67ddc..c919882f 100644 --- a/config.json +++ b/config.json @@ -1,9 +1,9 @@ { "defaultHomeserver": 3, "homeserverList": [ + "converser.eu", "envs.net", "halogen.city", - "kde.org", "matrix.org", "mozilla.org" ], From 4fe4c8bb0360825e9df650e22e6d7da9a3ebd6c3 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:21:51 +0530 Subject: [PATCH 387/824] Use Node Hydrogen LTS (#960) * Use node hydrogen lts in dockerfile * Use node v18.12.0 * Use node v18.12.0 * Use node v18.12.0 * use lts syntax * Update Nodejs LTS to v18.12.1 * Update Dockerfile * Update Dockerfile * Update readme --- .github/workflows/build-pull-request.yml | 4 ++-- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- Dockerfile | 2 +- README.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index b6379a53..5bbf2446 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -16,7 +16,7 @@ jobs: - name: Setup node uses: actions/setup-node@v3.5.1 with: - node-version: 17.9.0 + node-version: 18.12.1 cache: 'npm' - name: Install dependencies run: npm ci @@ -35,4 +35,4 @@ jobs: with: name: pr path: ./pr.txt - retention-days: 1 \ No newline at end of file + retention-days: 1 diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 9a4ac6e0..edb79d86 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -15,7 +15,7 @@ jobs: - name: Setup node uses: actions/setup-node@v3.5.1 with: - node-version: 17.9.0 + node-version: 18.12.1 cache: 'npm' - name: Install dependencies run: npm ci diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index ed981c3c..686b812a 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -14,7 +14,7 @@ jobs: - name: Setup node uses: actions/setup-node@v3.5.1 with: - node-version: 17.9.0 + node-version: 18.12.1 cache: 'npm' - name: Install dependencies run: npm ci diff --git a/Dockerfile b/Dockerfile index 7ad952b1..dd3a7efa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:17.9.0-alpine3.15 as builder +FROM node:18.12.0-alpine3.15 as builder WORKDIR /src diff --git a/README.md b/README.md index d6675bd1..acf76629 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ UeGsouhyuITLwEhScounZDqop+Dx ## Local development > We recommend using a version manager as versions change very quickly. You will likely need to switch -between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Also recommended nodejs version is 16.15.0 LTS. +between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Also recommended nodejs version Hydrogen LTS (v18). Execute the following commands to start a development server: ```sh From 1531535151990189e62810ded48e758fdf19894a Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:16:14 +0530 Subject: [PATCH 388/824] Replace deprecated 'set-output' with '$GITHUB_OUTPUT' (#968) --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 8cd46714..4381aecc 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -20,7 +20,7 @@ jobs: name: pr - name: Output pr number id: pr - run: echo "::set-output name=id::$(> $GITHUB_OUTPUT - name: Download artifact uses: dawidd6/action-download-artifact@46b4ae883bf0726f5949d025d31cb62c7a5ac70c with: From f144c1cdbdc43c03620bcde44ae48d08e34017f8 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 9 Nov 2022 19:36:27 +0530 Subject: [PATCH 389/824] Update Dockerfile (#970) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index dd3a7efa..2b606ac2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:18.12.0-alpine3.15 as builder +FROM node:18.12.1-alpine3.15 as builder WORKDIR /src From 55d609c82bf75fc55b6a74d499458f5ac1afd021 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:28:46 +0530 Subject: [PATCH 390/824] Lock file maintenance (#969) * Lock file maintenance * Fix ajv module not found Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- package-lock.json | 1351 ++++++++++++++++++++++++--------------------- package.json | 1 + 2 files changed, 732 insertions(+), 620 deletions(-) diff --git a/package-lock.json b/package-lock.json index be484f5d..4aa54bae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", + "ajv": "8.11.0", "assert": "2.0.0", "babel-loader": "9.1.0", "browserify-fs": "1.0.0", @@ -143,9 +144,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz", - "integrity": "sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", "dev": true, "dependencies": { "@babel/types": "^7.20.2", @@ -214,9 +215,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -224,7 +225,7 @@ "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -424,12 +425,12 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -1714,24 +1715,24 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz", - "integrity": "sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", + "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", "dev": true, "dependencies": { "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" }, "engines": { "node": ">=6.9.0" @@ -1829,6 +1830,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -1844,6 +1861,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/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/@fontsource/inter": { "version": "4.5.14", "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", @@ -1855,14 +1878,14 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -1900,9 +1923,9 @@ } }, "node_modules/@jest/types": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", - "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "dev": true, "dependencies": { "@jest/schemas": "^29.0.0", @@ -2205,9 +2228,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2327,9 +2350,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, "node_modules/@types/prop-types": { @@ -2350,9 +2373,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2647,9 +2670,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2677,14 +2700,14 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -2709,35 +2732,16 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/another-json": { @@ -2817,15 +2821,15 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -2857,14 +2861,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2875,14 +2879,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2951,9 +2955,9 @@ } }, "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", + "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", "dev": true, "engines": { "node": ">=4" @@ -3416,9 +3420,9 @@ } }, "node_modules/camel-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/caniuse-api": { @@ -3434,9 +3438,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001422", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", - "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", "dev": true, "funding": [ { @@ -3832,9 +3836,9 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.25.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", - "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "dev": true, "dependencies": { "browserslist": "^4.21.4" @@ -3845,9 +3849,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.25.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz", - "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", "dev": true, "hasInstallScript": true, "funding": { @@ -3856,9 +3860,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "node_modules/create-ecdh": { @@ -4045,45 +4049,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/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/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", - "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.2.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/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/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -4190,12 +4155,12 @@ } }, "node_modules/cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.12", + "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -4211,25 +4176,25 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -4237,11 +4202,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -4591,9 +4556,9 @@ } }, "node_modules/dot-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/ee-first": { @@ -5144,6 +5109,22 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/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/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5229,14 +5210,11 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/eslint/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/eslint/node_modules/supports-color": { "version": "7.2.0", @@ -5251,9 +5229,9 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -5975,6 +5953,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -6789,7 +6779,7 @@ "node": ">=6" } }, - "node_modules/is-path-inside": { + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", @@ -6801,6 +6791,15 @@ "node": ">=6" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -6892,15 +6891,15 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { @@ -6962,12 +6961,12 @@ } }, "node_modules/jest-util": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", - "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", "dev": true, "dependencies": { - "@jest/types": "^29.2.1", + "@jest/types": "^29.3.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7049,17 +7048,18 @@ } }, "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.3.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/has-flag": { @@ -7128,9 +7128,9 @@ "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { @@ -7541,9 +7541,9 @@ "dev": true }, "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "engines": { "node": ">= 0.6.0" }, @@ -7573,9 +7573,9 @@ } }, "node_modules/lower-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/lru-cache": { @@ -7612,9 +7612,9 @@ } }, "node_modules/matrix-events-sdk": { - "version": "0.0.1-beta.7", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz", - "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", + "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { "version": "21.0.1", @@ -7662,9 +7662,9 @@ } }, "node_modules/memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.10.tgz", + "integrity": "sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -7891,9 +7891,9 @@ } }, "node_modules/no-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/node-fetch": { @@ -8035,28 +8035,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -8066,27 +8066,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -8257,9 +8257,9 @@ } }, "node_modules/param-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/parent-module": { @@ -8324,9 +8324,9 @@ } }, "node_modules/pascal-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/path-browserify": { @@ -8571,12 +8571,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -8635,13 +8635,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -8651,12 +8651,12 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -8701,12 +8701,12 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -8879,12 +8879,12 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -8942,12 +8942,12 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -9955,40 +9955,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -10262,15 +10228,6 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10370,18 +10327,18 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -10389,28 +10346,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10491,12 +10448,12 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -10621,6 +10578,60 @@ } } }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -10639,6 +10650,21 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/terser-webpack-plugin/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/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -10979,6 +11005,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -11241,6 +11276,31 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/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/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11263,6 +11323,12 @@ "node": ">=4.0" } }, + "node_modules/webpack/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/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -11345,17 +11411,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -11386,9 +11452,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -11493,9 +11559,9 @@ } }, "@babel/generator": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz", - "integrity": "sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", "dev": true, "requires": { "@babel/types": "^7.20.2", @@ -11548,9 +11614,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -11558,7 +11624,7 @@ "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -11704,12 +11770,12 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { @@ -12568,11 +12634,11 @@ } }, "@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" }, "dependencies": { "regenerator-runtime": { @@ -12583,13 +12649,13 @@ } }, "@babel/runtime-corejs3": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz", - "integrity": "sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", + "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", "dev": true, "requires": { "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" }, "dependencies": { "regenerator-runtime": { @@ -12663,6 +12729,18 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "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" + } + }, "globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -12671,6 +12749,12 @@ "requires": { "type-fest": "^0.20.2" } + }, + "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 } } }, @@ -12685,14 +12769,14 @@ "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" }, "@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -12717,9 +12801,9 @@ } }, "@jest/types": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", - "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "dev": true, "requires": { "@jest/schemas": "^29.0.0", @@ -12966,9 +13050,9 @@ } }, "@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "requires": { "@types/estree": "*", @@ -13088,9 +13172,9 @@ "dev": true }, "@types/node": { - "version": "18.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, "@types/prop-types": { @@ -13111,9 +13195,9 @@ "dev": true }, "@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -13389,9 +13473,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-import-assertions": { @@ -13407,14 +13491,14 @@ "dev": true }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -13425,33 +13509,16 @@ "dev": true, "requires": { "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } } }, "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } }, "another-json": { "version": "0.2.0", @@ -13512,15 +13579,15 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -13540,26 +13607,26 @@ "dev": true }, "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, @@ -13618,9 +13685,9 @@ "dev": true }, "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", + "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", "dev": true }, "axobject-query": { @@ -14004,9 +14071,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -14024,9 +14091,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001422", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", - "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", "dev": true }, "chalk": { @@ -14346,24 +14413,24 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.25.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.5.tgz", - "integrity": "sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "dev": true, "requires": { "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.25.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz", - "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", "dev": true }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "create-ecdh": { @@ -14494,35 +14561,6 @@ "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "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 - }, - "jest-worker": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", - "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.2.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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" - } - } } }, "css-select": { @@ -14600,36 +14638,36 @@ "dev": true }, "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.12", + "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "dev": true, "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -14637,11 +14675,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -14913,9 +14951,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -15131,6 +15169,18 @@ "text-table": "^0.2.0" }, "dependencies": { + "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-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -15186,10 +15236,10 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "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 }, "supports-color": { @@ -15419,9 +15469,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -15993,6 +16043,15 @@ "slash": "^4.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -16574,16 +16633,24 @@ "dev": true, "requires": { "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } } }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-obj": { "version": "3.0.0", @@ -16640,15 +16707,15 @@ } }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, @@ -16695,12 +16762,12 @@ "dev": true }, "jest-util": { - "version": "29.2.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", - "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", "dev": true, "requires": { - "@jest/types": "^29.2.1", + "@jest/types": "^29.3.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16760,12 +16827,13 @@ } }, "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.3.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16820,9 +16888,9 @@ "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -17182,9 +17250,9 @@ "dev": true }, "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==" }, "loose-envify": { "version": "1.4.0", @@ -17204,9 +17272,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -17236,9 +17304,9 @@ } }, "matrix-events-sdk": { - "version": "0.0.1-beta.7", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz", - "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", + "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "matrix-js-sdk": { "version": "21.0.1", @@ -17280,9 +17348,9 @@ "dev": true }, "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.10.tgz", + "integrity": "sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ==", "dev": true, "requires": { "fs-monkey": "^1.0.3" @@ -17453,9 +17521,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -17549,46 +17617,46 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obuf": { @@ -17711,9 +17779,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -17771,9 +17839,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -17952,12 +18020,12 @@ } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -17986,22 +18054,22 @@ "dev": true }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -18028,12 +18096,12 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -18134,12 +18202,12 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -18173,12 +18241,12 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -18893,35 +18961,6 @@ "ajv": "^8.8.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } } }, "select-hose": { @@ -19156,14 +19195,6 @@ "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } } }, "source-map": { @@ -19252,41 +19283,41 @@ "dev": true }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -19339,12 +19370,12 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -19425,6 +19456,47 @@ "terser": "^5.14.1" }, "dependencies": { + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "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 + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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 + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -19435,6 +19507,15 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "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" + } } } }, @@ -19699,6 +19780,12 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -19769,6 +19856,24 @@ "webpack-sources": "^3.2.3" }, "dependencies": { + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -19785,6 +19890,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "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 + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -19952,17 +20063,17 @@ } }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "is-typed-array": "^1.1.10" } }, "wildcard": { @@ -19984,9 +20095,9 @@ "dev": true }, "ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true }, "xtend": { diff --git a/package.json b/package.json index 79f0b3e0..23e08cf5 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", + "ajv": "8.11.0", "assert": "2.0.0", "babel-loader": "9.1.0", "browserify-fs": "1.0.0", From 543acc9fffd5381d358ed6bd2867dd9d2854815a Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:43:35 +0530 Subject: [PATCH 391/824] Revert babel-loader v9 and uninstall ajv (#979) --- package-lock.json | 174 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 3 +- 2 files changed, 160 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4aa54bae..3a75adef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,9 +44,8 @@ "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", - "ajv": "8.11.0", "assert": "2.0.0", - "babel-loader": "9.1.0", + "babel-loader": "8.2.5", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", @@ -2970,20 +2969,71 @@ "dev": true }, "node_modules/babel-loader": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", - "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 8.9" }, "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/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/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/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/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/babel-plugin-polyfill-corejs2": { @@ -3086,6 +3136,15 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4612,6 +4671,15 @@ "emojibase": "*" } }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -7491,6 +7559,20 @@ "node": ">=6.11.5" } }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -13697,13 +13779,52 @@ "dev": true }, "babel-loader": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", - "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "requires": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "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 + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } } }, "babel-plugin-polyfill-corejs2": { @@ -13785,6 +13906,12 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -15004,6 +15131,12 @@ "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", "integrity": "sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ==" }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -17206,6 +17339,17 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", diff --git a/package.json b/package.json index 23e08cf5..eb2f515c 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,8 @@ "@babel/core": "7.20.2", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", - "ajv": "8.11.0", "assert": "2.0.0", - "babel-loader": "9.1.0", + "babel-loader": "8.2.5", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", From c280c1339b71e2665afa620e2f15c60c53ce1e0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:44:49 +0530 Subject: [PATCH 392/824] Bump sass-loader from 13.1.0 to 13.2.0 (#976) Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 13.1.0 to 13.2.0. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v13.1.0...v13.2.0) --- updated-dependencies: - dependency-name: sass-loader dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a75adef..fb102b60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.56.0", - "sass-loader": "13.1.0", + "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", @@ -9972,9 +9972,9 @@ } }, "node_modules/sass-loader": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", - "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", "dev": true, "dependencies": { "klona": "^2.0.4", @@ -9989,7 +9989,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -19077,9 +19077,9 @@ } }, "sass-loader": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", - "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", "dev": true, "requires": { "klona": "^2.0.4", diff --git a/package.json b/package.json index eb2f515c..c087c3c0 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", "sass": "1.56.0", - "sass-loader": "13.1.0", + "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", "url": "0.11.0", From b8f3cf1b478dd0c48b8cccf8a478a9b9035e33ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:45:26 +0530 Subject: [PATCH 393/824] Bump dawidd6/action-download-artifact from 2.24.0 to 2.24.2 (#972) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 2.24.0 to 2.24.2. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/46b4ae883bf0726f5949d025d31cb62c7a5ac70c...e6e25ac3a2b93187502a8be1ef9e9603afc34925) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 4381aecc..54d18148 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -13,7 +13,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download pr number - uses: dawidd6/action-download-artifact@46b4ae883bf0726f5949d025d31cb62c7a5ac70c + uses: dawidd6/action-download-artifact@e6e25ac3a2b93187502a8be1ef9e9603afc34925 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} @@ -22,7 +22,7 @@ jobs: id: pr run: echo "id=$(> $GITHUB_OUTPUT - name: Download artifact - uses: dawidd6/action-download-artifact@46b4ae883bf0726f5949d025d31cb62c7a5ac70c + uses: dawidd6/action-download-artifact@e6e25ac3a2b93187502a8be1ef9e9603afc34925 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} From 062beb718d7a6f25186d0fe0ef45704a821ea7c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:47:06 +0530 Subject: [PATCH 394/824] Bump css-loader from 6.7.1 to 6.7.2 (#973) Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 6.7.1 to 6.7.2. - [Release notes](https://github.com/webpack-contrib/css-loader/releases) - [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-loader/compare/v6.7.1...v6.7.2) --- updated-dependencies: - dependency-name: css-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb102b60..4553df7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "clean-webpack-plugin": "4.0.0", "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", - "css-loader": "6.7.1", + "css-loader": "6.7.2", "css-minimizer-webpack-plugin": "4.2.2", "eslint": "8.27.0", "eslint-config-airbnb": "19.0.4", @@ -4024,19 +4024,19 @@ } }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", + "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.18", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "engines": { "node": ">= 12.13.0" @@ -14650,19 +14650,19 @@ "dev": true }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", + "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.18", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "dependencies": { "semver": { diff --git a/package.json b/package.json index c087c3c0..ed500a81 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "clean-webpack-plugin": "4.0.0", "copy-webpack-plugin": "11.0.0", "crypto-browserify": "3.12.0", - "css-loader": "6.7.1", + "css-loader": "6.7.2", "css-minimizer-webpack-plugin": "4.2.2", "eslint": "8.27.0", "eslint-config-airbnb": "19.0.4", From 7db04440ff7694df78a2e6598dcc901bfea2e615 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:48:32 +0530 Subject: [PATCH 395/824] Bump matrix-js-sdk from 21.0.1 to 21.1.0 (#975) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 21.0.1 to 21.1.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v21.0.1...v21.1.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4553df7a..b76d4f86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.0.1", + "matrix-js-sdk": "21.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7699,9 +7699,9 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.0.1.tgz", - "integrity": "sha512-xrJibvMwj38fMeNX7e9kfEzR9xv5UNwWkYGlyQE+ag81HGLacbJvEix/2zkEQ40TypB9ENVioVFIyVYGN9Rv2Q==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.1.0.tgz", + "integrity": "sha512-4HTEZKt/LlX4045H5JVACBMirPboRWM7E/OabaRCcBoEssgWrPw/z7am6FXH2ZRDw0xp50WhPjCNOGZqdf81Mg==", "dependencies": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", @@ -17453,9 +17453,9 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "matrix-js-sdk": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.0.1.tgz", - "integrity": "sha512-xrJibvMwj38fMeNX7e9kfEzR9xv5UNwWkYGlyQE+ag81HGLacbJvEix/2zkEQ40TypB9ENVioVFIyVYGN9Rv2Q==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.1.0.tgz", + "integrity": "sha512-4HTEZKt/LlX4045H5JVACBMirPboRWM7E/OabaRCcBoEssgWrPw/z7am6FXH2ZRDw0xp50WhPjCNOGZqdf81Mg==", "requires": { "@babel/runtime": "^7.12.5", "another-json": "^0.2.0", diff --git a/package.json b/package.json index ed500a81..b86ec3b2 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.0.1", + "matrix-js-sdk": "21.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 7eb2f7817419246894ea1a18b2b653f46e4fa19a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:50:15 +0530 Subject: [PATCH 396/824] Bump webpack from 5.74.0 to 5.75.0 (#978) Bumps [webpack](https://github.com/webpack/webpack) from 5.74.0 to 5.75.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.74.0...v5.75.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b76d4f86..67c2308a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "style-loader": "3.3.1", "url": "0.11.0", "util": "0.12.5", - "webpack": "5.74.0", + "webpack": "5.75.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" @@ -11141,9 +11141,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -19969,9 +19969,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index b86ec3b2..9939af5d 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "style-loader": "3.3.1", "url": "0.11.0", "util": "0.12.5", - "webpack": "5.74.0", + "webpack": "5.75.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" From ea3d7b8892195708c337e43c63efb9cd26746509 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:50:38 +0530 Subject: [PATCH 397/824] Bump sass from 1.56.0 to 1.56.1 (#974) Bumps [sass](https://github.com/sass/dart-sass) from 1.56.0 to 1.56.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.56.0...1.56.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 67c2308a..9a1ac650 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.56.0", + "sass": "1.56.1", "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", @@ -9955,9 +9955,9 @@ } }, "node_modules/sass": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.0.tgz", - "integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19066,9 +19066,9 @@ } }, "sass": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.0.tgz", - "integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 9939af5d..5e329aff 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", "path-browserify": "1.0.1", - "sass": "1.56.0", + "sass": "1.56.1", "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", From 2bab3119b0d17972e12e85fe4e4cb68d2045fba4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 21:56:19 +0530 Subject: [PATCH 398/824] Update dependency babel-loader to v8.3.0 (#980) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a1ac650..c1ffe1a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "8.2.5", + "babel-loader": "8.3.0", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", @@ -2969,9 +2969,9 @@ "dev": true }, "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", @@ -13779,9 +13779,9 @@ "dev": true }, "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", diff --git a/package.json b/package.json index 5e329aff..d84df58d 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", - "babel-loader": "8.2.5", + "babel-loader": "8.3.0", "browserify-fs": "1.0.0", "buffer": "6.0.3", "clean-webpack-plugin": "4.0.0", From d22abe300b35e459eccdc6ef23e56c3737e9d2de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 22:01:14 +0530 Subject: [PATCH 399/824] Lock file maintenance (#981) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 9217 ++------------------------------------------- 1 file changed, 335 insertions(+), 8882 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1ffe1a3..830ab272 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "cinny", "version": "2.2.2", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -1829,22 +1829,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -1860,12 +1844,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/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/@fontsource/inter": { "version": "4.5.14", "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", @@ -2699,14 +2677,14 @@ } }, "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { @@ -2731,16 +2709,35 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { - "ajv": "^8.8.2" + "ajv": "^6.9.1" } }, "node_modules/another-json": { @@ -2954,9 +2951,9 @@ } }, "node_modules/axe-core": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", - "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", + "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", "dev": true, "engines": { "node": ">=4" @@ -2987,55 +2984,6 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/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/babel-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/babel-loader/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/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -3575,10 +3523,13 @@ } }, "node_modules/ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", - "dev": true + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/cipher-base": { "version": "1.0.4", @@ -3887,6 +3838,59 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -3895,9 +3899,9 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", - "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", + "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", "dev": true, "dependencies": { "browserslist": "^4.21.4" @@ -3908,9 +3912,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", - "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -4108,6 +4112,59 @@ } } }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -5177,22 +5234,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/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/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5278,12 +5319,6 @@ "node": ">=8" } }, - "node_modules/eslint/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/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7196,9 +7231,9 @@ "dev": true }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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": { @@ -7744,9 +7779,9 @@ } }, "node_modules/memfs": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.10.tgz", - "integrity": "sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.11.tgz", + "integrity": "sha512-GvsCITGAyDCxxsJ+X6prJexFQEhOCJaIlUbsAvjzSI5o5O7j2dle3jWvz5Z5aOdpOxW6ol3vI1+0ut+641F1+w==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -7878,6 +7913,59 @@ "webpack": "^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8599,9 +8687,9 @@ } }, "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", "funding": [ { "type": "opencollective", @@ -9555,9 +9643,9 @@ } }, "node_modules/regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "dev": true, "dependencies": { "regenerate": "^1.4.2", @@ -9565,7 +9653,7 @@ "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" @@ -10019,18 +10107,17 @@ } }, "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -10660,31 +10747,6 @@ } } }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10708,12 +10770,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -10968,9 +11024,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" @@ -11266,6 +11322,59 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack-dev-server": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", @@ -11321,6 +11430,40 @@ } } }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11336,6 +11479,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", @@ -11358,31 +11520,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11405,12 +11542,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/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/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -11590,8683 +11721,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", - "dev": true - }, - "@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", - "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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-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-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@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-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", - "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", - "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "requires": { - "regenerator-runtime": "^0.13.10" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - } - } - }, - "@babel/runtime-corejs3": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", - "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", - "dev": true, - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.10" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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 - } - } - }, - "@fontsource/inter": { - "version": "4.5.14", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", - "integrity": "sha512-JDC9AocdPLuGsASkvWw9hS5gtHE7K9dOwL98XLrk5yjYqxy4uVnScG58NUvFMJDVJRl/7c8Wnap6PEs+7Zvj1Q==" - }, - "@fontsource/roboto": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", - "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" - }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@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 - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@khanacademy/simple-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.5.tgz", - "integrity": "sha512-xPLm0bBqdIMeNA/sjjD6T8YHT28vsyYVM8ewe6S2QkmVELHpj4XdLayVN6PHjBMoSfJXunfs17Nq32GR+j+PZQ==", - "requires": { - "@types/react": ">=16.0.0" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@matrix-org/olm": { - "version": "3.2.13", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.13.tgz", - "integrity": "sha1-AQn96TvMYd74UfeYJsk4TAc7UXU=" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" - }, - "@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" - }, - "@react-dnd/invariant": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", - "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" - }, - "@react-dnd/shallowequal": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", - "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" - }, - "@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "@tippyjs/react": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", - "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", - "requires": { - "tippy.js": "^6.3.1" - } - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "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.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/react": { - "version": "18.0.25", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", - "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", - "dev": true, - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true - } - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "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 - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "another-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "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": "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" - } - }, - "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" - } - }, - "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 - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dev": true, - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "autosize": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", - "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "axe-core": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", - "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "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" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "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 - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "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 - }, - "base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, - "blurhash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", - "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "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" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "browser-encrypt-attachment": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", - "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", - "dev": true, - "requires": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "requires": { - "base-x": "^4.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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 - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", - "dev": true - }, - "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" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "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" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clean-css": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", - "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, - "requires": { - "del": "^4.1.1" - } - }, - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - } - } - }, - "computed-style": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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 - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - } - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "core-js-compat": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", - "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "core-js-pure": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", - "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, - "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" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true - }, - "css-loader": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", - "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.18", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "dev": true, - "requires": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "dependencies": { - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dateformat": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", - "integrity": "sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", - "dev": true, - "requires": { - "abstract-leveldown": "~0.12.1" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } - } - } - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "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" - } - }, - "dnd-core": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", - "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", - "requires": { - "@react-dnd/asap": "4.0.1", - "@react-dnd/invariant": "3.0.1", - "redux": "^4.1.2" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "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" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "emojibase-data": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", - "integrity": "sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", - "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "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-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" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - } - }, - "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "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" - } - }, - "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" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "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" - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "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==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "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" - } - } - } - }, - "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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "requires": { - "fbjs": "^3.0.0" - } - }, - "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "requires": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "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" - } - }, - "file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" - }, - "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" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.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" - }, - "dependencies": { - "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" - } - } - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", - "requires": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "dev": true - }, - "formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", - "requires": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "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==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", - "dev": true, - "requires": { - "readable-stream": "~1.0.26-4" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "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-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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 - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "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 - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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 - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-dom-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.1.2.tgz", - "integrity": "sha512-mLTtl3pVn3HnqZSZzW3xVs/mJAKrG1yIw3wlp+9bdoZHHLaBRvELdpfShiPVLyjPypq1Fugv2KMDoGHW4lVXnw==", - "requires": { - "domhandler": "5.0.3", - "htmlparser2": "8.0.1" - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", - "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", - "dev": true, - "requires": { - "html-minifier-terser": "^7.0.0", - "parse5": "^7.0.0" - } - }, - "html-minifier-terser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", - "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "5.2.0", - "commander": "^9.4.0", - "entities": "^4.3.1", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.14.2" - } - }, - "html-react-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.4.tgz", - "integrity": "sha512-va68PSmC7uA6PbOEc9yuw5Mu3OHPXmFKUpkLGvUPdTuNrZ0CJZk1s/8X/FaHjswK/6uZghu2U02tJjussT8+uw==", - "requires": { - "domhandler": "5.0.3", - "html-dom-parser": "3.1.2", - "react-property": "2.0.0", - "style-to-js": "1.1.1" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "dependencies": { - "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - } - } - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "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" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "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-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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 - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "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-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "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-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "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==" - }, - "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" - } - }, - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", - "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^0.1.2" - } - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "katex": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", - "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", - "requires": { - "commander": "^8.0.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - } - } - }, - "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 - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", - "dev": true, - "requires": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, - "level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", - "dev": true, - "requires": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - } - }, - "level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", - "dev": true - }, - "level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", - "dev": true, - "requires": { - "string-range": "~1.2" - } - }, - "level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", - "dev": true, - "requires": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - }, - "dependencies": { - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", - "dev": true, - "requires": { - "level-fix-range": "~1.0.2" - } - }, - "level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", - "dev": true, - "requires": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - }, - "dependencies": { - "level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", - "dev": true, - "requires": { - "clone": "~0.1.9" - } - }, - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "dev": true, - "requires": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", - "dev": true, - "requires": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - } - } - } - }, - "levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", - "dev": true, - "requires": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - }, - "dependencies": { - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "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" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "line-height": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", - "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", - "requires": { - "computed-style": "~0.1.3" - } - }, - "linkify-html": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.2.tgz", - "integrity": "sha512-YcN3tsyutK2Y/uSuoG0zne8FQdoqzrAgNU5ko0DWE7M2oQ3ms4z/202f2W4TvRm9uxKdrsWAullfynANLaVMqw==" - }, - "linkifyjs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", - "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "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 - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "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" - } - }, - "matrix-events-sdk": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", - "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" - }, - "matrix-js-sdk": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.1.0.tgz", - "integrity": "sha512-4HTEZKt/LlX4045H5JVACBMirPboRWM7E/OabaRCcBoEssgWrPw/z7am6FXH2ZRDw0xp50WhPjCNOGZqdf81Mg==", - "requires": { - "@babel/runtime": "^7.12.5", - "another-json": "^0.2.0", - "bs58": "^5.0.0", - "content-type": "^1.0.4", - "loglevel": "^1.7.1", - "matrix-events-sdk": "^0.0.1-beta.7", - "p-retry": "4", - "qs": "^6.9.6", - "unhomoglyph": "^1.0.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.10.tgz", - "integrity": "sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "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 - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.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 - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "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 - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "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" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "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" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.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": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "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 - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "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-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-srcset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" - }, - "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "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 - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "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" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "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 - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-async-script": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz", - "integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==", - "requires": { - "hoist-non-react-statics": "^3.3.0", - "prop-types": "^15.5.0" - } - }, - "react-autosize-textarea": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz", - "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==", - "requires": { - "autosize": "^4.0.2", - "line-height": "^0.3.1", - "prop-types": "^15.5.6" - } - }, - "react-blurhash": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/react-blurhash/-/react-blurhash-0.2.0.tgz", - "integrity": "sha512-MfhPLfFTNCX3MCJ8nM5t+T5qAixBUv8QHVcHORs5iVaqdpg+IW/e4lpOphc0bm6AvKz//4MuHESIeKKoxi3wnA==" - }, - "react-dnd": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", - "integrity": "sha512-EaSbMD9iFJDY/o48T3c8wn3uWU+2uxfFojhesZN3LhigJoAIvH2iOjxofSA9KbqhAKP6V9P853G6XG8JngKVtA==", - "requires": { - "@react-dnd/invariant": "3.0.1", - "@react-dnd/shallowequal": "3.0.1", - "dnd-core": "15.1.2", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - } - }, - "react-dnd-html5-backend": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", - "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", - "requires": { - "dnd-core": "15.1.2" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" - }, - "react-google-recaptcha": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-2.1.0.tgz", - "integrity": "sha512-K9jr7e0CWFigi8KxC3WPvNqZZ47df2RrMAta6KmRoE4RUi7Ys6NmNjytpXpg4HI/svmQJLKR+PncEPaNJ98DqQ==", - "requires": { - "prop-types": "^15.5.0", - "react-async-script": "^1.1.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-modal": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", - "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", - "requires": { - "exenv": "^1.2.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - } - }, - "react-property": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", - "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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 - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "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": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sanitize-html": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz", - "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==", - "requires": { - "deepmerge": "^4.2.2", - "escape-string-regexp": "^4.0.0", - "htmlparser2": "^6.0.0", - "is-plain-object": "^5.0.0", - "parse-srcset": "^1.0.2", - "postcss": "^8.3.11" - }, - "dependencies": { - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "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==" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "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 - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "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" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", - "dev": true - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "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-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 - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true - }, - "style-to-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz", - "integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==", - "requires": { - "style-to-object": "0.3.0" - } - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "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" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "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 - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "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" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "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 - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "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" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "requires": { - "@popperjs/core": "^2.9.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "twemoji": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", - "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==", - "requires": { - "fs-extra": "^8.0.1", - "jsonfile": "^5.0.0", - "twemoji-parser": "14.0.0", - "universalify": "^0.1.2" - } - }, - "twemoji-parser": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz", - "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==" - }, - "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-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 - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unhomoglyph": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", - "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "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==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "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" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - } - } - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "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" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "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" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "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" - } - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.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" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "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 - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true - }, - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From c4e973e83b39b1453ba2a4e0323ad92609641f30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:45:27 +0530 Subject: [PATCH 400/824] Bump mini-css-extract-plugin from 2.6.1 to 2.7.1 (#1003) Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 2.6.1 to 2.7.1. - [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases) - [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.6.1...v2.7.1) --- updated-dependencies: - dependency-name: mini-css-extract-plugin dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 830ab272..c658a927 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.6.1", + "mini-css-extract-plugin": "2.7.1", "path-browserify": "1.0.1", "sass": "1.56.1", "sass-loader": "13.2.0", @@ -7895,9 +7895,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.1.tgz", + "integrity": "sha512-viOoaUFy+Z2w43VsGPbtfwFrr0tKwDctK9dUofG5MBViYhD1noGFUzzDIVw0KPwCGUP+c7zqLxm+acuQs7zLzw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" diff --git a/package.json b/package.json index d84df58d..364253c5 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.6.1", + "mini-css-extract-plugin": "2.7.1", "path-browserify": "1.0.1", "sass": "1.56.1", "sass-loader": "13.2.0", From 347d23641bc1596558010fe2959e4ba3ecf2df6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:48:17 +0530 Subject: [PATCH 401/824] Bump softprops/action-gh-release from 0.1.14 to 0.1.15 (#1000) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 0.1.14 to 0.1.15. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/1e07f4398721186383de40550babbdf2b84acfc5...de2c0eb89ae2a093876385947365aca7b0e5f844) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 686b812a..f84a36c4 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -50,7 +50,7 @@ jobs: gpg --export | xxd -p echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release - uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz From 603e4787946ef589ce2d1d8cd1a887b8a026749c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:48:48 +0530 Subject: [PATCH 402/824] Bump eslint from 8.27.0 to 8.29.0 (#1001) Bumps [eslint](https://github.com/eslint/eslint) from 8.27.0 to 8.29.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.27.0...v8.29.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c658a927..22e06f33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.2", "css-minimizer-webpack-plugin": "4.2.2", - "eslint": "8.27.0", + "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", @@ -4895,9 +4895,9 @@ } }, "node_modules/eslint": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", - "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", diff --git a/package.json b/package.json index 364253c5..9677e1a2 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "crypto-browserify": "3.12.0", "css-loader": "6.7.2", "css-minimizer-webpack-plugin": "4.2.2", - "eslint": "8.27.0", + "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", From fbf899465d49b7e3a97434e06f438335cae8cea6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:50:03 +0530 Subject: [PATCH 403/824] Bump eslint-plugin-react from 7.31.10 to 7.31.11 (#996) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.10 to 7.31.11. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.10...v7.31.11) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 36 +++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22e06f33..099fd9a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.10", + "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", @@ -2892,6 +2892,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -5117,25 +5130,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.31.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", + "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" diff --git a/package.json b/package.json index 9677e1a2..b8cf1476 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "eslint-config-airbnb": "19.0.4", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-react": "7.31.10", + "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", From 63c065300641c2c81828b2eb8d0fa80a642a4baf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:52:45 +0530 Subject: [PATCH 404/824] Bump @khanacademy/simple-markdown from 0.8.5 to 0.8.6 (#992) Bumps [@khanacademy/simple-markdown](https://github.com/Khan/simple-markdown) from 0.8.5 to 0.8.6. - [Release notes](https://github.com/Khan/simple-markdown/releases) - [Commits](https://github.com/Khan/simple-markdown/commits) --- updated-dependencies: - dependency-name: "@khanacademy/simple-markdown" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 099fd9a4..5996ad42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.5", + "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", @@ -2058,9 +2058,9 @@ } }, "node_modules/@khanacademy/simple-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.5.tgz", - "integrity": "sha512-xPLm0bBqdIMeNA/sjjD6T8YHT28vsyYVM8ewe6S2QkmVELHpj4XdLayVN6PHjBMoSfJXunfs17Nq32GR+j+PZQ==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", + "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", "dependencies": { "@types/react": ">=16.0.0" }, diff --git a/package.json b/package.json index b8cf1476..de5e797e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "dependencies": { "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", - "@khanacademy/simple-markdown": "0.8.5", + "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.13", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", From c176ed8861c636c3b18b4a8c6b03324ebaa43c4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:54:02 +0530 Subject: [PATCH 405/824] Bump @babel/core from 7.20.2 to 7.20.5 (#997) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.2 to 7.20.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.20.5/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 60 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5996ad42..832a4e61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.20.2", + "@babel/core": "7.20.5", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", @@ -113,21 +113,21 @@ } }, "node_modules/@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", + "@babel/generator": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -143,12 +143,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.20.5", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -490,14 +490,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" @@ -518,9 +518,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1763,19 +1763,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.20.5", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1784,9 +1784,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", diff --git a/package.json b/package.json index de5e797e..d77141d5 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.20.2", + "@babel/core": "7.20.5", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", "assert": "2.0.0", From bc9ff2337249defd92f0967188fc827f2878309e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:58:14 +0530 Subject: [PATCH 406/824] Bump matrix-js-sdk from 21.1.0 to 21.2.0 (#993) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 21.1.0 to 21.2.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v21.1.0...v21.2.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 41 +++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 832a4e61..df8dbfaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.1.0", + "matrix-js-sdk": "21.2.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -2230,6 +2230,11 @@ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "node_modules/@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, "node_modules/@types/express": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", @@ -2369,6 +2374,11 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, + "node_modules/@types/sdp-transform": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/sdp-transform/-/sdp-transform-2.4.5.tgz", + "integrity": "sha512-GVO0gnmbyO3Oxm2HdPsYUNcyihZE3GyCY8ysMYHuQGfLhGZq89Nm4lSzULWTzZoyHtg+VO/IdrnxZHPnPSGnAg==" + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -5423,7 +5433,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -7748,24 +7757,36 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.1.0.tgz", - "integrity": "sha512-4HTEZKt/LlX4045H5JVACBMirPboRWM7E/OabaRCcBoEssgWrPw/z7am6FXH2ZRDw0xp50WhPjCNOGZqdf81Mg==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.2.0.tgz", + "integrity": "sha512-5aHWkWve+/5dmRJGIAzwe2hFNHX/2LBFWVqHh6YOTSViWlAbBxQsylBIhsNppgmHUN1YjBhvBlW206UnYCk6zg==", "dependencies": { "@babel/runtime": "^7.12.5", + "@types/sdp-transform": "^2.4.5", "another-json": "^0.2.0", "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", - "matrix-events-sdk": "^0.0.1-beta.7", + "matrix-events-sdk": "0.0.1", + "matrix-widget-api": "^1.0.0", "p-retry": "4", "qs": "^6.9.6", + "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6" }, "engines": { "node": ">=16.0.0" } }, + "node_modules/matrix-widget-api": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.1.1.tgz", + "integrity": "sha512-gNSgmgSwvOsOcWK9k2+tOhEMYBiIMwX95vMZu0JqY7apkM02xrOzUBuPRProzN8CnbIALH7e3GAhatF6QCNvtA==", + "dependencies": { + "@types/events": "^3.0.0", + "events": "^3.2.0" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10138,6 +10159,14 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/sdp-transform": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", + "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==", + "bin": { + "sdp-verify": "checker.js" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", diff --git a/package.json b/package.json index d77141d5..e2b398be 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "katex": "0.16.3", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.1.0", + "matrix-js-sdk": "21.2.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 97e7ba25a623f2b41c00edf40b2126ef57be4ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 14:26:33 +0530 Subject: [PATCH 407/824] Bump webpack-cli from 4.10.0 to 5.0.1 (#1002) Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.10.0 to 5.0.1. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.10.0...webpack-cli@5.0.1) --- updated-dependencies: - dependency-name: webpack-cli dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 93 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index df8dbfaa..ad94d93c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,7 @@ "url": "0.11.0", "util": "0.12.5", "webpack": "5.75.0", - "webpack-cli": "4.10.0", + "webpack-cli": "5.0.1", "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" }, @@ -2578,34 +2578,42 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -6654,12 +6662,12 @@ } }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/ipaddr.js": { @@ -9597,15 +9605,15 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/redux": { @@ -11287,44 +11295,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^9.4.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -11333,15 +11339,6 @@ } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", diff --git a/package.json b/package.json index e2b398be..6ee75a8c 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "url": "0.11.0", "util": "0.12.5", "webpack": "5.75.0", - "webpack-cli": "4.10.0", + "webpack-cli": "5.0.1", "webpack-dev-server": "4.11.1", "webpack-merge": "5.8.0" } From 52cbcb912831313407e77ac2e4a7e116f9e2ba9a Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 9 Dec 2022 13:05:02 +0530 Subject: [PATCH 408/824] Replace pull request action with one actively maintained (#1004) * Replace pull request action with one actively maintained * Add comment_tag to stop duplicate comments --- .github/workflows/deploy-pull-request.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 54d18148..bea205b8 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -42,12 +42,13 @@ jobs: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE3_ID }} timeout-minutes: 1 - - name: Edit PR Description - uses: Beakyn/gha-comment-pull-request@2167a7aee24f9e61ce76a23039f322e49a990409 + - name: Comment preview on PR + uses: thollander/actions-comment-pull-request@c22fb302208b7b170d252a61a505d2ea27245eff env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - pull-request-number: ${{ steps.pr.outputs.id }} - description-message: | + pr_number: ${{ steps.pr.outputs.id }} + comment_tag: ${{ steps.pr.outputs.id }} + message: | Preview: ${{ steps.netlify.outputs.deploy-url }} ⚠️ Exercise caution. Use test accounts. ⚠️ \ No newline at end of file From bf900e74681705b904d1ef42db820e0ea6d7bb85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:49:25 +0530 Subject: [PATCH 409/824] Bump sass from 1.56.1 to 1.56.2 (#1011) Bumps [sass](https://github.com/sass/dart-sass) from 1.56.1 to 1.56.2. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.56.1...1.56.2) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad94d93c..f7943d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.7.1", "path-browserify": "1.0.1", - "sass": "1.56.1", + "sass": "1.56.2", "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", @@ -10086,9 +10086,9 @@ } }, "node_modules/sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "version": "1.56.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", + "integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 6ee75a8c..bc64542f 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.7.1", "path-browserify": "1.0.1", - "sass": "1.56.1", + "sass": "1.56.2", "sass-loader": "13.2.0", "stream-browserify": "3.0.0", "style-loader": "3.3.1", From 3c66a6a1c140e44ae2dc2cd73c682606d08c087e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:50:52 +0530 Subject: [PATCH 410/824] Bump @matrix-org/olm from 3.2.13 to 3.2.14 (#1010) Bumps @matrix-org/olm from 3.2.13 to 3.2.14. --- updated-dependencies: - dependency-name: "@matrix-org/olm" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7943d3a..4d8dfffe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", - "@matrix-org/olm": "3.2.13", + "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", "blurhash": "2.0.4", @@ -2076,9 +2076,9 @@ "dev": true }, "node_modules/@matrix-org/olm": { - "version": "3.2.13", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.13.tgz", - "integrity": "sha1-AQn96TvMYd74UfeYJsk4TAc7UXU=" + "version": "3.2.14", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", + "integrity": "sha1-rNlsAKiB0PRi4fl6Vsc3QsjbyYQ=" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", diff --git a/package.json b/package.json index bc64542f..46be0210 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", - "@matrix-org/olm": "3.2.13", + "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", "babel-polyfill": "6.26.0", "blurhash": "2.0.4", From 7606c9d3256f6aa45536039c64090d322ccd7ad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:51:39 +0530 Subject: [PATCH 411/824] Bump katex from 0.16.3 to 0.16.4 (#1007) Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.16.3 to 0.16.4. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.16.3...v0.16.4) --- updated-dependencies: - dependency-name: katex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d8dfffe..1d318dee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "flux": "4.0.3", "formik": "2.2.9", "html-react-parser": "3.0.4", - "katex": "0.16.3", + "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "21.2.0", @@ -7310,9 +7310,9 @@ } }, "node_modules/katex": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.3.tgz", - "integrity": "sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA==", + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", + "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" diff --git a/package.json b/package.json index 46be0210..451439f8 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "flux": "4.0.3", "formik": "2.2.9", "html-react-parser": "3.0.4", - "katex": "0.16.3", + "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "21.2.0", From 868f2715888207bc9c7c85ee96a6f01744c7012c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:52:04 +0530 Subject: [PATCH 412/824] Bump nwtgck/actions-netlify from 1.2.4 to 2.0.0 (#1006) Bumps [nwtgck/actions-netlify](https://github.com/nwtgck/actions-netlify) from 1.2.4 to 2.0.0. - [Release notes](https://github.com/nwtgck/actions-netlify/releases) - [Changelog](https://github.com/nwtgck/actions-netlify/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nwtgck/actions-netlify/compare/ac1cb16858bada08a9c71a81240a85cfc3f72913...5da65c9f74c7961c5501a3ba329b8d0912f39c03) --- updated-dependencies: - dependency-name: nwtgck/actions-netlify dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index bea205b8..d29c9ace 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -30,7 +30,7 @@ jobs: path: dist - name: Deploy to Netlify id: netlify - uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 + uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 with: publish-dir: dist deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index edb79d86..e4778215 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -22,7 +22,7 @@ jobs: - name: Build app run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 + uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 with: publish-dir: dist deploy-message: "Dev deploy ${{ github.sha }}" diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index f84a36c4..8e7179b9 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -21,7 +21,7 @@ jobs: - name: Build app run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@ac1cb16858bada08a9c71a81240a85cfc3f72913 + uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 with: publish-dir: dist deploy-message: "Prod deploy ${{ github.ref_name }}" From d54d1d964d804bdb3512477e5869f3631c5fb710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:52:50 +0530 Subject: [PATCH 413/824] Bump mini-css-extract-plugin from 2.7.1 to 2.7.2 (#1008) Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 2.7.1 to 2.7.2. - [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases) - [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.7.1...v2.7.2) --- updated-dependencies: - dependency-name: mini-css-extract-plugin dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d318dee..4be2392d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.1", + "mini-css-extract-plugin": "2.7.2", "path-browserify": "1.0.1", "sass": "1.56.2", "sass-loader": "13.2.0", @@ -7938,9 +7938,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.1.tgz", - "integrity": "sha512-viOoaUFy+Z2w43VsGPbtfwFrr0tKwDctK9dUofG5MBViYhD1noGFUzzDIVw0KPwCGUP+c7zqLxm+acuQs7zLzw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" diff --git a/package.json b/package.json index 451439f8..24aa41b8 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-plugin-react-hooks": "4.6.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.1", + "mini-css-extract-plugin": "2.7.2", "path-browserify": "1.0.1", "sass": "1.56.2", "sass-loader": "13.2.0", From 5f9ea6c06a09c79c863505f8f0e26f7dbfbdc9a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:55:21 +0530 Subject: [PATCH 414/824] Bump matrix-js-sdk from 21.2.0 to 22.0.0 (#1009) Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 21.2.0 to 22.0.0. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v21.2.0...v22.0.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4be2392d..95f19151 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.2.0", + "matrix-js-sdk": "22.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -7765,9 +7765,9 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-21.2.0.tgz", - "integrity": "sha512-5aHWkWve+/5dmRJGIAzwe2hFNHX/2LBFWVqHh6YOTSViWlAbBxQsylBIhsNppgmHUN1YjBhvBlW206UnYCk6zg==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-22.0.0.tgz", + "integrity": "sha512-mpKqeD3nCobjGiUiATUyEoP44n+AzDW5cSeBTIBY5fPhj0AkzLJhblHt40vzSOJazj8tT0PhsSzhEIR9hGzYGA==", "dependencies": { "@babel/runtime": "^7.12.5", "@types/sdp-transform": "^2.4.5", diff --git a/package.json b/package.json index 24aa41b8..918174d5 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "21.2.0", + "matrix-js-sdk": "22.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 7b95546b80f0043d4f50d5d22743cbad89279975 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Dec 2022 17:56:00 +0530 Subject: [PATCH 415/824] Lock file maintenance (#1014) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 239 +++++++++++++++++++++++----------------------- 1 file changed, 122 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95f19151..0cc7914d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,9 +104,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", "dev": true, "engines": { "node": ">=6.9.0" @@ -214,9 +214,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", + "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -235,13 +235,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "regexpu-core": "^5.2.1" }, "engines": { "node": ">=6.9.0" @@ -475,15 +475,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" @@ -777,14 +777,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1065,9 +1065,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", - "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", + "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1309,13 +1309,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1356,9 +1356,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", - "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", + "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1451,13 +1451,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" @@ -1714,39 +1714,39 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", "dependencies": { - "regenerator-runtime": "^0.13.10" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", - "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", + "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", "dev": true, "dependencies": { "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.10" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { "version": "7.18.10", @@ -1830,9 +1830,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2332,9 +2332,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==", "dev": true }, "node_modules/@types/prop-types": { @@ -2355,9 +2355,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.25", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", - "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2417,9 +2417,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -2797,9 +2797,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -3476,9 +3476,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", "dev": true, "funding": [ { @@ -3554,9 +3554,9 @@ } }, "node_modules/ci-info": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", - "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true, "engines": { "node": ">=8" @@ -4778,9 +4778,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4826,9 +4826,9 @@ } }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -4837,6 +4837,7 @@ "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", @@ -4852,8 +4853,8 @@ "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" }, "engines": { @@ -5328,9 +5329,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5601,9 +5602,9 @@ } }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6319,18 +6320,18 @@ } }, "node_modules/html-minifier-terser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", - "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.1.0.tgz", + "integrity": "sha512-BvPO2S7Ip0Q5qt+Y8j/27Vclj6uHC6av0TMoDn7/bJPhMWHI2UtR2e/zEgJn3/qYAmxumrGp9q4UHurL6mtW9Q==", "dev": true, "dependencies": { "camel-case": "^4.1.2", "clean-css": "5.2.0", - "commander": "^9.4.0", - "entities": "^4.3.1", + "commander": "^9.4.1", + "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^5.14.2" + "terser": "^5.15.1" }, "bin": { "html-minifier-terser": "cli.js" @@ -6562,9 +6563,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true, "engines": { "node": ">= 4" @@ -7221,10 +7222,14 @@ } }, "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } }, "node_modules/js-tokens": { "version": "4.0.0", @@ -7357,12 +7362,12 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.6.tgz", + "integrity": "sha512-HNkaCgM8wZgE/BZACeotAAgpL9FUjEnhgF0FVQMIgH//zqTPreLYMb3rWYkYAqPoF75Jwuycp1da7uz66cfFQg==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" } }, "node_modules/level-blobs": { @@ -7822,9 +7827,9 @@ } }, "node_modules/memfs": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.11.tgz", - "integrity": "sha512-GvsCITGAyDCxxsJ+X6prJexFQEhOCJaIlUbsAvjzSI5o5O7j2dle3jWvz5Z5aOdpOxW6ol3vI1+0ut+641F1+w==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -8506,9 +8511,9 @@ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "dependencies": { "entities": "^4.4.0" @@ -9186,9 +9191,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9648,9 +9653,9 @@ "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" }, "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -10747,9 +10752,9 @@ } }, "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", From cb88a6fd9cecff8bc326ffadce7194bb0a0ce2fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 09:19:20 +0530 Subject: [PATCH 416/824] Bump actions/checkout from 3.1.0 to 3.2.0 (#1017) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 5bbf2446..65ca34eb 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: Setup node uses: actions/setup-node@v3.5.1 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 18617996..47dbfe32 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: Build Docker image uses: docker/build-push-action@v3.2.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index 60178668..b417df10 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index e4778215..c0028c37 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: Setup node uses: actions/setup-node@v3.5.1 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 8e7179b9..0d33d128 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: Setup node uses: actions/setup-node@v3.5.1 with: @@ -64,7 +64,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.2.0 - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx From f7b48333df7a8b6461ed85ee361d313845170c93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 08:40:14 +0530 Subject: [PATCH 417/824] Bump sanitize-html from 2.7.3 to 2.8.0 (#1018) Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.7.3 to 2.8.0. - [Release notes](https://github.com/apostrophecms/sanitize-html/releases) - [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md) - [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.7.3...2.8.0) --- updated-dependencies: - dependency-name: sanitize-html dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 76 ++++------------------------------------------- package.json | 2 +- 2 files changed, 6 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cc7914d..c73fd481 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", - "sanitize-html": "2.7.3", + "sanitize-html": "2.8.0", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, @@ -9993,13 +9993,13 @@ "dev": true }, "node_modules/sanitize-html": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz", - "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz", + "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", - "htmlparser2": "^6.0.0", + "htmlparser2": "^8.0.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" @@ -10013,54 +10013,6 @@ "node": ">=0.10.0" } }, - "node_modules/sanitize-html/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -10072,24 +10024,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sanitize-html/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/sass": { "version": "1.56.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", diff --git a/package.json b/package.json index 918174d5..3ff04ccc 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "react-dom": "17.0.2", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", - "sanitize-html": "2.7.3", + "sanitize-html": "2.8.0", "tippy.js": "6.3.7", "twemoji": "14.0.2" }, From eeac5c6c45f960779f91695c5cacd8682b1b9002 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 08:45:11 +0530 Subject: [PATCH 418/824] Update nginx Docker tag to v1.23.3 (#1019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2b606ac2..968ca1d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN npm run build ## App -FROM nginx:1.23.2-alpine +FROM nginx:1.23.3-alpine COPY --from=builder /src/dist /app From e93511fde7922958e5c8e324d0bbb76fa144b747 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 08:51:14 +0530 Subject: [PATCH 419/824] Lock file maintenance (#1020) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index c73fd481..39b592c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1830,9 +1830,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2236,13 +2236,13 @@ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, "node_modules/@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", "dev": true, "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" } @@ -2332,9 +2332,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", - "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==", + "version": "18.11.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", "dev": true }, "node_modules/@types/prop-types": { @@ -2982,9 +2982,9 @@ } }, "node_modules/axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", + "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==", "dev": true, "engines": { "node": ">=4" @@ -5329,9 +5329,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6070,9 +6070,9 @@ } }, "node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -6649,12 +6649,12 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -8143,9 +8143,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", + "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", "dev": true }, "node_modules/normalize-path": { @@ -8735,9 +8735,9 @@ } }, "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", "funding": [ { "type": "opencollective", From 63cb56481896e65358e96f4c8d8e103ae7e83283 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:47:10 +0530 Subject: [PATCH 420/824] chore: update netlify site id secrets --- .github/workflows/build-pull-request.yml | 6 +++--- .github/workflows/deploy-pull-request.yml | 6 ++++-- .github/workflows/netlify-dev.yml | 8 ++++---- .github/workflows/prod-deploy.yml | 8 ++++---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 65ca34eb..5eac02eb 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -1,4 +1,4 @@ -name: 'Build pull request' +name: Build pull request on: pull_request: @@ -6,7 +6,7 @@ on: jobs: build-pull-request: - name: 'Build pull request' + name: Build pull request runs-on: ubuntu-latest env: PR_NUMBER: ${{github.event.number}} @@ -17,7 +17,7 @@ jobs: uses: actions/setup-node@v3.5.1 with: node-version: 18.12.1 - cache: 'npm' + cache: "npm" - name: Install dependencies run: npm ci - name: Build app diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index d29c9ace..ab54f8df 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -1,11 +1,13 @@ name: Deploy PR to Netlify + on: workflow_run: workflows: ["Build pull request"] types: [completed] + jobs: deploy-pull-request: - name: 'Deploy pull request' + name: Deploy pull request runs-on: ubuntu-latest permissions: contents: read @@ -40,7 +42,7 @@ jobs: enable-commit-comment: false env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE3_ID }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_PR_CINNY }} timeout-minutes: 1 - name: Comment preview on PR uses: thollander/actions-comment-pull-request@c22fb302208b7b170d252a61a505d2ea27245eff diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index c0028c37..6f26247b 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -1,4 +1,4 @@ -name: 'Deploy to Netlify (dev)' +name: Deploy to Netlify (dev) on: push: @@ -7,7 +7,7 @@ on: jobs: deploy-to-netlify: - name: 'Deploy to Netlify' + name: Deploy to Netlify runs-on: ubuntu-latest steps: - name: Checkout repository @@ -16,7 +16,7 @@ jobs: uses: actions/setup-node@v3.5.1 with: node-version: 18.12.1 - cache: 'npm' + cache: "npm" - name: Install dependencies run: npm ci - name: Build app @@ -33,5 +33,5 @@ jobs: github-deployment-description: 'Nightly deployment on each commit to dev branch' env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE2_ID }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_DEV }} timeout-minutes: 1 diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 0d33d128..fa09008a 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -1,4 +1,4 @@ -name: 'Production deploy' +name: Production deploy on: release: @@ -6,7 +6,7 @@ on: jobs: deploy-and-tarball: - name: 'Netlify deploy and tarball' + name: Netlify deploy and tarball runs-on: ubuntu-latest steps: - name: Checkout repository @@ -15,7 +15,7 @@ jobs: uses: actions/setup-node@v3.5.1 with: node-version: 18.12.1 - cache: 'npm' + cache: "npm" - name: Install dependencies run: npm ci - name: Build app @@ -32,7 +32,7 @@ jobs: github-deployment-description: 'Stable deployment on each release' env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_APP }} timeout-minutes: 1 - name: Get version from tag id: vars From 899a89cb3ba4d9749e0b4264bf22aece34554794 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 20 Dec 2022 20:47:51 +0530 Subject: [PATCH 421/824] Replace Webpack to Vite (#1023) * Add vite, typescript and prettier * Configure vite * Fix tsconfig error * Fix manifest json * Move manifest json to root * Bug fix * Move back manifest json to public --- .eslintignore | 3 - .eslintrc.js | 35 +- .prettierignore | 6 + .prettierrc.json | 4 + .vscode/extensions.json | 3 + .vscode/settings.json | 5 + index.html | 101 + package-lock.json | 8266 ++++---------------------------------- package.json | 46 +- public/index.html | 50 - public/manifest.json | 20 +- src/client/initMatrix.js | 5 +- src/index.jsx | 5 +- tsconfig.json | 14 + vite.config.js | 44 + webpack.common.js | 66 - webpack.dev.js | 27 - webpack.prod.js | 39 - 18 files changed, 1111 insertions(+), 7628 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 index.html delete mode 100644 public/index.html create mode 100644 tsconfig.json create mode 100644 vite.config.js delete mode 100644 webpack.common.js delete mode 100644 webpack.dev.js delete mode 100644 webpack.prod.js diff --git a/.eslintignore b/.eslintignore index 8ace574b..4a5ac437 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,5 +1,2 @@ -webpack.common.js -webpack.dev.js -webpack.prod.js experiment node_modules \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 3dd60b58..e8f9224e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,25 +4,56 @@ module.exports = { es2021: true, }, extends: [ - 'plugin:react/recommended', + "eslint:recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", 'airbnb', + 'prettier', ], + parser: "@typescript-eslint/parser", parserOptions: { ecmaFeatures: { jsx: true, }, - ecmaVersion: 12, + ecmaVersion: 'latest', sourceType: 'module', }, plugins: [ 'react', + '@typescript-eslint' ], rules: { 'linebreak-style': 0, 'no-underscore-dangle': 0, + + "import/prefer-default-export": "off", + "import/extensions": "off", + "import/no-unresolved": "off", + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + 'react/no-unstable-nested-components': [ 'error', { allowAsProps: true }, ], + "react/jsx-filename-extension": [ + "error", + { + extensions: [".tsx", ".jsx"], + }, + ], + + "react/require-default-props": "off", + "react/jsx-props-no-spreading": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "error", + + "@typescript-eslint/no-unused-vars": "error", }, }; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..bc876b6c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +dist +node_modules +package.json +package-lock.json +LICENSE +README.md \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..5ac85e27 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "printWidth": 100, + "singleQuote": true +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..1d7ac851 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..8272ea1e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/index.html b/index.html new file mode 100644 index 00000000..af1a6268 --- /dev/null +++ b/index.html @@ -0,0 +1,101 @@ + + + + + + + Cinny + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + diff --git a/package-lock.json b/package-lock.json index 39b592c0..b60abb5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", - "babel-polyfill": "6.26.0", "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", @@ -41,38 +40,24 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.20.5", - "@babel/preset-env": "7.20.2", - "@babel/preset-react": "7.18.6", - "assert": "2.0.0", - "babel-loader": "8.3.0", - "browserify-fs": "1.0.0", - "buffer": "6.0.3", - "clean-webpack-plugin": "4.0.0", - "copy-webpack-plugin": "11.0.0", - "crypto-browserify": "3.12.0", - "css-loader": "6.7.2", - "css-minimizer-webpack-plugin": "4.2.2", + "@rollup/plugin-wasm": "6.1.1", + "@types/react": "18.0.26", + "@types/react-dom": "18.0.9", + "@typescript-eslint/eslint-plugin": "5.46.1", + "@typescript-eslint/parser": "5.46.1", + "@vitejs/plugin-react": "3.0.0", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", + "eslint-config-prettier": "8.5.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", - "html-loader": "4.2.0", - "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.2", - "path-browserify": "1.0.1", + "prettier": "2.8.1", "sass": "1.56.2", - "sass-loader": "13.2.0", - "stream-browserify": "3.0.0", - "style-loader": "3.3.1", - "url": "0.11.0", - "util": "0.12.5", - "webpack": "5.75.0", - "webpack-cli": "5.0.1", - "webpack-dev-server": "4.11.1", - "webpack-merge": "5.8.0" + "typescript": "4.9.4", + "vite": "4.0.1", + "vite-plugin-static-copy": "0.13.0" }, "engines": { "node": ">=16.0.0" @@ -170,31 +155,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", @@ -213,60 +173,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", - "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -276,18 +182,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", @@ -313,18 +207,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", @@ -356,18 +238,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", @@ -377,40 +247,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", @@ -423,18 +259,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -474,21 +298,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.20.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", @@ -529,10 +338,10 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" @@ -540,343 +349,14 @@ "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", - "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.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-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-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "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-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" @@ -888,831 +368,6 @@ "@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-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.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-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "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-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-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.20.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", @@ -1797,13 +452,356 @@ "node": ">=6.9.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@esbuild/android-arm": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.9.tgz", + "integrity": "sha512-kW5ccqWHVOOTGUkkJbtfoImtqu3kA1PFkivM+9QPFSHphPfPBlBalX9eDRqPK+wHCqKhU48/78T791qPgC9e9A==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.9.tgz", + "integrity": "sha512-ndIAZJUeLx4O+4AJbFQCurQW4VRUXjDsUvt1L+nP8bVELOWdmdCEOtlIweCUE6P+hU0uxYbEK2AEP0n5IVQvhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.9.tgz", + "integrity": "sha512-UbMcJB4EHrAVOnknQklREPgclNU2CPet2h+sCBCXmF2mfoYWopBn/CfTfeyOkb/JglOcdEADqAljFndMKnFtOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.9.tgz", + "integrity": "sha512-d7D7/nrt4CxPul98lx4PXhyNZwTYtbdaHhOSdXlZuu5zZIznjqtMqLac8Bv+IuT6SVHiHUwrkL6ywD7mOgLW+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.9.tgz", + "integrity": "sha512-LZc+Wlz06AkJYtwWsBM3x2rSqTG8lntDuftsUNQ3fCx9ZttYtvlDcVtgb+NQ6t9s6K5No5zutN3pcjZEC2a4iQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.9.tgz", + "integrity": "sha512-gIj0UQZlQo93CHYouHKkpzP7AuruSaMIm1etcWIxccFEVqCN1xDr6BWlN9bM+ol/f0W9w3hx3HDuEwcJVtGneQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.9.tgz", + "integrity": "sha512-GNors4vaMJ7lzGOuhzNc7jvgsQZqErGA8rsW+nck8N1nYu86CvsJW2seigVrQQWOV4QzEP8Zf3gm+QCjA2hnBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.9.tgz", + "integrity": "sha512-cNx1EF99c2t1Ztn0lk9N+MuwBijGF8mH6nx9GFsB3e0lpUpPkCE/yt5d+7NP9EwJf5uzqdjutgVYoH1SNqzudA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.9.tgz", + "integrity": "sha512-YPxQunReYp8RQ1FvexFrOEqqf+nLbS3bKVZF5FRT2uKM7Wio7BeATqAwO02AyrdSEntt3I5fhFsujUChIa8CZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.9.tgz", + "integrity": "sha512-zb12ixDIKNwFpIqR00J88FFitVwOEwO78EiUi8wi8FXlmSc3GtUuKV/BSO+730Kglt0B47+ZrJN1BhhOxZaVrw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.9.tgz", + "integrity": "sha512-X8te4NLxtHiNT6H+4Pfm5RklzItA1Qy4nfyttihGGX+Koc53Ar20ViC+myY70QJ8PDEOehinXZj/F7QK3A+MKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.9.tgz", + "integrity": "sha512-ZqyMDLt02c5smoS3enlF54ndK5zK4IpClLTxF0hHfzHJlfm4y8IAkIF8LUW0W7zxcKy7oAwI7BRDqeVvC120SA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.9.tgz", + "integrity": "sha512-k+ca5W5LDBEF3lfDwMV6YNXwm4wEpw9krMnNvvlNz3MrKSD2Eb2c861O0MaKrZkG/buTQAP4vkavbLwgIe6xjg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.9.tgz", + "integrity": "sha512-GuInVdogjmg9DhgkEmNipHkC+3tzkanPJzgzTC2ihsvrruLyFoR1YrTGixblNSMPudQLpiqkcwGwwe0oqfrvfA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.9.tgz", + "integrity": "sha512-49wQ0aYkvwXonGsxc7LuuLNICMX8XtO92Iqmug5Qau0kpnV6SP34jk+jIeu4suHwAbSbRhVFtDv75yRmyfQcHw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.9.tgz", + "integrity": "sha512-Nx4oKEAJ6EcQlt4dK7qJyuZUoXZG7CAeY22R7rqZijFzwFfMOD+gLP56uV7RrV86jGf8PeRY8TBsRmOcZoG42w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.9.tgz", + "integrity": "sha512-d0WnpgJ+FTiMZXEQ1NOv9+0gvEhttbgKEvVqWWAtl1u9AvlspKXbodKHzQ5MLP6YV1y52Xp+p8FMYqj8ykTahg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.9.tgz", + "integrity": "sha512-jccK11278dvEscHFfMk5EIPjF4wv1qGD0vps7mBV1a6TspdR36O28fgPem/SA/0pcsCPHjww5ouCLwP+JNAFlw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.9.tgz", + "integrity": "sha512-OetwTSsv6mIDLqN7I7I2oX9MmHGwG+AP+wKIHvq+6sIHwcPPJqRx+DJB55jy9JG13CWcdcQno/7V5MTJ5a0xfQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.9.tgz", + "integrity": "sha512-tKSSSK6unhxbGbHg+Cc+JhRzemkcsX0tPBvG0m5qsWbkShDK9c+/LSb13L18LWVdOQZwuA55Vbakxmt6OjBDOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.9.tgz", + "integrity": "sha512-ZTQ5vhNS5gli0KK8I6/s6+LwXmNEfq1ftjnSVyyNm33dBw8zDpstqhGXYUbZSWWLvkqiRRjgxgmoncmi6Yy7Ng==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.9.tgz", + "integrity": "sha512-C4ZX+YFIp6+lPrru3tpH6Gaapy8IBRHw/e7l63fzGDhn/EaiGpQgbIlT5paByyy+oMvRFQoxxyvC4LE0AjJMqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/@eslint/eslintrc": { @@ -1887,105 +885,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/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/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -2017,30 +916,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -2069,12 +944,6 @@ "react-dom": "16.14.0" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, "node_modules/@matrix-org/olm": { "version": "3.2.14", "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", @@ -2139,11 +1008,22 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true + "node_modules/@rollup/plugin-wasm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz", + "integrity": "sha512-dccyb8OvtpY21KiYjaNmibWlQJd/kBg+IVP24x9l1dsIRXBmGqLt+wsPjU296FNO8ap0SSEsTpi/7AfrlvQvBQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, "node_modules/@tippyjs/react": { "version": "4.2.6", @@ -2157,156 +1037,11 @@ "react-dom": ">=16.8" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, "node_modules/@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, - "node_modules/@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "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.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -2319,41 +1054,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, "node_modules/@types/react": { "version": "18.0.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", @@ -2364,6 +1069,15 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -2379,289 +1093,283 @@ "resolved": "https://registry.npmjs.org/@types/sdp-transform/-/sdp-transform-2.4.5.tgz", "integrity": "sha512-GVO0gnmbyO3Oxm2HdPsYUNcyihZE3GyCY8ysMYHuQGfLhGZq89Nm4lSzULWTzZoyHtg+VO/IdrnxZHPnPSGnAg==" }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", + "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", - "dev": true, + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/type-utils": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=14.15.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "webpack-dev-server": { + "typescript": { "optional": true } } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { - "xtend": "~3.0.0" - } - }, - "node_modules/abstract-leveldown/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.6" + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", + "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "debug": "^4.3.4" + }, + "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.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", + "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.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/type-utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", + "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "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": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", + "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "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.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", + "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "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/typescript-estree/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", + "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "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/utils/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/@typescript-eslint/utils/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/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", + "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz", + "integrity": "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0" } }, "node_modules/acorn": { @@ -2676,15 +1384,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2710,71 +1409,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/another-json": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2828,12 +1467,6 @@ "node": ">=6.0" } }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", @@ -2854,24 +1487,12 @@ } }, "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "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": ">=0.10.0" + "node": ">=8" } }, "node_modules/array.prototype.flat": { @@ -2928,36 +1549,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dev": true, - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -2969,18 +1560,6 @@ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axe-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", @@ -2996,88 +1575,6 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3089,41 +1586,6 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3133,110 +1595,11 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.26" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/blurhash": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3259,92 +1622,11 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, "node_modules/browser-encrypt-attachment": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", - "dev": true, - "dependencies": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, "node_modules/browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", @@ -3381,51 +1663,6 @@ "base-x": "^4.0.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -3447,34 +1684,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camel-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001439", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", @@ -3544,96 +1753,6 @@ "node": ">= 6" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-css": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", - "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, - "dependencies": { - "del": "^4.1.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.0 <6.0.0" - } - }, - "node_modules/clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3649,84 +1768,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/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/computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", @@ -3738,84 +1779,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/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/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3830,118 +1799,6 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-js-pure": { "version": "3.26.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", @@ -3953,55 +1810,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -4024,371 +1832,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", - "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.18", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "dev": true, - "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/css-select/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -4439,36 +1882,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~0.12.1" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -4485,101 +1898,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4602,24 +1920,6 @@ "redux": "^4.1.2" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4632,15 +1932,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -4692,55 +1983,12 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4759,37 +2007,6 @@ "emojibase": "*" } }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -4801,30 +2018,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/es-abstract": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", @@ -4864,12 +2057,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -4896,11 +2083,42 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true + "node_modules/esbuild": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.9.tgz", + "integrity": "sha512-gkH83yHyijMSZcZFs1IWew342eMdFuWXmQo3zkDPTre25LIPBJsXryg02M3u8OpTwCJdBkdaQwqKkDLnAsAeLQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.9", + "@esbuild/android-arm64": "0.16.9", + "@esbuild/android-x64": "0.16.9", + "@esbuild/darwin-arm64": "0.16.9", + "@esbuild/darwin-x64": "0.16.9", + "@esbuild/freebsd-arm64": "0.16.9", + "@esbuild/freebsd-x64": "0.16.9", + "@esbuild/linux-arm": "0.16.9", + "@esbuild/linux-arm64": "0.16.9", + "@esbuild/linux-ia32": "0.16.9", + "@esbuild/linux-loong64": "0.16.9", + "@esbuild/linux-mips64el": "0.16.9", + "@esbuild/linux-ppc64": "0.16.9", + "@esbuild/linux-riscv64": "0.16.9", + "@esbuild/linux-s390x": "0.16.9", + "@esbuild/linux-x64": "0.16.9", + "@esbuild/netbsd-x64": "0.16.9", + "@esbuild/openbsd-x64": "0.16.9", + "@esbuild/sunos-x64": "0.16.9", + "@esbuild/win32-arm64": "0.16.9", + "@esbuild/win32-ia32": "0.16.9", + "@esbuild/win32-x64": "0.16.9" + } }, "node_modules/escalade": { "version": "3.1.1", @@ -4911,12 +2129,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -5022,6 +2234,18 @@ "eslint-plugin-import": "^2.25.2" } }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", @@ -5423,21 +2647,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5446,107 +2655,11 @@ "node": ">=0.8.x" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "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/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5592,15 +2705,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, "node_modules/fastq": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", @@ -5610,18 +2714,6 @@ "reusify": "^1.0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/fbemitter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", @@ -5678,56 +2770,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5790,41 +2832,6 @@ "react": "^15.0.2 || ^16.0.0 || ^17.0.0" } }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "dev": true - }, "node_modules/formik": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", @@ -5848,24 +2855,6 @@ "react": ">=16.8.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -5887,12 +2876,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5945,33 +2928,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.26-4" - } - }, - "node_modules/fwd-stream/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/fwd-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5994,18 +2950,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -6054,12 +2998,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6070,19 +3008,20 @@ } }, "node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { + "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", + "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", - "slash": "^4.0.0" + "slash": "^3.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6111,12 +3050,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6184,50 +3117,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6236,54 +3125,6 @@ "react-is": "^16.7.0" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/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/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-dom-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.1.2.tgz", @@ -6293,53 +3134,6 @@ "htmlparser2": "8.0.1" } }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", - "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", - "dev": true, - "dependencies": { - "html-minifier-terser": "^7.0.0", - "parse5": "^7.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/html-minifier-terser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.1.0.tgz", - "integrity": "sha512-BvPO2S7Ip0Q5qt+Y8j/27Vclj6uHC6av0TMoDn7/bJPhMWHI2UtR2e/zEgJn3/qYAmxumrGp9q4UHurL6mtW9Q==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "5.2.0", - "commander": "^9.4.1", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, "node_modules/html-react-parser": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.4.tgz", @@ -6354,71 +3148,6 @@ "react": "0.14 || 15 || 16 || 17 || 18" } }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -6437,131 +3166,6 @@ "entities": "^4.3.0" } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "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/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", - "dev": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/ignore": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", @@ -6593,25 +3197,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6621,12 +3206,6 @@ "node": ">=0.8.19" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6662,49 +3241,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -6784,21 +3320,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6808,21 +3329,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6835,22 +3341,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -6887,45 +3377,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", - "dev": true - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -6935,18 +3386,6 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -6983,18 +3422,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -7025,25 +3452,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -7056,171 +3464,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", - "dev": true - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/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/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/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/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/js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", @@ -7260,12 +3509,6 @@ "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", @@ -7337,24 +3580,6 @@ "node": ">= 12" } }, - "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/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -7370,211 +3595,6 @@ "language-subtag-registry": "^0.3.20" } }, - "node_modules/level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", - "dev": true, - "dependencies": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - } - }, - "node_modules/level-blobs/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/level-blobs/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", - "dev": true, - "dependencies": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - } - }, - "node_modules/level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", - "dev": true - }, - "node_modules/level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", - "dev": true, - "dependencies": { - "string-range": "~1.2" - } - }, - "node_modules/level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - } - }, - "node_modules/level-js/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "node_modules/level-js/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", - "dev": true, - "dependencies": { - "level-fix-range": "~1.0.2" - } - }, - "node_modules/level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", - "dev": true, - "dependencies": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - } - }, - "node_modules/level-sublevel/node_modules/level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", - "dev": true, - "dependencies": { - "clone": "~0.1.9" - } - }, - "node_modules/level-sublevel/node_modules/object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "deprecated": "Please update to the latest object-keys", - "dev": true, - "dependencies": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "node_modules/level-sublevel/node_modules/xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", - "dev": true, - "dependencies": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", - "dev": true, - "dependencies": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - } - }, - "node_modules/levelup/node_modules/prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", - "dev": true - }, - "node_modules/levelup/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/levelup/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/levelup/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/levelup/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7588,15 +3608,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", @@ -7621,29 +3632,6 @@ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7669,30 +3657,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "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/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, "node_modules/loglevel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", @@ -7716,21 +3686,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7743,25 +3698,16 @@ "node": ">=10" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "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==", + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, "node_modules/matrix-events-sdk": { @@ -7800,56 +3746,6 @@ "events": "^3.2.0" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "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", @@ -7859,15 +3755,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -7881,151 +3768,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.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/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8053,19 +3795,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -8083,35 +3812,10 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "node_modules/node-fetch": { @@ -8133,15 +3837,6 @@ } } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-releases": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", @@ -8157,42 +3852,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8209,22 +3868,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -8313,39 +3956,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8355,38 +3965,6 @@ "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/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "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", @@ -8434,15 +4012,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -8455,31 +4024,6 @@ "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/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8492,67 +4036,11 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8571,12 +4059,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8592,12 +4074,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8607,22 +4083,6 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8640,100 +4100,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/postcss": { "version": "8.4.20", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", @@ -8757,489 +4123,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9249,22 +4132,21 @@ "node": ">= 0.8.0" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -9283,54 +4165,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -9354,16 +4188,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9384,58 +4208,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -9583,18 +4355,13 @@ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, "node_modules/readdirp": { @@ -9609,18 +4376,6 @@ "node": ">=8.10.0" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/redux": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", @@ -9629,38 +4384,6 @@ "@babel/runtime": "^7.9.2" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -9690,158 +4413,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -9859,27 +4430,6 @@ "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", @@ -9907,26 +4457,20 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/rollup": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.7.5.tgz", + "integrity": "sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/run-parallel": { @@ -9952,26 +4496,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -9986,12 +4510,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/sanitize-html": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz", @@ -10041,44 +4559,6 @@ "node": ">=12.0.0" } }, - "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -10088,24 +4568,6 @@ "object-assign": "^4.1.1" } }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/sdp-transform": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", @@ -10114,24 +4576,6 @@ "sdp-verify": "checker.js" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -10141,189 +4585,11 @@ "semver": "bin/semver.js" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10358,42 +4624,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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": ">=8" } }, "node_modules/source-map-js": { @@ -10404,87 +4641,6 @@ "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/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", - "dev": true - }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -10553,15 +4709,6 @@ "node": ">=4" } }, - "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-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10574,22 +4721,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "node_modules/style-to-js": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz", @@ -10606,22 +4737,6 @@ "inline-style-parser": "0.1.1" } }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10646,171 +4761,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/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/terser/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 - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -10845,15 +4801,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -10888,6 +4835,21 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "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/twemoji": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", @@ -10928,31 +4890,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.6" + "node": ">=4.2.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", - "dev": true - }, "node_modules/ua-parser-js": { "version": "0.7.32", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", @@ -10991,46 +4941,6 @@ "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -11039,15 +4949,6 @@ "node": ">= 4.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -11083,72 +4984,106 @@ "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "node_modules/vite": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.1.tgz", + "integrity": "sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, + "esbuild": "^0.16.3", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, "bin": { - "uuid": "dist/bin/uuid" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vite-plugin-static-copy": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-0.13.0.tgz", + "integrity": "sha512-cln+fvKMgwNBjxQ59QVblmExZrc9gGEdRmfqcPOOGpxT5KInfpkGMvmK4L+kCAeHHSSGNU1bM7BA9PQgaAJc6g==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">= 10.0.0" } }, "node_modules/warning": { @@ -11159,409 +5094,11 @@ "loose-envify": "^1.0.0" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", - "colorette": "^2.0.14", - "commander": "^9.4.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/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/webpack/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/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -11602,32 +5139,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -11643,51 +5154,12 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 3ff04ccc..5ba7933d 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,13 @@ "node": ">=16.0.0" }, "scripts": { - "start": "webpack serve --config ./webpack.dev.js --open", - "build": "webpack --config ./webpack.prod.js" + "start": "vite", + "build": "vite build", + "lint": "yarn check:eslint && yarn check:prettier", + "check:eslint": "eslint src/*", + "check:prettier": "prettier --check .", + "fix:prettier": "prettier --write .", + "typecheck": "tsc --noEmit" }, "keywords": [], "author": "Ajay Bura", @@ -19,7 +24,6 @@ "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", - "babel-polyfill": "6.26.0", "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", "dateformat": "5.0.3", @@ -46,37 +50,23 @@ "twemoji": "14.0.2" }, "devDependencies": { - "@babel/core": "7.20.5", - "@babel/preset-env": "7.20.2", - "@babel/preset-react": "7.18.6", - "assert": "2.0.0", - "babel-loader": "8.3.0", - "browserify-fs": "1.0.0", - "buffer": "6.0.3", - "clean-webpack-plugin": "4.0.0", - "copy-webpack-plugin": "11.0.0", - "crypto-browserify": "3.12.0", - "css-loader": "6.7.2", - "css-minimizer-webpack-plugin": "4.2.2", + "@rollup/plugin-wasm": "6.1.1", + "@types/react": "18.0.26", + "@types/react-dom": "18.0.9", + "@typescript-eslint/eslint-plugin": "5.46.1", + "@typescript-eslint/parser": "5.46.1", + "@vitejs/plugin-react": "3.0.0", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", + "eslint-config-prettier": "8.5.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", - "html-loader": "4.2.0", - "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.2", - "path-browserify": "1.0.1", + "prettier": "2.8.1", "sass": "1.56.2", - "sass-loader": "13.2.0", - "stream-browserify": "3.0.0", - "style-loader": "3.3.1", - "url": "0.11.0", - "util": "0.12.5", - "webpack": "5.75.0", - "webpack-cli": "5.0.1", - "webpack-dev-server": "4.11.1", - "webpack-merge": "5.8.0" + "typescript": "4.9.4", + "vite": "4.0.1", + "vite-plugin-static-copy": "0.13.0" } } diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 34a00037..00000000 --- a/public/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - Cinny - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json index 21ae4f0d..f1d4a882 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -11,49 +11,49 @@ "theme_color": "#fff", "icons": [ { - "src": "android-chrome-36x36.png", + "src": "/public/android/android-chrome-36x36.png", "sizes": "36x36", "type": "image/png" }, { - "src": "android-chrome-48x48.png", + "src": "/public/android/android-chrome-48x48.png", "sizes": "48x48", "type": "image/png" }, { - "src": "android-chrome-72x72.png", + "src": "/public/android/android-chrome-72x72.png", "sizes": "72x72", "type": "image/png" }, { - "src": "android-chrome-96x96.png", + "src": "/public/android/android-chrome-96x96.png", "sizes": "96x96", "type": "image/png" }, { - "src": "android-chrome-144x144.png", + "src": "/public/android/android-chrome-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "android-chrome-192x192.png", + "src": "/public/android/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "android-chrome-256x256.png", + "src": "/public/android/android-chrome-256x256.png", "sizes": "256x256", "type": "image/png" }, { - "src": "android-chrome-384x384.png", + "src": "/public/android/android-chrome-384x384.png", "sizes": "384x384", "type": "image/png" }, { - "src": "android-chrome-512x512.png", + "src": "/public/android/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ] -} \ No newline at end of file +} diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index cd961573..420f3154 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -1,5 +1,6 @@ import EventEmitter from 'events'; import * as sdk from 'matrix-js-sdk'; +import Olm from '@matrix-org/olm'; // import { logger } from 'matrix-js-sdk/lib/logger'; import { secret } from './state/auth'; @@ -10,7 +11,7 @@ import Notifications from './state/Notifications'; import { cryptoCallbacks } from './state/secretStorageKeys'; import navigation from './state/navigation'; -global.Olm = require('@matrix-org/olm'); +global.Olm = Olm; // logger.disableAll(); @@ -78,7 +79,7 @@ class InitMatrix extends EventEmitter { this.emit('init_loading_finished'); this.notifications._initNoti(); } else { - this.notifications._initNoti(); + this.notifications?._initNoti(); } }, RECONNECTING: () => { diff --git a/src/index.jsx b/src/index.jsx index 55f8656b..a252f6f0 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -9,7 +9,4 @@ import App from './app/pages/App'; settings.applyTheme(); -ReactDom.render( - , - document.getElementById('root'), -); +ReactDom.render(, document.getElementById('root')); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..e109a97c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "sourceMap": true, + "jsx": "react", + "target": "ES6", + "allowJs": true, + "esModuleInterop": true, + "moduleResolution": "Node", + "outDir": "dist", + "skipLibCheck": true + }, + "exclude": ["node_modules", "dist"], + "include": ["src"] +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000..b46913be --- /dev/null +++ b/vite.config.js @@ -0,0 +1,44 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { wasm } from '@rollup/plugin-wasm'; +import { viteStaticCopy } from 'vite-plugin-static-copy'; + +const copyFiles = { + targets: [ + { + src: 'node_modules/@matrix-org/olm/olm.wasm', + dest: '', + }, + { + src: '_redirects', + dest: '', + }, + { + src: 'config.json', + dest: '', + }, + { + src: 'public/res/android', + dest: 'public/', + } + ], +} + +export default defineConfig({ + appType: 'spa', + publicDir: false, + server: { + port: 8080, + host: true, + }, + plugins: [ + viteStaticCopy(copyFiles), + wasm(), + react(), + ], + build: { + outDir: 'dist', + sourcemap: true, + copyPublicDir: false, + }, +}); diff --git a/webpack.common.js b/webpack.common.js deleted file mode 100644 index bbf6871b..00000000 --- a/webpack.common.js +++ /dev/null @@ -1,66 +0,0 @@ -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const CopyPlugin = require("copy-webpack-plugin"); -const webpack = require('webpack'); - -module.exports = { - entry: { - polyfill: 'babel-polyfill', - main: './src/index.jsx' - }, - resolve: { - extensions: ['.js', '.jsx'], - fallback: { - 'crypto': require.resolve('crypto-browserify'), - 'path': require.resolve('path-browserify'), - 'fs': require.resolve('browserify-fs'), - 'stream': require.resolve('stream-browserify'), - 'util': require.resolve('util/'), - 'assert': require.resolve('assert/'), - 'url': require.resolve('url/'), - 'buffer': require.resolve('buffer'), - } - }, - node: { - global: true, - }, - module: { - rules: [ - { - test: /\.jsx?$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env', '@babel/preset-react'], - }, - }, - }, - { - test: /\.html$/, - use: ['html-loader'], - }, - { - test: /\.(png|jpe?g|gif|otf|ttf|woff|woff2|ogg)$/, - type: 'asset/resource', - }, - { - test: /\.svg$/, - type: 'asset/inline', - } - ], - }, - plugins: [ - new HtmlWebpackPlugin({ template: './public/index.html' }), - new CopyPlugin({ - patterns: [ - { from: 'node_modules/@matrix-org/olm/olm.wasm' }, - { from: '_redirects' }, - { from: 'config.json' }, - { from: 'public/res/android'} - ], - }), - new webpack.ProvidePlugin({ - Buffer: ['buffer', 'Buffer'], - }), - ], -}; diff --git a/webpack.dev.js b/webpack.dev.js deleted file mode 100644 index 2cfa2df7..00000000 --- a/webpack.dev.js +++ /dev/null @@ -1,27 +0,0 @@ -const path = require('path'); -const common = require('./webpack.common'); -const { merge } = require('webpack-merge'); - -module.exports = merge(common, { - mode: 'development', - output: { - path: path.resolve(__dirname, 'dist'), - filename: '[name].bundle.js', - publicPath: '/', - }, - devServer: { - historyApiFallback: true, - }, - module: { - rules: [ - { - test: /\.s?css$/, - use: [ - 'style-loader', - 'css-loader', - 'sass-loader', - ], - }, - ], - }, -}); diff --git a/webpack.prod.js b/webpack.prod.js deleted file mode 100644 index eea1eb87..00000000 --- a/webpack.prod.js +++ /dev/null @@ -1,39 +0,0 @@ -const path = require('path'); -const common = require('./webpack.common'); -const { merge } = require('webpack-merge'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); - -module.exports = merge(common, { - mode: 'production', - output: { - path: path.resolve(__dirname, 'dist'), - filename: '[name].[contenthash].bundle.js', - }, - optimization: { - minimize: true, - minimizer: [ - '...', - new CssMinimizerPlugin(), - ], - }, - module: { - rules: [ - { - test: /\.s?css$/, - use: [ - MiniCssExtractPlugin.loader, - 'css-loader', - 'sass-loader', - ], - }, - ], - }, - plugins: [ - new CleanWebpackPlugin(), - new MiniCssExtractPlugin({ - filename: '[name].[contenthash].bundle.css', - }), - ], -}); From e5e3f5f0a3542ce9b0c0205d176b4e05adc602e1 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 14 Jan 2023 18:51:42 +0530 Subject: [PATCH 422/824] Add jsdelivr cdn for twemoji --- src/app/organisms/emoji-board/EmojiBoard.jsx | 209 ++++++++++--------- src/app/organisms/room/RoomViewCmdBar.jsx | 39 ++-- src/util/twemojify.jsx | 9 +- 3 files changed, 137 insertions(+), 120 deletions(-) diff --git a/src/app/organisms/emoji-board/EmojiBoard.jsx b/src/app/organisms/emoji-board/EmojiBoard.jsx index d9762323..84c41306 100644 --- a/src/app/organisms/emoji-board/EmojiBoard.jsx +++ b/src/app/organisms/emoji-board/EmojiBoard.jsx @@ -13,6 +13,7 @@ import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; import { addRecentEmoji, getRecentEmojis } from './recent'; +import { TWEMOJI_BASE_URL } from '../../../util/twemojify'; import Text from '../../atoms/text/Text'; import RawIcon from '../../atoms/system-icons/RawIcon'; @@ -46,45 +47,49 @@ const EmojiGroup = React.memo(({ name, groupEmojis }) => { const emoji = groupEmojis[emojiIndex]; emojiRow.push( - { - emoji.hexcode - // This is a unicode emoji, and should be rendered with twemoji - ? parse(twemoji.parse( - emoji.unicode, - { - attributes: () => ({ - unicode: emoji.unicode, - shortcodes: emoji.shortcodes?.toString(), - hexcode: emoji.hexcode, - loading: 'lazy', - }), - }, - )) - // This is a custom emoji, and should be render as an mxc - : ( - {emoji.shortcode} - ) - } - , + {emoji.hexcode ? ( + // This is a unicode emoji, and should be rendered with twemoji + parse( + twemoji.parse(emoji.unicode, { + attributes: () => ({ + unicode: emoji.unicode, + shortcodes: emoji.shortcodes?.toString(), + hexcode: emoji.hexcode, + loading: 'lazy', + }), + base: TWEMOJI_BASE_URL, + }) + ) + ) : ( + // This is a custom emoji, and should be render as an mxc + {emoji.shortcode} + )} + ); } - emojiBoard.push(
    {emojiRow}
    ); + emojiBoard.push( +
    + {emojiRow} +
    + ); } return emojiBoard; } return (
    - {name} + + {name} + {groupEmojis.length !== 0 &&
    {getEmojiBoard()}
    }
    ); @@ -92,17 +97,16 @@ const EmojiGroup = React.memo(({ name, groupEmojis }) => { EmojiGroup.propTypes = { name: PropTypes.string.isRequired, - groupEmojis: PropTypes.arrayOf(PropTypes.shape({ - length: PropTypes.number, - unicode: PropTypes.string, - hexcode: PropTypes.string, - mxc: PropTypes.string, - shortcode: PropTypes.string, - shortcodes: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.arrayOf(PropTypes.string), - ]), - })).isRequired, + groupEmojis: PropTypes.arrayOf( + PropTypes.shape({ + length: PropTypes.number, + unicode: PropTypes.string, + hexcode: PropTypes.string, + mxc: PropTypes.string, + shortcode: PropTypes.string, + shortcodes: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]), + }) + ).isRequired, }; const asyncSearch = new AsyncSearch(); @@ -128,7 +132,13 @@ function SearchedEmoji() { if (searchedEmojis === null) return false; - return ; + return ( + + ); } function EmojiBoard({ onSelect, searchRef }) { @@ -146,7 +156,10 @@ function EmojiBoard({ onSelect, searchRef }) { if (typeof shortcodes === 'undefined') shortcodes = undefined; else shortcodes = shortcodes.split(','); return { - unicode, hexcode, shortcodes, mxc, + unicode, + hexcode, + shortcodes, + mxc, }; } @@ -211,10 +224,9 @@ function EmojiBoard({ onSelect, searchRef }) { const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); if (room) { - const packs = getRelevantPacks( - room.client, - [room, ...parentRooms], - ).filter((pack) => pack.getEmojis().length !== 0); + const packs = getRelevantPacks(room.client, [room, ...parentRooms]).filter( + (pack) => pack.getEmojis().length !== 0 + ); // Set an index for each pack so that we know where to jump when the user uses the nav for (let i = 0; i < packs.length; i += 1) { @@ -263,44 +275,41 @@ function EmojiBoard({ onSelect, searchRef }) { /> )}
    - { - availableEmojis.map((pack) => { - const src = initMatrix.matrixClient - .mxcUrlToHttp(pack.avatarUrl ?? pack.getEmojis()[0].mxc); - return ( - openGroup(recentOffset + pack.packIndex)} - src={src} - key={pack.packIndex} - tooltip={pack.displayName ?? 'Unknown'} - tooltipPlacement="left" - isImage - /> - ); - }) - } + {availableEmojis.map((pack) => { + const src = initMatrix.matrixClient.mxcUrlToHttp( + pack.avatarUrl ?? pack.getEmojis()[0].mxc + ); + return ( + openGroup(recentOffset + pack.packIndex)} + src={src} + key={pack.packIndex} + tooltip={pack.displayName ?? 'Unknown'} + tooltipPlacement="left" + isImage + /> + ); + })}
    - { - [ - [0, EmojiIC, 'Smilies'], - [1, DogIC, 'Animals'], - [2, CupIC, 'Food'], - [3, BallIC, 'Activities'], - [4, PhotoIC, 'Travel'], - [5, BulbIC, 'Objects'], - [6, PeaceIC, 'Symbols'], - [7, FlagIC, 'Flags'], - ].map(([indx, ico, name]) => ( - openGroup(recentOffset + availableEmojis.length + indx)} - key={indx} - src={ico} - tooltip={name} - tooltipPlacement="left" - /> - )) - } + {[ + [0, EmojiIC, 'Smilies'], + [1, DogIC, 'Animals'], + [2, CupIC, 'Food'], + [3, BallIC, 'Activities'], + [4, PhotoIC, 'Travel'], + [5, BulbIC, 'Objects'], + [6, PeaceIC, 'Symbols'], + [7, FlagIC, 'Flags'], + ].map(([indx, ico, name]) => ( + openGroup(recentOffset + availableEmojis.length + indx)} + key={indx} + src={ico} + tooltip={name} + tooltipPlacement="left" + /> + ))}
    @@ -313,27 +322,25 @@ function EmojiBoard({ onSelect, searchRef }) {
    - {recentEmojis.length > 0 && } - { - availableEmojis.map((pack) => ( - - )) - } - { - emojiGroups.map((group) => ( - - )) - } + {recentEmojis.length > 0 && ( + + )} + {availableEmojis.map((pack) => ( + + ))} + {emojiGroups.map((group) => ( + + ))}
    -
    { parse(twemoji.parse('🙂')) }
    +
    {parse(twemoji.parse('🙂', { base: TWEMOJI_BASE_URL }))}
    :slight_smile:
    diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx index 8c390a06..0d21123b 100644 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ b/src/app/organisms/room/RoomViewCmdBar.jsx @@ -5,7 +5,7 @@ import './RoomViewCmdBar.scss'; import parse from 'html-react-parser'; import twemoji from 'twemoji'; -import { twemojify } from '../../../util/twemojify'; +import { twemojify, TWEMOJI_BASE_URL } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import { getEmojiForCompletion } from '../emoji-board/custom-emoji'; @@ -31,7 +31,7 @@ CmdItem.propTypes = { function renderSuggestions({ prefix, option, suggestions }, fireCmd) { function renderCmdSuggestions(cmdPrefix, cmds) { - const cmdOptString = (typeof option === 'string') ? `/${option}` : '/?'; + const cmdOptString = typeof option === 'string' ? `/${option}` : '/?'; return cmds.map((cmd) => ( ({ unicode: emoji.unicode, shortcodes: emoji.shortcodes?.toString(), }), - }, - )); + base: TWEMOJI_BASE_URL, + }) + ); } // Render a custom emoji @@ -87,10 +87,12 @@ function renderSuggestions({ prefix, option, suggestions }, fireCmd) { return emos.map((emoji) => ( fireCmd({ - prefix: emPrefix, - result: emoji, - })} + onClick={() => + fireCmd({ + prefix: emPrefix, + result: emoji, + }) + } > {renderEmoji(emoji)} {`:${emoji.shortcode}:`} @@ -187,10 +189,13 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { }); }, '@': () => { - const members = mx.getRoom(roomId).getJoinedMembers().map((member) => ({ - name: member.name, - userId: member.userId.slice(1), - })); + const members = mx + .getRoom(roomId) + .getJoinedMembers() + .map((member) => ({ + name: member.name, + userId: member.userId.slice(1), + })); asyncSearch.setup(members, { keys: ['name', 'userId'], limit: 20 }); const endIndex = members.length > 20 ? 20 : members.length; setCmd({ prefix, suggestions: members.slice(0, endIndex) }); @@ -277,9 +282,7 @@ function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) {
    -
    - { renderSuggestions(cmd, fireCmd) } -
    +
    {renderSuggestions(cmd, fireCmd)}
    diff --git a/src/util/twemojify.jsx b/src/util/twemojify.jsx index 0a4fede7..abe82a66 100644 --- a/src/util/twemojify.jsx +++ b/src/util/twemojify.jsx @@ -6,6 +6,8 @@ import parse from 'html-react-parser'; import twemoji from 'twemoji'; import { sanitizeText } from './sanitize'; +export const TWEMOJI_BASE_URL = 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/'; + const Math = lazy(() => import('../app/atoms/math/Math')); const mathOptions = { @@ -38,11 +40,16 @@ const mathOptions = { export function twemojify(text, opts, linkify = false, sanitize = true, maths = false) { if (typeof text !== 'string') return text; let content = text; + const options = opts ?? { base: TWEMOJI_BASE_URL }; + if (!options.base) { + options.base = TWEMOJI_BASE_URL; + } if (sanitize) { content = sanitizeText(content); } - content = twemoji.parse(content, opts); + + content = twemoji.parse(content, options); if (linkify) { content = linkifyHtml(content, { target: '_blank', From 9a34daa2bc2d3d0a2a1ebadb419b916c7ba1bedd Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sun, 15 Jan 2023 05:14:16 +0100 Subject: [PATCH 423/824] Set `accept` attribute to `image/*` in ImageUpload (#989) That way, browsers will suggest to the users to upload an image file instead of any kind of file. The behaviour is in-line with Element's, which specifies the same attribute when selecting an avatar. Please note that it does not prevent users from uploading non-image files as avatars, as browsers interpret that attribute as a mere suggestion, which can be bypassed in the file select dialog. Partially fixes #982. --- src/app/molecules/image-upload/ImageUpload.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/molecules/image-upload/ImageUpload.jsx b/src/app/molecules/image-upload/ImageUpload.jsx index 34d0d4be..53fc7e16 100644 --- a/src/app/molecules/image-upload/ImageUpload.jsx +++ b/src/app/molecules/image-upload/ImageUpload.jsx @@ -74,7 +74,7 @@ function ImageUpload({ {uploadPromise ? 'Cancel' : 'Remove'} )} - +
    ); } From 38bbc1c6f5b4eca8a6052cbce0d72df7434fe2b4 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 15 Jan 2023 09:52:58 +0530 Subject: [PATCH 424/824] Vite plugin to add svg as inline data (#1072) * add vite plugin to add svg as inline data * Add node types package --- package-lock.json | 17 +++++++++++++++++ package.json | 2 ++ src/app/atoms/system-icons/RawIcon.jsx | 12 +++++------- vite.config.js | 2 ++ viteSvgLoader.ts | 16 ++++++++++++++++ 5 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 viteSvgLoader.ts diff --git a/package-lock.json b/package-lock.json index b60abb5c..673ba846 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ }, "devDependencies": { "@rollup/plugin-wasm": "6.1.1", + "@types/node": "18.11.18", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", "@typescript-eslint/eslint-plugin": "5.46.1", @@ -53,6 +54,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", + "mini-svg-data-uri": "1.4.4", "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", @@ -1054,6 +1056,12 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -3768,6 +3776,15 @@ "node": ">=8.6" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", diff --git a/package.json b/package.json index 5ba7933d..8ea3c31c 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ }, "devDependencies": { "@rollup/plugin-wasm": "6.1.1", + "@types/node": "18.11.18", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", "@typescript-eslint/eslint-plugin": "5.46.1", @@ -63,6 +64,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", + "mini-svg-data-uri": "1.4.4", "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", diff --git a/src/app/atoms/system-icons/RawIcon.jsx b/src/app/atoms/system-icons/RawIcon.jsx index 08acc66b..a6697f4f 100644 --- a/src/app/atoms/system-icons/RawIcon.jsx +++ b/src/app/atoms/system-icons/RawIcon.jsx @@ -2,20 +2,18 @@ import React from 'react'; import PropTypes from 'prop-types'; import './RawIcon.scss'; -function RawIcon({ - color, size, src, isImage, -}) { +function RawIcon({ color, size, src, isImage }) { const style = {}; if (color !== null) style.backgroundColor = color; if (isImage) { style.backgroundColor = 'transparent'; - style.backgroundImage = `url(${src})`; + style.backgroundImage = `url("${src}")`; } else { - style.WebkitMaskImage = `url(${src})`; - style.maskImage = `url(${src})`; + style.WebkitMaskImage = `url("${src}")`; + style.maskImage = `url("${src}")`; } - return ; + return ; } RawIcon.defaultProps = { diff --git a/vite.config.js b/vite.config.js index b46913be..7ca1baff 100644 --- a/vite.config.js +++ b/vite.config.js @@ -2,6 +2,7 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { wasm } from '@rollup/plugin-wasm'; import { viteStaticCopy } from 'vite-plugin-static-copy'; +import { svgLoader } from './viteSvgLoader'; const copyFiles = { targets: [ @@ -33,6 +34,7 @@ export default defineConfig({ }, plugins: [ viteStaticCopy(copyFiles), + svgLoader(), wasm(), react(), ], diff --git a/viteSvgLoader.ts b/viteSvgLoader.ts new file mode 100644 index 00000000..a119e3ed --- /dev/null +++ b/viteSvgLoader.ts @@ -0,0 +1,16 @@ +import svgToMiniDataURI from 'mini-svg-data-uri'; +import type { Plugin } from 'rollup'; +import fs from 'fs'; + +// TODO: remove this once https://github.com/vitejs/vite/pull/2909 gets merged +export const svgLoader = (): Plugin => ({ + name: 'vite-svg-patch-plugin', + transform: (code, id) => { + if (id.endsWith('.svg')) { + const extractedSvg = fs.readFileSync(id, 'utf8'); + const datauri = svgToMiniDataURI.toSrcset(extractedSvg); + return `export default "${datauri}"`; + } + return code; + }, +}); From 4ea14c853ee7b9c1a211a08e386fb323870e2ec2 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 15 Jan 2023 16:16:40 +1100 Subject: [PATCH 425/824] Release v2.2.3 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 673ba846..ffea90a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.2", + "version": "2.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.2", + "version": "2.2.3", "license": "MIT", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index 8ea3c31c..4082853c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.2", + "version": "2.2.3", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 785047d7..584eaba4 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.2', + version: '2.2.3', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', @@ -12,7 +12,13 @@ const cons = { HOME: 'home', DIRECTS: 'dm', }, - supportEventTypes: ['m.room.create', 'm.room.message', 'm.room.encrypted', 'm.room.member', 'm.sticker'], + supportEventTypes: [ + 'm.room.create', + 'm.room.message', + 'm.room.encrypted', + 'm.room.member', + 'm.sticker', + ], notifs: { DEFAULT: 'default', ALL_MESSAGES: 'all_messages', From 3ad143228d544ff1d6a0645284a63a444ae1d537 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:20:13 +1100 Subject: [PATCH 426/824] Use relative paths for build (#1094) --- vite.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.js b/vite.config.js index 7ca1baff..f4f588e5 100644 --- a/vite.config.js +++ b/vite.config.js @@ -28,6 +28,7 @@ const copyFiles = { export default defineConfig({ appType: 'spa', publicDir: false, + base: "", server: { port: 8080, host: true, From 374d2d1962c92cb75c747c7cfa1d86f2fd7ef736 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:20:53 +1100 Subject: [PATCH 427/824] Add node polyfills (#1093) * Add node polyfills * remove unused polyfill * enable fs in node polyfill * remove polyfill aliases and crypto * Fix build error * Fix buffer injection --- package-lock.json | 138 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 + vite.config.js | 21 +++++++ 3 files changed, 162 insertions(+) diff --git a/package-lock.json b/package-lock.json index ffea90a9..80aea6cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,8 @@ "twemoji": "14.0.2" }, "devDependencies": { + "@esbuild-plugins/node-globals-polyfill": "0.2.3", + "@rollup/plugin-inject": "5.0.3", "@rollup/plugin-wasm": "6.1.1", "@types/node": "18.11.18", "@types/react": "18.0.26", @@ -47,6 +49,7 @@ "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", "@vitejs/plugin-react": "3.0.0", + "buffer": "6.0.3", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "8.5.0", @@ -454,6 +457,15 @@ "node": ">=6.9.0" } }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.16.9", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.9.tgz", @@ -1010,6 +1022,34 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", + "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@rollup/plugin-wasm": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz", @@ -1027,6 +1067,34 @@ } } }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@tippyjs/react": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", @@ -1039,6 +1107,12 @@ "react-dom": ">=16.8" } }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "node_modules/@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -1594,6 +1668,26 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1671,6 +1765,30 @@ "base-x": "^4.0.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -3174,6 +3292,26 @@ "entities": "^4.3.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", diff --git a/package.json b/package.json index 4082853c..a0e7bace 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,8 @@ "twemoji": "14.0.2" }, "devDependencies": { + "@esbuild-plugins/node-globals-polyfill": "0.2.3", + "@rollup/plugin-inject": "5.0.3", "@rollup/plugin-wasm": "6.1.1", "@types/node": "18.11.18", "@types/react": "18.0.26", @@ -57,6 +59,7 @@ "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", "@vitejs/plugin-react": "3.0.0", + "buffer": "6.0.3", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "8.5.0", diff --git a/vite.config.js b/vite.config.js index f4f588e5..979e9aa0 100644 --- a/vite.config.js +++ b/vite.config.js @@ -2,6 +2,8 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { wasm } from '@rollup/plugin-wasm'; import { viteStaticCopy } from 'vite-plugin-static-copy'; +import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; +import inject from '@rollup/plugin-inject'; import { svgLoader } from './viteSvgLoader'; const copyFiles = { @@ -39,9 +41,28 @@ export default defineConfig({ wasm(), react(), ], + optimizeDeps: { + esbuildOptions: { + define: { + global: 'globalThis' + }, + plugins: [ + // Enable esbuild polyfill plugins + NodeGlobalsPolyfillPlugin({ + process: false, + buffer: true, + }), + ] + } + }, build: { outDir: 'dist', sourcemap: true, copyPublicDir: false, + rollupOptions: { + plugins: [ + inject({ Buffer: ['buffer', 'Buffer'] }) + ] + } }, }); From a6fb44e1abe9ad48136dee8e7d053e639f37bedc Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:27:17 +1100 Subject: [PATCH 428/824] Release v2.2.4 --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80aea6cb..bef7acdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.3", + "version": "2.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.3", + "version": "2.2.4", "license": "MIT", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index a0e7bace..7e026b7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.3", + "version": "2.2.4", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 584eaba4..86ddab98 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.3', + version: '2.2.4', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 44318d1ecd19700f010079d0836db7955fc23005 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:46:56 +1100 Subject: [PATCH 429/824] Replace deprecated 'set-output' with '$GITHUB_OUTPUT' --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index fa09008a..5f8a77cf 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -36,7 +36,7 @@ jobs: timeout-minutes: 1 - name: Get version from tag id: vars - run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} + run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT - name: Create tar.gz run: tar -czvf cinny-${{ steps.vars.outputs.tag }}.tar.gz dist - name: Sign tar.gz From 78951a3bc4fe499e68b2d709cdfb46e23b187e01 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 8 Feb 2023 17:13:05 +1100 Subject: [PATCH 430/824] Rename LICENSE to LICENSE.md --- LICENSE => LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename LICENSE => LICENSE.md (99%) diff --git a/LICENSE b/LICENSE.md similarity index 99% rename from LICENSE rename to LICENSE.md index 1f7a2841..7d151b3c 100644 --- a/LICENSE +++ b/LICENSE.md @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. From e33a887055db2c62946940264977f1a74984b620 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 24 Feb 2023 17:28:04 +0530 Subject: [PATCH 431/824] Change license to AGPLv3 (#1115) * Add CLA github action * Change license to AGPLv3 --- .github/workflows/cla.yml | 36 +++ LICENSE | 661 ++++++++++++++++++++++++++++++++++++++ LICENSE.md | 21 -- README.md | 9 - package-lock.json | 2 +- package.json | 2 +- public/res/LICENSE | 395 ----------------------- public/res/README.md | 7 - 8 files changed, 699 insertions(+), 434 deletions(-) create mode 100644 .github/workflows/cla.yml create mode 100644 LICENSE delete mode 100644 LICENSE.md delete mode 100644 public/res/LICENSE delete mode 100644 public/res/README.md diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 00000000..b433b8d9 --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,36 @@ +name: 'CLA Assistant' +on: + issue_comment: + types: [created] + pull_request_target: + types: [opened, closed, synchronize] + +jobs: + CLAssistant: + runs-on: ubuntu-latest + steps: + - name: 'CLA Assistant' + if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' + # Beta Release + uses: cla-assistant/github-action@v2.2.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # the below token should have repo scope and must be manually added by you in the repository's secret + PERSONAL_ACCESS_TOKEN: ${{ secrets.CLA_PAT }} + with: + path-to-signatures: 'signatures.json' + path-to-document: 'https://github.com/cinnyapp/cla/blob/main/cla.md' # e.g. a CLA or a DCO document + # branch should not be protected + branch: 'main' + allowlist: ajbura,bot* + + #below are the optional inputs - If the optional inputs are not given, then default values will be taken + remote-organization-name: cinnyapp + remote-repository-name: cla + #create-file-commit-message: 'For example: Creating file for storing CLA Signatures' + #signed-commit-message: 'For example: $contributorName has signed the CLA in #$pullRequestNo' + #custom-notsigned-prcomment: 'pull request comment with Introductory message to ask new contributors to sign' + #custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA' + #custom-allsigned-prcomment: 'pull request comment when all contributors has signed, defaults to **CLA Assistant Lite bot** All Contributors have signed the CLA.' + #lock-pullrequest-aftermerge: false - if you don't want this bot to automatically lock the pull request after merging (default - true) + #use-dco-flag: true - If you are using DCO instead of CLA diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..bae94e18 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 7d151b3c..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-present Ajay Bura (ajbura) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index acf76629..0db8ab6c 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,3 @@ docker run -p 8080:80 cinny:latest ``` This will forward your `localhost` port 8080 to the container's port 80. You can visit the app in your browser by navigating to `http://localhost:8080`. - - -## License - -Copyright (c) 2021-present Ajay Bura (ajbura) - -Code licensed under the MIT License: - -Graphics licensed under CC-BY 4.0: diff --git a/package-lock.json b/package-lock.json index bef7acdd..e004ee5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "cinny", "version": "2.2.4", - "license": "MIT", + "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", diff --git a/package.json b/package.json index 7e026b7b..0ff2338b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "keywords": [], "author": "Ajay Bura", - "license": "MIT", + "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", "@fontsource/roboto": "4.5.8", diff --git a/public/res/LICENSE b/public/res/LICENSE deleted file mode 100644 index 4ea99c21..00000000 --- a/public/res/LICENSE +++ /dev/null @@ -1,395 +0,0 @@ -Attribution 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution 4.0 International Public License ("Public License"). To the -extent this Public License may be interpreted as a contract, You are -granted the Licensed Rights in consideration of Your acceptance of -these terms and conditions, and the Licensor grants You such rights in -consideration of benefits the Licensor receives from making the -Licensed Material available under these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - d. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - g. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/public/res/README.md b/public/res/README.md deleted file mode 100644 index 4e4f7c7a..00000000 --- a/public/res/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2021-present Ajay Bura (ajbura) - -Graphic content is licensed under a -Creative Commons Attribution 4.0 International License. - -You should have received a copy of the license along with this -work. If not, see ;. \ No newline at end of file From e446fc47ce6e3632b089682142e6e058712b1a6e Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 26 Feb 2023 14:22:05 +0530 Subject: [PATCH 432/824] Add screenshot in readme (#1140) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0db8ab6c..0d4a38ac 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ A Matrix client focusing primarily on simple, elegant and secure interface. The - [Roadmap](https://github.com/ajbura/cinny/projects/11) - [Contributing](./CONTRIBUTING.md) + + ## Getting started Web app is available at https://app.cinny.in and gets updated on each new release. The `dev` branch is continuously deployed at https://dev.cinny.in but keep in mind that it could have things broken. From 863612d1a1aadcde90ee8612150eacd2c32a28b9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 14:17:00 +1100 Subject: [PATCH 433/824] fix(deps): update dependency matrix-js-sdk to v24 (#1175) * fix(deps): update dependency matrix-js-sdk to v24 * Update build-pull-request.yml * Update netlify-dev.yml * Update prod-deploy.yml --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 + .github/workflows/netlify-dev.yml | 2 + .github/workflows/prod-deploy.yml | 2 + package-lock.json | 58 +++++++++++++----------- package.json | 2 +- 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 5eac02eb..5be04293 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -21,6 +21,8 @@ jobs: - name: Install dependencies run: npm ci - name: Build app + env: + NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Upload artifact uses: actions/upload-artifact@v3.1.1 diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 6f26247b..12785f46 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -20,6 +20,8 @@ jobs: - name: Install dependencies run: npm ci - name: Build app + env: + NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Deploy to Netlify uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 5f8a77cf..8d72a86e 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -19,6 +19,8 @@ jobs: - name: Install dependencies run: npm ci - name: Build app + env: + NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Deploy to Netlify uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 diff --git a/package-lock.json b/package-lock.json index e004ee5c..1fe6213e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "22.0.0", + "matrix-js-sdk": "24.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -958,6 +958,14 @@ "react-dom": "16.14.0" } }, + "node_modules/@matrix-org/matrix-sdk-crypto-js": { + "version": "0.1.0-alpha.5", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.5.tgz", + "integrity": "sha512-2KjAgWNGfuGLNjJwsrs6gGX157vmcTfNrA4u249utgnMPbJl7QwuUqh1bGxQ0PpK06yvZjgPlkna0lTbuwtuQw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@matrix-org/olm": { "version": "3.2.14", "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", @@ -1170,11 +1178,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, - "node_modules/@types/sdp-transform": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/sdp-transform/-/sdp-transform-2.4.5.tgz", - "integrity": "sha512-GVO0gnmbyO3Oxm2HdPsYUNcyihZE3GyCY8ysMYHuQGfLhGZq89Nm4lSzULWTzZoyHtg+VO/IdrnxZHPnPSGnAg==" - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -1793,6 +1796,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3025,7 +3029,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -3067,6 +3072,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -3180,6 +3186,7 @@ "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" }, @@ -3221,6 +3228,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -3862,12 +3870,12 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-22.0.0.tgz", - "integrity": "sha512-mpKqeD3nCobjGiUiATUyEoP44n+AzDW5cSeBTIBY5fPhj0AkzLJhblHt40vzSOJazj8tT0PhsSzhEIR9hGzYGA==", + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.0.0.tgz", + "integrity": "sha512-AOhO036ziDf6lwYoauj5DES/RJ6RDTq+vrK2yO/GW/8n+bAXhkjWc9AA/WcTK/9SkNHS46ZanmolkhS1n8WniQ==", "dependencies": { "@babel/runtime": "^7.12.5", - "@types/sdp-transform": "^2.4.5", + "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.3", "another-json": "^0.2.0", "bs58": "^5.0.0", "content-type": "^1.0.4", @@ -3875,9 +3883,9 @@ "matrix-events-sdk": "0.0.1", "matrix-widget-api": "^1.0.0", "p-retry": "4", - "qs": "^6.9.6", "sdp-transform": "^2.14.1", - "unhomoglyph": "^1.0.6" + "unhomoglyph": "^1.0.6", + "uuid": "9" }, "engines": { "node": ">=16.0.0" @@ -4019,6 +4027,7 @@ "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4329,20 +4338,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4770,6 +4765,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -5139,6 +5135,14 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vite": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.1.tgz", diff --git a/package.json b/package.json index 0ff2338b..b98f2890 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "22.0.0", + "matrix-js-sdk": "24.0.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 8524472d3874516f5a12ce0c2d242ccfe3ecea59 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 29 Mar 2023 14:30:52 +1100 Subject: [PATCH 434/824] Release v2.2.5 (#1176) * Update package.json * Update package-lock.json * Update cons.js --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fe6213e..8c8f776b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.4", + "version": "2.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.4", + "version": "2.2.5", "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index b98f2890..dd23454c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.4", + "version": "2.2.5", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 86ddab98..ae39c317 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.4', + version: '2.2.5', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From cfddaaae1368e9f240520d178e1f1fea2b5e3d50 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 29 Mar 2023 21:57:05 +1100 Subject: [PATCH 435/824] Fix docker build failing (#1177) --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 968ca1d1..af9abbd9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ WORKDIR /src COPY .npmrc package.json package-lock.json /src/ RUN npm ci COPY . /src/ +ENV NODE_OPTIONS=--max_old_space_size=4096 RUN npm run build From f6694031a1581af171ffe1658138dfcf344d6c6c Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 29 Mar 2023 22:02:01 +1100 Subject: [PATCH 436/824] Release v2.2.6 (#1178) * Update package.json * Update package-lock.json * Update cons.js --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c8f776b..2cca1d0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.5", + "version": "2.2.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.5", + "version": "2.2.6", "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index dd23454c..a37b6242 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.5", + "version": "2.2.6", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index ae39c317..8d9fda54 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.5', + version: '2.2.6', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From dcad1840c428933392eaafdb3a4da63484fdd36a Mon Sep 17 00:00:00 2001 From: Bo Date: Thu, 30 Mar 2023 16:42:33 +0200 Subject: [PATCH 437/824] fix: Fixed small typo an cross signing reset modal (#1112) --- src/app/organisms/settings/CrossSigning.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/settings/CrossSigning.jsx b/src/app/organisms/settings/CrossSigning.jsx index 9213e9da..563e3152 100644 --- a/src/app/organisms/settings/CrossSigning.jsx +++ b/src/app/organisms/settings/CrossSigning.jsx @@ -188,7 +188,7 @@ function CrossSigningReset() { {twemojify('✋🧑‍🚒🤚')} Resetting cross-signing keys is permanent. - Anyone you have verified with will see security alerts and your message backup will lost. + Anyone you have verified with will see security alerts and your message backup will be lost. You almost certainly do not want to do this, unless you have lost Security Key or Phrase and every session you can cross-sign from. From da92ce3a46ab4f702f518c728437b1fb574ef0fc Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 16 Apr 2023 22:22:01 +1000 Subject: [PATCH 438/824] fix: spoiler hidden link click (#1199) --- src/app/organisms/room/RoomViewContent.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index 745ece82..74bc7e26 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -114,6 +114,7 @@ function handleOnClickCapture(e) { const spoiler = nativeEvent.composedPath().find((el) => el?.hasAttribute?.('data-mx-spoiler')); if (spoiler) { + if (!spoiler.classList.contains('data-mx-spoiler--visible')) e.preventDefault(); spoiler.classList.toggle('data-mx-spoiler--visible'); } } From 2055d7a07fdd0a1faf25deb3be040f6de7932023 Mon Sep 17 00:00:00 2001 From: Thumbscrew Date: Sun, 28 May 2023 16:54:10 +0100 Subject: [PATCH 439/824] add document.hasFocus check for incoming room events (#1252) --- src/app/organisms/room/RoomViewContent.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index 74bc7e26..0a9256ce 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -358,7 +358,7 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event const isViewingLive = roomTimeline.isServingLiveTimeline() && limit.length >= tLength - 1; const isAttached = timelineScroll.bottom < SCROLL_TRIGGER_POS; - if (isViewingLive && isAttached) { + if (isViewingLive && isAttached && document.hasFocus()) { limit.setFrom(tLength - limit.maxEvents); trySendReadReceipt(event); setEvent(event); From 0b06bed1db9fee695407ad8088500e7266921751 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:15:23 +1000 Subject: [PATCH 440/824] Refactor state & Custom editor (#1190) * Fix eslint * Enable ts strict mode * install folds, jotai & immer * Enable immer map/set * change cross-signing alert anim to 30 iteration * Add function to access matrix client * Add new types * Add disposable util * Add room utils * Add mDirect list atom * Add invite list atom * add room list atom * add utils for jotai atoms * Add room id to parents atom * Add mute list atom * Add room to unread atom * Use hook to bind atoms with sdk * Add settings atom * Add settings hook * Extract set settings hook * Add Sidebar components * WIP * Add bind atoms hook * Fix init muted room list atom * add navigation atoms * Add custom editor * Fix hotkeys * Update folds * Add editor output function * Add matrix client context * Add tooltip to editor toolbar items * WIP - Add editor to room input * Refocus editor on toolbar item click * Add Mentions - WIP * update folds * update mention focus outline * rename emoji element type * Add auto complete menu * add autocomplete query functions * add index file for editor * fix bug in getPrevWord function * Show room mention autocomplete * Add async search function * add use async search hook * use async search in room mention autocomplete * remove folds prefer font for now * allow number array in async search * reset search with empty query * Autocomplete unknown room mention * Autocomplete first room mention on tab * fix roomAliasFromQueryText * change mention color to primary * add isAlive hook * add getMxIdLocalPart to mx utils * fix getRoomAvatarUrl size * fix types * add room members hook * fix bug in room mention * add user mention autocomplete * Fix async search giving prev result after no match * update folds * add twemoji font * add use state provider hook * add prevent scroll with arrow key util * add ts to custom-emoji and emoji files * add types * add hook for emoji group labels * add hook for emoji group icons * add emoji board with basic emoji * add emojiboard in room input * select multiple emoji with shift press * display custom emoji in emojiboard * Add emoji preview * focus element on hover * update folds * position emojiboard properly * convert recent-emoji.js to ts * add use recent emoji hook * add io.element.recent_emoji to account data evt * Render recent emoji in emoji board * show custom emoji from parent spaces * show room emoji * improve emoji sidebar * update folds * fix pack avatar and name fallback in emoji board * add stickers to emoji board * fix bug in emoji preview * Add sticker icon in room input * add debounce hook * add search in emoji board * Optimize emoji board * fix emoji board sidebar divider * sync emojiboard sidebar with scroll & update ui * Add use throttle hook * support custom emoji in editor * remove duplicate emoji selection function * fix emoji and mention spacing * add emoticon autocomplete in editor * fix string * makes emoji size relative to font size in editor * add option to render link element * add spoiler in editor * fix sticker in emoji board search using wrong type * render custom placeholder * update hotkey for block quote and block code * add terminate search function in async search * add getImageInfo to matrix utils * send stickers * add resize observer hook * move emoji board component hooks in hooks dir * prevent editor expand hides room timeline * send typing notifications * improve emoji style and performance * fix imports * add on paste param to editor * add selectFile utils * add file picker hook * add file paste handler hook * add file drop handler * update folds * Add file upload card * add bytes to size util * add blurHash util * add await to js lib * add browser-encrypt-attachment types * add list atom * convert mimetype file to ts * add matrix types * add matrix file util * add file related dom utils * add common utils * add upload atom * add room input draft atom * add upload card renderer component * add upload board component * add support for file upload in editor * send files with message / enter * fix circular deps * store editor toolbar state in local store * move msg content util to separate file * store msg draft on room switch * fix following member not updating on msg sent * add theme for folds component * fix system default theme * Add reply support in editor * prevent initMatrix to init multiple time * add state event hooks * add async callback hook * Show tombstone info for tombstone room * fix room tombstone component border * add power level hook * Add room input placeholder component * Show input placeholder for muted member --- .eslintrc.js | 2 + index.html | 2 +- package-lock.json | 764 ++++++++++++---- package.json | 19 +- public/font/Twemoji.Mozilla.v.7.0.woff2 | Bin 0 -> 472228 bytes public/font/Twemoji.Mozilla.v0.7.0.ttf | Bin 0 -> 1474284 bytes src/app/components/UseStateProvider.tsx | 9 + src/app/components/editor/Editor.css.ts | 63 ++ src/app/components/editor/Editor.preview.tsx | 82 ++ src/app/components/editor/Editor.tsx | 151 +++ src/app/components/editor/Elements.css.ts | 142 +++ src/app/components/editor/Elements.tsx | 254 ++++++ src/app/components/editor/Toolbar.tsx | 247 +++++ .../autocomplete/AutocompleteMenu.css.tsx | 35 + .../editor/autocomplete/AutocompleteMenu.tsx | 40 + .../autocomplete/EmoticonAutocomplete.tsx | 129 +++ .../autocomplete/RoomMentionAutocomplete.tsx | 181 ++++ .../autocomplete/UserMentionAutocomplete.tsx | 191 ++++ .../editor/autocomplete/autocompleteQuery.ts | 46 + .../components/editor/autocomplete/index.ts | 5 + src/app/components/editor/common.ts | 194 ++++ src/app/components/editor/index.ts | 7 + src/app/components/editor/keyboard.ts | 40 + src/app/components/editor/output.ts | 95 ++ src/app/components/editor/slate.d.ts | 107 +++ .../components/emoji-board/EmojiBoard.css.tsx | 134 +++ src/app/components/emoji-board/EmojiBoard.tsx | 860 ++++++++++++++++++ src/app/components/emoji-board/index.ts | 1 + .../emoji-board/useEmojiGroupIcons.ts | 21 + .../emoji-board/useEmojiGroupLabels.ts | 19 + src/app/components/sidebar/Sidebar.css.ts | 111 +++ src/app/components/sidebar/Sidebar.tsx | 8 + src/app/components/sidebar/SidebarAvatar.tsx | 75 ++ src/app/components/sidebar/SidebarContent.tsx | 21 + src/app/components/sidebar/SidebarStack.tsx | 10 + .../sidebar/SidebarStackSeparator.tsx | 13 + src/app/components/sidebar/index.ts | 5 + .../upload-board/UploadBoard.css.ts | 46 + .../components/upload-board/UploadBoard.tsx | 145 +++ src/app/components/upload-board/index.ts | 1 + .../components/upload-card/UploadCard.css.ts | 24 + src/app/components/upload-card/UploadCard.tsx | 63 ++ .../upload-card/UploadCardRenderer.tsx | 89 ++ src/app/components/upload-card/index.ts | 2 + src/app/hooks/useAlive.ts | 15 + src/app/hooks/useAsyncCallback.ts | 70 ++ src/app/hooks/useAsyncSearch.ts | 81 ++ src/app/hooks/useDebounce.ts | 34 + src/app/hooks/useFileDrop.ts | 66 ++ src/app/hooks/useFilePasteHandler.ts | 11 + src/app/hooks/useFilePicker.ts | 15 + src/app/hooks/useForceUpdate.ts | 9 + src/app/hooks/useImagePacks.ts | 48 + src/app/hooks/useKeyDown.ts | 10 + src/app/hooks/useMatrixClient.ts | 12 + src/app/hooks/usePowerLevels.ts | 86 ++ src/app/hooks/useRecentEmoji.ts | 23 + src/app/hooks/useResizeObserver.ts | 24 + src/app/hooks/useRoomMembers.ts | 34 + src/app/hooks/useStateEvent.ts | 32 + src/app/hooks/useStateEventCallback.ts | 17 + src/app/hooks/useStateEvents.ts | 28 + src/app/hooks/useThrottle.ts | 41 + src/app/hooks/useTypingStatusUpdater.ts | 42 + .../following-members/FollowingMembers.jsx | 38 +- src/app/organisms/drag-drop/DragDrop.jsx | 24 - src/app/organisms/drag-drop/DragDrop.scss | 12 - src/app/organisms/navigation/SideBar.scss | 16 +- src/app/organisms/navigation/Sidebar1.tsx | 125 +++ src/app/organisms/room/Room.jsx | 12 +- src/app/organisms/room/RoomInput.tsx | 539 +++++++++++ .../room/RoomInputPlaceholder.css.ts | 10 + .../organisms/room/RoomInputPlaceholder.tsx | 11 + src/app/organisms/room/RoomTombstone.css.ts | 7 + src/app/organisms/room/RoomTombstone.tsx | 67 ++ src/app/organisms/room/RoomView.jsx | 60 +- src/app/organisms/room/RoomView.scss | 9 +- src/app/organisms/room/RoomViewContent.jsx | 21 +- src/app/organisms/room/msgContent.ts | 148 +++ src/app/pages/App.jsx | 9 +- src/app/plugins/custom-emoji.ts | 293 ++++++ src/app/plugins/emoji.ts | 104 +++ src/app/plugins/recent-emoji.ts | 44 + src/app/state/hooks/inviteList.ts | 63 ++ src/app/state/hooks/roomList.ts | 54 ++ src/app/state/hooks/settings.ts | 34 + src/app/state/hooks/useBindAtoms.ts | 16 + src/app/state/inviteList.ts | 32 + src/app/state/list.ts | 33 + src/app/state/mDirectList.ts | 47 + src/app/state/mutedRoomList.ts | 101 ++ src/app/state/roomInputDrafts.ts | 48 + src/app/state/roomList.ts | 31 + src/app/state/roomToParents.ts | 120 +++ src/app/state/roomToUnread.ts | 219 +++++ src/app/state/selectedRoom.ts | 3 + src/app/state/selectedTab.ts | 8 + src/app/state/settings.ts | 49 + src/app/state/tabToRoom.ts | 34 + src/app/state/upload.ts | 146 +++ src/app/state/utils.ts | 64 ++ src/app/templates/client/Client.jsx | 114 +-- src/app/utils/AsyncSearch.ts | 102 +++ src/app/utils/blurHash.ts | 19 + src/app/utils/common.ts | 32 + src/app/utils/disposable.ts | 8 + src/app/utils/dom.ts | 133 +++ src/app/utils/key-symbol.ts | 6 + src/app/utils/keyboard.ts | 25 + src/app/utils/matrix.ts | 118 +++ src/app/utils/mimeTypes.ts | 47 + src/app/utils/room.ts | 265 ++++++ src/app/utils/sanitize.ts | 10 + src/app/utils/user-agent.ts | 5 + src/client/initMatrix.js | 5 + src/client/mx.ts | 7 + src/client/state/RoomList.js | 6 - src/client/state/settings.js | 24 +- src/colors.css.ts | 238 +++++ src/ext.d.ts | 23 + src/index.jsx | 10 + src/index.scss | 107 +-- src/types/matrix/accountData.ts | 12 + src/types/matrix/common.ts | 22 + src/types/matrix/room.ts | 61 ++ src/util/sanitize.js | 2 +- tsconfig.json | 3 +- vite.config.js | 2 + 128 files changed, 8799 insertions(+), 409 deletions(-) create mode 100644 public/font/Twemoji.Mozilla.v.7.0.woff2 create mode 100644 public/font/Twemoji.Mozilla.v0.7.0.ttf create mode 100644 src/app/components/UseStateProvider.tsx create mode 100644 src/app/components/editor/Editor.css.ts create mode 100644 src/app/components/editor/Editor.preview.tsx create mode 100644 src/app/components/editor/Editor.tsx create mode 100644 src/app/components/editor/Elements.css.ts create mode 100644 src/app/components/editor/Elements.tsx create mode 100644 src/app/components/editor/Toolbar.tsx create mode 100644 src/app/components/editor/autocomplete/AutocompleteMenu.css.tsx create mode 100644 src/app/components/editor/autocomplete/AutocompleteMenu.tsx create mode 100644 src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx create mode 100644 src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx create mode 100644 src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx create mode 100644 src/app/components/editor/autocomplete/autocompleteQuery.ts create mode 100644 src/app/components/editor/autocomplete/index.ts create mode 100644 src/app/components/editor/common.ts create mode 100644 src/app/components/editor/index.ts create mode 100644 src/app/components/editor/keyboard.ts create mode 100644 src/app/components/editor/output.ts create mode 100644 src/app/components/editor/slate.d.ts create mode 100644 src/app/components/emoji-board/EmojiBoard.css.tsx create mode 100644 src/app/components/emoji-board/EmojiBoard.tsx create mode 100644 src/app/components/emoji-board/index.ts create mode 100644 src/app/components/emoji-board/useEmojiGroupIcons.ts create mode 100644 src/app/components/emoji-board/useEmojiGroupLabels.ts create mode 100644 src/app/components/sidebar/Sidebar.css.ts create mode 100644 src/app/components/sidebar/Sidebar.tsx create mode 100644 src/app/components/sidebar/SidebarAvatar.tsx create mode 100644 src/app/components/sidebar/SidebarContent.tsx create mode 100644 src/app/components/sidebar/SidebarStack.tsx create mode 100644 src/app/components/sidebar/SidebarStackSeparator.tsx create mode 100644 src/app/components/sidebar/index.ts create mode 100644 src/app/components/upload-board/UploadBoard.css.ts create mode 100644 src/app/components/upload-board/UploadBoard.tsx create mode 100644 src/app/components/upload-board/index.ts create mode 100644 src/app/components/upload-card/UploadCard.css.ts create mode 100644 src/app/components/upload-card/UploadCard.tsx create mode 100644 src/app/components/upload-card/UploadCardRenderer.tsx create mode 100644 src/app/components/upload-card/index.ts create mode 100644 src/app/hooks/useAlive.ts create mode 100644 src/app/hooks/useAsyncCallback.ts create mode 100644 src/app/hooks/useAsyncSearch.ts create mode 100644 src/app/hooks/useDebounce.ts create mode 100644 src/app/hooks/useFileDrop.ts create mode 100644 src/app/hooks/useFilePasteHandler.ts create mode 100644 src/app/hooks/useFilePicker.ts create mode 100644 src/app/hooks/useForceUpdate.ts create mode 100644 src/app/hooks/useImagePacks.ts create mode 100644 src/app/hooks/useKeyDown.ts create mode 100644 src/app/hooks/useMatrixClient.ts create mode 100644 src/app/hooks/usePowerLevels.ts create mode 100644 src/app/hooks/useRecentEmoji.ts create mode 100644 src/app/hooks/useResizeObserver.ts create mode 100644 src/app/hooks/useRoomMembers.ts create mode 100644 src/app/hooks/useStateEvent.ts create mode 100644 src/app/hooks/useStateEventCallback.ts create mode 100644 src/app/hooks/useStateEvents.ts create mode 100644 src/app/hooks/useThrottle.ts create mode 100644 src/app/hooks/useTypingStatusUpdater.ts delete mode 100644 src/app/organisms/drag-drop/DragDrop.jsx delete mode 100644 src/app/organisms/drag-drop/DragDrop.scss create mode 100644 src/app/organisms/navigation/Sidebar1.tsx create mode 100644 src/app/organisms/room/RoomInput.tsx create mode 100644 src/app/organisms/room/RoomInputPlaceholder.css.ts create mode 100644 src/app/organisms/room/RoomInputPlaceholder.tsx create mode 100644 src/app/organisms/room/RoomTombstone.css.ts create mode 100644 src/app/organisms/room/RoomTombstone.tsx create mode 100644 src/app/organisms/room/msgContent.ts create mode 100644 src/app/plugins/custom-emoji.ts create mode 100644 src/app/plugins/emoji.ts create mode 100644 src/app/plugins/recent-emoji.ts create mode 100644 src/app/state/hooks/inviteList.ts create mode 100644 src/app/state/hooks/roomList.ts create mode 100644 src/app/state/hooks/settings.ts create mode 100644 src/app/state/hooks/useBindAtoms.ts create mode 100644 src/app/state/inviteList.ts create mode 100644 src/app/state/list.ts create mode 100644 src/app/state/mDirectList.ts create mode 100644 src/app/state/mutedRoomList.ts create mode 100644 src/app/state/roomInputDrafts.ts create mode 100644 src/app/state/roomList.ts create mode 100644 src/app/state/roomToParents.ts create mode 100644 src/app/state/roomToUnread.ts create mode 100644 src/app/state/selectedRoom.ts create mode 100644 src/app/state/selectedTab.ts create mode 100644 src/app/state/settings.ts create mode 100644 src/app/state/tabToRoom.ts create mode 100644 src/app/state/upload.ts create mode 100644 src/app/state/utils.ts create mode 100644 src/app/utils/AsyncSearch.ts create mode 100644 src/app/utils/blurHash.ts create mode 100644 src/app/utils/common.ts create mode 100644 src/app/utils/disposable.ts create mode 100644 src/app/utils/dom.ts create mode 100644 src/app/utils/key-symbol.ts create mode 100644 src/app/utils/keyboard.ts create mode 100644 src/app/utils/matrix.ts create mode 100644 src/app/utils/mimeTypes.ts create mode 100644 src/app/utils/room.ts create mode 100644 src/app/utils/sanitize.ts create mode 100644 src/app/utils/user-agent.ts create mode 100644 src/client/mx.ts create mode 100644 src/colors.css.ts create mode 100644 src/ext.d.ts create mode 100644 src/types/matrix/accountData.ts create mode 100644 src/types/matrix/common.ts create mode 100644 src/types/matrix/room.ts diff --git a/.eslintrc.js b/.eslintrc.js index e8f9224e..70437418 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,6 +27,7 @@ module.exports = { rules: { 'linebreak-style': 0, 'no-underscore-dangle': 0, + "no-shadow": "off", "import/prefer-default-export": "off", "import/extensions": "off", @@ -55,5 +56,6 @@ module.exports = { "react-hooks/exhaustive-deps": "error", "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-shadow": "error" }, }; diff --git a/index.html b/index.html index af1a6268..36c5740a 100644 --- a/index.html +++ b/index.html @@ -27,7 +27,7 @@ - + diff --git a/package-lock.json b/package-lock.json index 2cca1d0c..62675247 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,25 @@ "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", + "@vanilla-extract/css": "1.9.3", + "@vanilla-extract/recipes": "0.3.0", + "@vanilla-extract/vite-plugin": "3.7.1", + "await-to-js": "3.0.0", "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", + "classnames": "2.3.2", "dateformat": "5.0.3", + "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", "flux": "4.0.3", + "focus-trap-react": "10.0.2", + "folds": "1.2.1", "formik": "2.2.9", "html-react-parser": "3.0.4", + "immer": "9.0.16", + "is-hotkey": "0.2.0", + "jotai": "1.12.0", "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", @@ -36,8 +47,11 @@ "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "sanitize-html": "2.8.0", + "slate": "0.90.0", + "slate-react": "0.90.0", "tippy.js": "6.3.7", - "twemoji": "14.0.2" + "twemoji": "14.0.2", + "ua-parser-js": "1.0.35" }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "0.2.3", @@ -46,6 +60,7 @@ "@types/node": "18.11.18", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", + "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", "@vitejs/plugin-react": "3.0.0", @@ -61,7 +76,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.0.1", + "vite": "4.0.4", "vite-plugin-static-copy": "0.13.0" }, "engines": { @@ -72,7 +87,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -85,7 +99,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -94,34 +107,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true, + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", - "dev": true, + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -133,12 +144,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "dependencies": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -150,7 +160,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -161,14 +170,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dependencies": { - "@babel/compat-data": "^7.20.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -178,11 +187,23 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -191,7 +212,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" @@ -204,7 +224,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -216,7 +235,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -225,19 +243,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -247,7 +264,6 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -256,7 +272,6 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, "dependencies": { "@babel/types": "^7.20.2" }, @@ -268,7 +283,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -280,7 +294,6 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -289,7 +302,6 @@ "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -298,20 +310,18 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", - "dev": true, + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -321,7 +331,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -332,10 +341,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", - "dev": true, + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -343,6 +351,20 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", @@ -409,33 +431,31 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "dev": true, + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -444,10 +464,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -457,6 +476,11 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, "node_modules/@esbuild-plugins/node-globals-polyfill": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", @@ -473,7 +497,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -489,7 +512,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -505,7 +527,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -521,7 +542,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -537,7 +557,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -553,7 +572,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -569,7 +587,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -585,7 +602,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -601,7 +617,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -617,7 +632,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -633,7 +647,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -649,7 +662,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -665,7 +677,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -681,7 +692,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -697,7 +707,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -713,7 +722,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -729,7 +737,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -745,7 +752,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -761,7 +767,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -777,7 +782,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -793,7 +797,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -809,7 +812,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -903,7 +905,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -916,7 +917,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -925,7 +925,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -933,19 +932,22 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, "node_modules/@khanacademy/simple-markdown": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", @@ -1126,6 +1128,11 @@ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, + "node_modules/@types/is-hotkey": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.7.tgz", + "integrity": "sha512-yB5C7zcOM7idwYZZ1wKQ3pTfjA9BbvFqRWvKB46GFddxnJtHwi/b9y84ykQtxQPg5qhdpg4Q/kWU3EGoCTmLzQ==" + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -1138,6 +1145,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -1184,6 +1196,12 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.36", + "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", + "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", @@ -1438,6 +1456,148 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vanilla-extract/babel-plugin-debug-ids": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.1.tgz", + "integrity": "sha512-ynyKqsJiMzM1/yiIJ6QdqpWKlK4IMJJWREpPtaemZrE1xG1B4E/Nfa6YazuDWjDkCJC1tRIpEGnVs+pMIjUxyw==", + "dependencies": { + "@babel/core": "^7.20.7" + } + }, + "node_modules/@vanilla-extract/css": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.9.3.tgz", + "integrity": "sha512-vitcD8usEOTWDLAnbtnZ46YbHADAp3Es+3xyHsMDMZOEWk03FhD+PbR58kdwtGpr258+hMryCYtQPeFh5lWFbA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.3", + "ahocorasick": "1.0.2", + "chalk": "^4.1.1", + "css-what": "^5.0.1", + "cssesc": "^3.0.0", + "csstype": "^3.0.7", + "deep-object-diff": "^1.1.0", + "deepmerge": "^4.2.2", + "media-query-parser": "^2.0.2", + "outdent": "^0.8.0" + } + }, + "node_modules/@vanilla-extract/css/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vanilla-extract/css/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@vanilla-extract/css/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@vanilla-extract/css/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==" + }, + "node_modules/@vanilla-extract/css/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vanilla-extract/css/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vanilla-extract/css/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vanilla-extract/integration": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/integration/-/integration-6.0.2.tgz", + "integrity": "sha512-LwfXlh0THeNvVXdA3iWFYvJs1mvEP1PkfQD/7S6Purry7L8iDizDV/87FgWBJ79FnTmYIvMrc7BOQsUajNj9VQ==", + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-syntax-typescript": "^7.20.0", + "@vanilla-extract/babel-plugin-debug-ids": "^1.0.1", + "@vanilla-extract/css": "^1.9.3", + "esbuild": "^0.16.3", + "eval": "0.1.6", + "find-up": "^5.0.0", + "javascript-stringify": "^2.0.1", + "lodash": "^4.17.21", + "outdent": "^0.8.0" + } + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", + "integrity": "sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==" + }, + "node_modules/@vanilla-extract/recipes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@vanilla-extract/recipes/-/recipes-0.3.0.tgz", + "integrity": "sha512-7wXrgfq1oldKdBfCKen4XmSlDmQR+4o0CQ3WnnLfhQaEtI65xJ774yyQF6dD2CC+hHdW2LFKVXgH5NZRbMQ8Sg==", + "peerDependencies": { + "@vanilla-extract/css": "^1.0.0" + } + }, + "node_modules/@vanilla-extract/vite-plugin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@vanilla-extract/vite-plugin/-/vite-plugin-3.7.1.tgz", + "integrity": "sha512-KFeTSEJKtJDfQhUJh4jGmrJDLCU59DSA3YKZSdys4jTOLZ1ZFsKzDP2pnFwH/24Oc2ebK+EV5x3OPlWxvRYthg==", + "dependencies": { + "@vanilla-extract/integration": "^6.0.2", + "outdent": "^0.8.0", + "postcss": "^8.3.6", + "postcss-load-config": "^3.1.0" + }, + "peerDependencies": { + "vite": "^2.2.3 || ^3.0.0 || ^4.0.3" + } + }, "node_modules/@vitejs/plugin-react": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz", @@ -1478,6 +1638,11 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/ahocorasick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ahocorasick/-/ahocorasick-1.0.2.tgz", + "integrity": "sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1512,7 +1677,6 @@ "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" }, @@ -1645,6 +1809,14 @@ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" }, + "node_modules/await-to-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz", + "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/axe-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", @@ -1736,7 +1908,6 @@ "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1815,10 +1986,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001439", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", - "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", - "dev": true, + "version": "1.0.30001446", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", + "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==", "funding": [ { "type": "opencollective", @@ -1834,7 +2004,6 @@ "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", @@ -1883,11 +2052,15 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "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" } @@ -1895,8 +2068,12 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" }, "node_modules/computed-style": { "version": "0.1.4", @@ -1926,8 +2103,7 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-pure": { "version": "3.26.1", @@ -1962,6 +2138,28 @@ "node": ">= 8" } }, + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -1985,7 +2183,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2004,6 +2201,11 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + }, "node_modules/deepmerge": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", @@ -2040,6 +2242,18 @@ "node": ">=8" } }, + "node_modules/direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dnd-core": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", @@ -2116,8 +2330,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -2125,6 +2338,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/emojibase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/emojibase/-/emojibase-6.1.0.tgz", + "integrity": "sha512-1GkKJPXP6tVkYJHOBSJHoGOr/6uaDxZ9xJ6H7m6PfdGXTmQgbALHLWaVRY4Gi/qf5x/gT/NUXLPuSHYLqtLtrQ==", + "funding": { + "type": "ko-fi", + "url": "https://ko-fi.com/milesjohnson" + } + }, "node_modules/emojibase-data": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-7.0.1.tgz", @@ -2217,7 +2439,6 @@ "version": "0.16.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.9.tgz", "integrity": "sha512-gkH83yHyijMSZcZFs1IWew342eMdFuWXmQo3zkDPTre25LIPBJsXryg02M3u8OpTwCJdBkdaQwqKkDLnAsAeLQ==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -2254,7 +2475,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2263,7 +2483,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -2777,6 +2996,17 @@ "node": ">=0.10.0" } }, + "node_modules/eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "dependencies": { + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2871,6 +3101,24 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, + "node_modules/fbjs/node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2904,7 +3152,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2962,6 +3209,40 @@ "react": "^15.0.2 || ^16.0.0 || ^17.0.0" } }, + "node_modules/focus-trap": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.2.0.tgz", + "integrity": "sha512-v4wY6HDDYvzkBy4735kW5BUEuw6Yz9ABqMYLuTNbzAFPcBOGiGHwwcNVMvUz4G0kgSYh13wa/7TG3XwTeT4O/A==", + "dependencies": { + "tabbable": "^6.0.1" + } + }, + "node_modules/focus-trap-react": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-10.0.2.tgz", + "integrity": "sha512-MnN2cmdgpY7NY74ePOio4kbO5A3ILhrg1g5OGbgIQjcWEv1hhcbh6e98K0a+df88hNbE+4i9r8ji9aQnHou6GA==", + "dependencies": { + "focus-trap": "^7.2.0", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "prop-types": "^15.8.1", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/folds": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/folds/-/folds-1.2.1.tgz", + "integrity": "sha512-BCV5oFCndiGFp1HyeSnbDKmTSbu1yfAtAIF6znPvLthuI/QG4516bBUr6+MyNUQWx/IAkj1bdQL/cdD+jEZWCw==", + "peerDependencies": { + "@vanilla-extract/css": "^1.9.2", + "@vanilla-extract/recipes": "^0.3.0", + "classnames": "^2.3.2", + "react": "^17.0.0", + "react-dom": "^17.0.0" + } + }, "node_modules/formik": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", @@ -3063,7 +3344,6 @@ "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" } @@ -3134,7 +3414,6 @@ "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" } @@ -3207,7 +3486,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -3329,6 +3607,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -3495,6 +3782,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -3624,6 +3916,64 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" + }, + "node_modules/jotai": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.12.0.tgz", + "integrity": "sha512-IhyBmjxU1sE2Ni/MUK7gQAb8QvCM6yd1/K5jtQzgQBmmjCjgfXZkkk1rYlQAIRp2KoQk0Y+yzhm1f5cZ7kegnw==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@babel/core": "*", + "@babel/template": "*", + "jotai-immer": "*", + "jotai-optics": "*", + "jotai-redux": "*", + "jotai-tanstack-query": "*", + "jotai-urql": "*", + "jotai-valtio": "*", + "jotai-xstate": "*", + "jotai-zustand": "*", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/template": { + "optional": true + }, + "jotai-immer": { + "optional": true + }, + "jotai-optics": { + "optional": true + }, + "jotai-redux": { + "optional": true + }, + "jotai-tanstack-query": { + "optional": true + }, + "jotai-urql": { + "optional": true + }, + "jotai-valtio": { + "optional": true + }, + "jotai-xstate": { + "optional": true + }, + "jotai-zustand": { + "optional": true + } + } + }, "node_modules/js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", @@ -3655,7 +4005,6 @@ "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" }, @@ -3676,10 +4025,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -3762,6 +4110,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "engines": { + "node": ">=10" + } + }, "node_modules/line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", @@ -3790,7 +4146,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -3900,6 +4255,14 @@ "events": "^3.2.0" } }, + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "dependencies": { + "@babel/runtime": "^7.12.5" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3955,8 +4318,7 @@ "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.4", @@ -4001,10 +4363,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", - "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", - "dev": true + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4146,11 +4507,15 @@ "node": ">= 0.8.0" } }, + "node_modules/outdent": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4165,7 +4530,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -4209,7 +4573,6 @@ "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" } @@ -4287,6 +4650,34 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4563,6 +4954,14 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -4718,6 +5117,14 @@ "object-assign": "^4.1.1" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, "node_modules/sdp-transform": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", @@ -4730,7 +5137,6 @@ "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" } @@ -4784,6 +5190,42 @@ "node": ">=8" } }, + "node_modules/slate": { + "version": "0.90.0", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.90.0.tgz", + "integrity": "sha512-dv8idv0JjYyHiAJcVKf5yWKPDMTDi+PSZyfjsnquEI8VB5nmTVGjeJab06lc3o69O7aN05ROwO9/OY8mU1IUPA==", + "dependencies": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-react": { + "version": "0.90.0", + "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.90.0.tgz", + "integrity": "sha512-z6pGd6jjU5VazLxlDi6zL3a6yaPBPJ+A2VyIlE/h/rvDywaLYGvk0xcrA9NrK71Dr47HK5ZN2zFEZNleh6wlPA==", + "dependencies": { + "@juggle/resize-observer": "^3.4.0", + "@types/is-hotkey": "^0.1.1", + "@types/lodash": "^4.14.149", + "direction": "^1.0.3", + "is-hotkey": "^0.1.6", + "is-plain-object": "^5.0.0", + "lodash": "^4.17.4", + "scroll-into-view-if-needed": "^2.2.20", + "tiny-invariant": "1.0.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "slate": ">=0.65.3" + } + }, + "node_modules/slate-react/node_modules/is-hotkey": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.1.8.tgz", + "integrity": "sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==" + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -4892,7 +5334,6 @@ "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" }, @@ -4912,12 +5353,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.0.1.tgz", + "integrity": "sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tiny-invariant": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", + "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -4935,7 +5386,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -5055,9 +5505,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "funding": [ { "type": "opencollective", @@ -5104,7 +5554,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5144,9 +5593,9 @@ } }, "node_modules/vite": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.1.tgz", - "integrity": "sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", "dev": true, "dependencies": { "esbuild": "^0.16.3", @@ -5319,11 +5768,18 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index a37b6242..38be28df 100644 --- a/package.json +++ b/package.json @@ -24,14 +24,25 @@ "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tippyjs/react": "4.2.6", + "@vanilla-extract/css": "1.9.3", + "@vanilla-extract/recipes": "0.3.0", + "@vanilla-extract/vite-plugin": "3.7.1", + "await-to-js": "3.0.0", "blurhash": "2.0.4", "browser-encrypt-attachment": "0.3.0", + "classnames": "2.3.2", "dateformat": "5.0.3", + "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", "flux": "4.0.3", + "focus-trap-react": "10.0.2", + "folds": "1.2.1", "formik": "2.2.9", "html-react-parser": "3.0.4", + "immer": "9.0.16", + "is-hotkey": "0.2.0", + "jotai": "1.12.0", "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", @@ -46,8 +57,11 @@ "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "sanitize-html": "2.8.0", + "slate": "0.90.0", + "slate-react": "0.90.0", "tippy.js": "6.3.7", - "twemoji": "14.0.2" + "twemoji": "14.0.2", + "ua-parser-js": "1.0.35" }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "0.2.3", @@ -56,6 +70,7 @@ "@types/node": "18.11.18", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", + "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", "@vitejs/plugin-react": "3.0.0", @@ -71,7 +86,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.0.1", + "vite": "4.0.4", "vite-plugin-static-copy": "0.13.0" } } diff --git a/public/font/Twemoji.Mozilla.v.7.0.woff2 b/public/font/Twemoji.Mozilla.v.7.0.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3b20e9aa3883ab4d49696b074e94533a04b028d GIT binary patch literal 472228 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

    A{1jlFoA)JNTyYH8Bqw6_oi%_SaYNDTv-1u$U) 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 BJBb*1>4gaO=;GR7QlSkI#biw-{_XPvr6AD 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�&3hdf z%x96eCQoIjsq8D!<}dd0Ak*GwQ|Y($I$wo zYlosQ>Xp=;BP}Um9tQi!92LQt@rnp1wP) z`yl+eEw00!xZ_rhy?~oS{D1H1S@x`m&#p$V|XUj!h&7~p^m-vnD zyFW?GC0EtoWGdQQeiQk{L^$Od&ad(gee5-|+L0-l8Yv;}U&FTZQ)0^D!>J;G6=BOp%mj+LvplSx(g>XAbSVM4IB5>6ZK%K{22 z6O^!6lMqrshEX| z$;7E&SZ^`yaOj%sgT(3m?4JuW&x4D&9D|FCyvI(Xj1KQOfV8xL61q=HX+lDYkyIF- zAna~qoJ#GZlTj~~Q!10p&B!n0*`Fqa@~_#<6Fr&j)DN;cM$KONiL+Tr0<5NqypD~t zI}V;bbMV}m9hspifx#ErS?Kd06qq=4&QZv{Jb9 z@=ubI2kvh-|2S{_Jz?rd%>!-auZlbO^rLJOFv_wiIh4$68?Gu=``BS|S_dtMs(3gx)JonZN%Z zDtf=Bdf91{i*<1Tv=M9G^U?i#6VbC66ARFjbu_W1mb$_=0c>ZD>G=Po5vC8MX`P8o z1{poZ?MesW>_^FFdMm0XBw9=?W3xvJGsL|YAURm(EbHqM}sHCQs@4jfTADFwq#`Cjz;BXLst2W`xUoxGaRd~ zX%4e^{QlZ1+}nt$t|Y9LO^)xC%k|~cnPv8L2+(@?PT3y+&Y$oA*pB42MTw3-XJ!s_ z2unRX&Q*BNN*D@)lq$$$xir!hC@MdcHjTLYZ%~Wr4-~0$hl&mLnzgh;;LR4ejkj@X zD>xJpqdK7u)ZmFjHH5OOzcW)t^te#e%I$Mzqmz92VeeC-`|8cRT{CtZ&YbqWzG)b8 zZfIOZ(TMlb%M&$DI;Rr0w*W*mW{XO&DlOgjP_tS^lxc~sW69zo5XRklEV1=w4N)r{37t@eoLgp3gnK*a>^qI(_=2RJ2 z6B+y&aaD_Vs;F&$d}EYy z-yT+~G)TTg@OMnVO23-<`h>?(f)L)Y$2|5^=XQplS3Adcok;?zj)`Lq`3@oU6asj? zb?HhygQukQzE|df^WiCYK4!1|ouGKLF%mmun? z*5IFk^IyFV^=dgqIl4Q$+fnIF1>Q1Vg0$M_lk%m+4&xmznIQFdwdGudVTaZ!-+eFQ zmSBkBla5@lAk9%unI3nMS~C<(N~j!mq}!%xX_~QS8Iezf3;Wy>k0XRyP6@d_7Cy}< zkUP~uOQxB~Y0b0?c*DIjvU(!}ewuJzi$0pr>!`LzdD@tHe0@Et;kOFFt!N2Kcai#+ z?fw?%y3K`DKyp1k4}=sKRrUFo3&SohS%q_3GizL1SUyq_G07IIiV;`Cft2dHsj%ZZ zmBiaFWbSX!JB{?$TuXZ^H^AK&YHBz{uAX{_Y2WU*+dA)Kxn}c1j)9|ZRg=?WS+C`+ zDUmrnMdgu9b;p>uW{Rd3xHM6e-2OpLrb&Z_>qJE+jE7|nVWx$Y!uDG+XA}jXfQXC4 ziMW#ye=h4XLHwFQ5lk2iWQfc)44;X*nAIpkEAN<$)jLI4y~}!*+LKv|XS7=2-U?!f z*WWL+Jl!^U?E^?BiLs&>v$pD*j#q5WkIKcy1Ddi<1^1D$f7U&X{LmM7Z`ZQ5<-D1v zq*1QMcXsZVyC@FxzFa(&%Q!um#8stGYD!q3vPby#38bvXmrBL8Fif^MexpAwEK7Sr zspk9T*T!K59+85vIeH7t!3s6O`MK?KF68fG>Qe-tBNw1Fx#qqylt8!aNRmeJs zVfo_dRMOepqs`xWTei^|m#L)|K0hN5O|dyujdUu@chSflgnKWg=@~-2{qe_}>hf&H zVZda|iYf>-O!9-ZJU9GPTsVD~I-0e_eHfmY*^D%lOw(svdF|nH8PN5gOhf&UrDEp( zE6|TD-1Fq)Bc=CYkV_RaWN?!>AyCqdYw#D1^}0>7F=SSioAqZ^O5mRuM0EX&(52?| zgp7RimZ)NIp!uLtwjZ48r>Npl67pu2EiZu8kaJ#G<~rhaB8syzS1q;f7b@`d53D8o zLoZ#5QMFq`%bPA?TGNTl;L(3bPznG4(QGEl`a!=tY9wyLKLCPX7-%Ym{q*7`+{=wS zv9z_UR!y$ZFD!2`^5;l-p$xR2tx;(zA+@3}2BL?;8?Ub0gd1m%4HEKwVy;JEc(5Sx zMev<5>MLAoxJqYtI?SZM0#Lyf9|7v`2BL}pd!6&J3liCVzdCmS1_R2g2a}M_VXGaL zkZ92gEu57ufx&ryA@2ryo@nt-TdrLr_P!#!Z~?Gp-sIRc?@KkMA%8HnfQhEx@09@3 z`vDtQ&90u~I=Cc|j>$#&4h&4*r=`75sR1hQ1&Rr8Ni{}aE=#ceNU|sE>~DQ%ABb); z3;8#}zc>Xm7PaFJykOItULbaGWTi)_gXeyYDO!N$WH0Jh8 zblGTR4W;90b}OG!YMq%{-QF}(bcPR+oMQ4k-I#8BP7q@g2d#Hp0fDR`($FrcAn5j; zgxl-wby);X-6efudc%t69{d~JLxR6LWX)p*wV&^HSK}MJ&TnQnX$rmk0ZtB056e$J z8DK>w;{nE~&Igv4&x+mTghnS68bTY+90oi5gR_Ce@(>|K6y3wp3y(~yEb8&c(Lo1(+{m9R{A z&x?ru`2gVwq=ZYe1t{BS=$|u#$(#K3v*}tQ^iAH@ZJa!S*f^F_n zvphC^=)&&F37M|9d6sp@Y;Ov}tfaEp@%nel%MSGf&_IY1?PWUU!k!J0Cgd+Pn_u*C zMC7;5?(|UIo?%#oF1u{P)^(a)$Z5j7=092loh9pxstBT z*$>cyTa{N?f7F~NvU$OHlq;1MJf&`$N&!>E&Ag+N*D4t*kGKKANYF$IA2lAUBnobX zCPs4yL1MMVyr2Q=9i{n0BdF>q1&~$%goU*umpp7(F{B{6p*wFhWge`kY-0n_o9R4c z3M-O{skUOb{+vck=UCzwJvrsE=a@p_=0pn;U}m~aoDZ@PwKkf!QDr$FssQK?xRZY`^xK{yp%g2|xJ+B}09 z58Rx=7E}z8{f93D1SIBlSKz1bp@k?2yfc*)x5(R`4b~nY1%({g_Nh#q&}%#G z5Xgo-k575b1T*JWR0#?}bk3o7c0)43O~cB&I2|*J5uMp36cm*kPA8rq$bv#4dTNJ- zW64`Ie^=TO9Z`lV1`wIuxg0YHLnj!?X3PF?(5r_3E`rmfaip{Hwbzn)B_+wbK{9am zC1k5Y(sxpJNa?=K(ss5eaxeOs<$9CcTBLTa+NvS^`%hQWI3=PRU^}@{wvF)eirR{S z+TB=|dyv6hxFwWs9UFQp34`pmYRc5DBI>&v@RY=|HStLcj(VBp!n3#CLbkROogzm5 z^)~54HTMvDwwdZZcbZ!-PJ$$AZ2pqDoiZBVylo!hoR^i*)z<52s2W|BGJGL!Ozm5^j>xARt$ zd~0n^yh-FB5hn=0#leNjx)#lm=^6s;dTz?jevyHoMs6hA6TLFPo`fxujcF5gz&fDD zL|Mm2R(x1k#m{G=KYSN|CIwM9Ks#^ma9omq<9vJCgYz?UFXSJAg{$d_N;A~ z^&OH-*ul-iovYEw<@v#fVVyrqx5gnMw!%Qc^FOl8cLACP3h{S5UZ^|Y(cq#Q~DxM|LSVy)0ucHnHm`3y8m+H=DY@;2=N^tk~L zM!=S}nlK$8HiI8Gx9Gix4VxZTaFrC>B}Wud=Y${U)4 zGDXzXbOA-FV#}jgW4I!qK#QiL1SsCr9(MI;V)!GA-1^bZ+|w8nRdBli0d36l^mqwt z5lbeV`!c~t9L4#2!Jn@PIrk>xm{j;Uv9wa$?xwlZLKuAZyl`N5+|FE8Q0!HriFm_p z)FfZyU&{NrdHAFv69>XC%+9cy2D9pF<1W<@aZp%Nr(_rx4T(-zCgV_=0Rm6(VQEau zaJ_nXnS4|fgmEhNQ+D7JMnC36VhXXKQU>(rwyxEHBb+ zXTL({u~Yb$#;RlEi%^zxPWB1~YZEn{sH)7IDa5k5f3I_yGP$mB&SkOEG)Rq*dPN9~vO z>mU4%#rF~2=l^4Kx3DGNw0v(FzP;;GC*13^ZLJ&j(zXRIfCXxN{R+_B{KZSvSM;3| zzbfz6T#B-ew7;6&y0ky(6qJLSwV_`_R_A7QyqBVGUr!vv%4HH(|BlPiLClWAh zG7P@?;U}E=(F!K~NKX}|uZ0&^5+`bEn2k4+OXCiCxwLUF$lD$_oKYE{jw-SOrO&IY zr|;^CU%Wb-BvjAkkYr9|z1DbT%o!#>WfEf#B^F|FQXW=sCz(wVqzXCzsgmVe|jvSs&wYH&|+z? zRVBz=L5vHox#j|n_5uww!HZZu%X+gNOb$R-j`RM?M~yLuR~JK>P^^sL;_}KIQ6?y+ zPRQM1w;GAo;>LQj9GkD9s#mRd06F3JT=g#G980i81MHIeD^#3z$6@LJg&5uGO7wDe zwkJ_JqR&dISeNsj2qdsBhOK@ZfH#1V-HJwrllTGw`JhoP2VG_2`nva z`bMp;k|i(AqP(O^4cjL1SNs+1fvlgFY-jVGgco-UnVZGTplBFFOz`v z1l*JTFmBL5${#PP!kZQzF2^gCOo?&|z=5lWdiEEe-5RoPTb>Ag-{A>39CerEDISq!-ZoNBSnCSc!1GFa2@pU07pvKOA$)-H9tILjbBAEArDVfLK7$*ls4UG zs|bXQvM$+r=%Lw@fk7vYdej+Eo*oE@sO;-+zHxec#>v8DNx|F<_O03GBa*lk0W!H@ zG#s-Fk%T4>saqoQ*(MVR0Ei+MBj>jF?HmS6K4T?gyRTOHtJ$tG#Kya<+Asr=Jm7ALyYLX)p{mMfLUC9)%xk!+4Z<(C&bB8jJYO5-Qf zPi62KtYn7;`VjjVW(yY-PwdwW6C2lZI02I)IqTyN zIB*s9Txz@-5r?Nn0}4f?YrM%MDyA6qlZbsR)5i@7R8N##uL%tbCh(MO5_gbmc;U=v zB(79|)VSc`ZKBPR7!ESQ1s!xZVWOv_=LL_o{&LRx3%n!W$*l;cU5l_+~ zWfedNW70MKY0?zKQZ8qZGmUgke~mOPAkN#{Sw`#(tvpC)ni6{27jWpKIpc3s4z`FY{s3nKqJ{`5dnl^#fJxGd+w&buyGHuPUe z<+N8R5_X7+;5mOmoT?{yly$w%I4ZHft@SL(qd>W?d6X0NDgO|+8;_x+O|C)1qkRH= zfZ;pNtez}C--0GIu|^fz*3bpR6MB}`537fczDZBbmS=&6L||*bL97`*nrL~xTz=Sb zd@$gH=-Sc&0_lnmkl;Kwn;<K?stnBl z>oQn2M{pGjjYuNvWQah}g2}h45=B!*7iuJ~FFAFim97+7vht*IjHXS;r4^K9VXSs! zNM&JQ?;_D{;J2(AoH9+0uPF!tdouEgCJ(Bu;1&(phjIbe)B2r=P(}V0CA+(bJ(%i4 zAA=4_0;=R^hjKK)(ZwGlD<<0SscD)ELyu^ZFM}?y_mL~?vKk!qwfsTT}BHOtVCDQmQvV4?ubbtV^Yw?e=E*$ zXBtUhn-I6Z<xw2K`lfmMNSP%g(x4g0xVp$XO+hjsUkf7App26xPY|@Y(c!3u zE>w-nUj9B?VUpQXEV)?GO3w&QU#?AFk3t!J(r;NoFBU{T7fcaJYh*N#J*}K|B%%X26yu0|VKEzmDL$8*7H=mSRO8#5NC>{rrWOec+ z?HUSQ4cW4{vZ_&` zgOQ`s8*Z2$=sX)Ih2Drl`gpnM-PD}0W1>LF$#58aVRO~u%}F{i9E5NK1defkBBc-# zQnCyd5P714pB?#z-un-0kNf2;a0#!M%T zkj~Y($IBMRmw)01& za(q&XqR|Jp{U_-e4tup9+H$Q9GLGP!rH#mI`rr2{D^}1u z)8vb$l?;3)!8E`Zh#10BihesrYhESTbu|bC10iL)5u~LQFwh~i>#|tI^vjb^{Jd;5 z=~sJ;2gtc}bm7-iRvxNtNdI3-$_lwSz1>+!zm5^bIrhpHU#zh1h=LybE^CGL6?=vK z9gOalf?~U#XA&UxEhaxCsw08~RE66d2q@5wG@4Gfq9q{;0xG1i4|>Tlk~)TW?V?Zo z(L84 za@}-Mfd@Wd&_A`miK`{V_UkU@2P9ljrf!{aHF-Wc^3&Rihir)rkC@X3s~VzHU?V)5 zeo*w9*Z@Bh#{*UdVCHaD^FT`2td2gAb&5yClyt4}H#k zgrJS@=|-R@E+mH%$G7vTqelZ8fvZ|}L}3y@I;L}b!ZcRl-XRd=Q98;x!XIHM^JGyF z??VU4|I#ED({ecMg)ghqb49#VFtKaL#w%WI4U@N0T9p>=^lHNt@g-qGs&bJ^Ir@6U z!0XoK>C^O?c2l!%TKY`GncflCM=Mp~%2X5QC@>W{I$_R$)$LP`iG*r#XI_4I?dY`I zX@{?AafNtJQJOHaY>wfCH6d+|?Ebl2D%KPv<9{4>3tr~#>u<@C|2jd#9vs}yg!y0x zh($wBRmie*)(3zq?^pWw;n4|jr8d#$#_ABr++FAhW+y~2j}lUkjOP1a7Hp}t7ItWO z^*&?^4vYnnxNc!#=0esWDn%NG?<+Z^wn68S-9)DhtGPH;j-xMiWb{UqBawerQX2u3 zp<({%M~h`}h85NnD;9Kd_#bWEA@eMb;pD;oQO+;Q27eM#ETZ?BTUCV+Uocp}4g~0e zU3>SFptW@?qQ!b2igNV&S`Z2SK2-A%1+ZYz5ZoG6n6&%>v^YSXF#+sjj-*Y@ZxT{n zOlg%R2kmw+XY&_9q14AZ3+=U7hz<`_A7uX1e)KO#KknM~@#qKi3r|~Nh7|cif~XHZ z@Cmh@Wf^uz-{Mc)nlgAXf6-Ux4tn}R@DnJ|<}v)Ig`Rbw9Qo&-N?TtrhMqN6K#JAr zM0|2l0X$YAr!HN8sB3_e(}AA)jL&7ml&Xb9I#Gz|W{4FJ&1s)_oG7ReQQoDJOQV+I zSDa3fFAMBZeSMC|Kqm!Jk0mc~9I0sbvXY9XmTaSUcGpH8W(ukVR0J%SV`BMz=kNC9 z8Qz{*sM!PT%v+x?JWgaLPoK;vW(xF575FoH@z&p3O9)b-7ms1GeDK2h{=$$$ad)Wi zL(oS|)hDY{95*V^7e}k+JT+$DNT3S(Kudh^T|wqz|Nk~3?r1d3NDR!|yFST99KIvx$G~c4)3!F(G4p>zMoD2j%;T$-WejJY&1Sz|` zm!?-986G5pRCCxlF#o?G_{f@byJX+mtLum3g$l$%4in$|(U1EK(WzhExc1ne16=8F zx&H~v$&zuAQH!zFQ%+PI! z#=ct1>`OV27our;InB`95ps9qOq{zb$0G_I3}=(>)?7``d8@ix!+bF&uR~W;JKQ+F zqH6KCujQoQ^IuC;EXo-=qJ3a(jaCSoDI5PhyP@b^IZE|l1uU$jCK}022rB_CF3>xv zS%=Ee6>LRdK$Ui_;t>V{QR4quQmmonONCoEI7*zb%7CqL$0Xngtj0{>i4aEiK;SJI0^EXUHlg4Qn3 zrS;zXFz8t3y--NM9D77fphOK+BpX4VES4?hlZ8SXH4p1<7zQ{f$NU54o31pk72PJJS>=h#p$w|rJq5zrNDApgv(`-DcKe-Vg z4gDKH{HFyUx@6%u>hB>Q)6wGqK=E%S_bI^#L-YqmQ^Gw1=ala$i084hez)8In1!W} z!b^=0T0`K}MGVD7*RQ^K$yfAj8K3i@TtKr)OyI=yEZ+r4XGbsTn0M8w>CA^50i2P| z;`E1C($_+ATKZzu+Vm@*oL4Y<{X=H@)LRL6m@6_cq5Z32nfN#v8rI1aD?mg~WoWTM zt_M>ed@^SOi#%<74^e*w3)<68w|fys{KVq~D^b0{w9H?Wx_0;9CsBiYQGN~%Fq<<6 zvIa8USwK!(tt1`mt2-k&iF{>-ZV{S+=vZQDEBvSI5~Nc(+O+1 zv)A=?Jy`@BRw0xxW*_wy%9Z;?Sh^>R9V)MbIXA;Fr@zJgb{Z3NqX9B3LfOeHG1&W% z&SdXI}et#!y#Sf-kCh zi(vp7h-(PZfE-kumD=={nKhAdP|g*kVy|kKB8ZJuzD7kQ4SJr?$d%y`VN`Rux2lw& z`2&%0>0V*(RpL{~)W^2)%YfP`SkSVl3MmxGMBEZDj~Cu ztX4Q<$=-l#ju;8VoRG_xt*$63N*PfrbI}sLk*Eqe8p#K$S<9B^#plZ02>Va(`wLt9 zU{H0!8{6}L@pyM7{g^R|pRs3^uq<*BSx%m^ExYB@ol2IaWeHU`+kQ$J)&1OIh02;^ z3#sl0;Rm+fk&A=w6y5ZJS9&$|{ZEP40&SM9>Gs0uH`c`PM|v>G=M0&taz-T->++~U zu~KkHx(K9bafG}fnjp|4np}o6Q_604$<+J-tw9$NaRr)v+J9F?<)4T$=)Uu+TZew= zM2?@YijoOTV9WrmU2&(^9tGdt;Rzy}*3x(0w3J>*!6~ADv*b4~W+3a&uX6SmPW#jq zx?4u~^V+G%1M!NrLE+zkQp_!Y*HqHp`=a1lbVBmUV-mb%h`NI#0k<&{LrLV=gC87{ zYeKxSS0PnX8cxzv4KQ8yP!Ld^OtLTT6$RJKO&XV_xK}>VQ^!4)%o)ux>kNV!w0XyW zbt%*Tb!aVuM;LUnps%+WU(*yaT~bw+WmjgNQpmKX8iuAp>^X;nQrU;&H{unS{BkgI z*zuUYR17au&;;7P2XruS+3 zW-9z9yY#I4d)*(uH2c@W;(^k@V&^oo5Q{Ry(Qb8yJ$Kw4a{JH96h0r@-tjw3blA%t z&W)G)d8GDCa?;;47NbjFEf;|>Y5&O1fTw%y`qCfUG4Uf?O@R82XI2)$>4@t7F>YGb zj?dlQ!QC#G^S0w0a$^f;9jU7m8?_KsX3_M0l3ML^!d%t3&`yDL&R3kfKSWzkSaEfz zV|N|7)K+&JXI+bZ;a@Qw7PUAl1_yh4bA!Eu-NLC`XYh?5%%>e0z-l`=IlHcX-7Jg; zafuK_J{iGCN#PNyVK_qYq^F1lkq@};C4wc

    + } + sidebar={ + + {emojiTab && recentEmojis.length > 0 && ( + + )} + {imagePacks.length > 0 && ( + + )} + {emojiTab && ( + + )} + + } + footer={ + emojiTab ? ( +
    + + 😃 + + + :smiley: + +
    + ) : ( + imagePacks.length > 0 && ( +
    + + :smiley: + +
    + ) + ) + } + > + + + + {result && ( + + )} + {emojiTab && recentEmojis.length > 0 && ( + + )} + {emojiTab && } + {stickerTab && } + {emojiTab && } + + + + + + ); +} diff --git a/src/app/components/emoji-board/index.ts b/src/app/components/emoji-board/index.ts new file mode 100644 index 00000000..430cec07 --- /dev/null +++ b/src/app/components/emoji-board/index.ts @@ -0,0 +1 @@ +export * from './EmojiBoard'; diff --git a/src/app/components/emoji-board/useEmojiGroupIcons.ts b/src/app/components/emoji-board/useEmojiGroupIcons.ts new file mode 100644 index 00000000..bef73741 --- /dev/null +++ b/src/app/components/emoji-board/useEmojiGroupIcons.ts @@ -0,0 +1,21 @@ +import { useMemo } from 'react'; +import { IconSrc, Icons } from 'folds'; + +import { EmojiGroupId } from '../../plugins/emoji'; + +export type IEmojiGroupIcons = Record; + +export const useEmojiGroupIcons = (): IEmojiGroupIcons => + useMemo( + () => ({ + [EmojiGroupId.People]: Icons.Smile, + [EmojiGroupId.Nature]: Icons.Leaf, + [EmojiGroupId.Food]: Icons.Cup, + [EmojiGroupId.Activity]: Icons.Ball, + [EmojiGroupId.Travel]: Icons.Photo, + [EmojiGroupId.Object]: Icons.Bulb, + [EmojiGroupId.Symbol]: Icons.Peace, + [EmojiGroupId.Flag]: Icons.Flag, + }), + [] + ); diff --git a/src/app/components/emoji-board/useEmojiGroupLabels.ts b/src/app/components/emoji-board/useEmojiGroupLabels.ts new file mode 100644 index 00000000..a1e5cf2c --- /dev/null +++ b/src/app/components/emoji-board/useEmojiGroupLabels.ts @@ -0,0 +1,19 @@ +import { useMemo } from 'react'; +import { EmojiGroupId } from '../../plugins/emoji'; + +export type IEmojiGroupLabels = Record; + +export const useEmojiGroupLabels = (): IEmojiGroupLabels => + useMemo( + () => ({ + [EmojiGroupId.People]: 'Smileys & People', + [EmojiGroupId.Nature]: 'Animals & Nature', + [EmojiGroupId.Food]: 'Food & Drinks', + [EmojiGroupId.Activity]: 'Activity', + [EmojiGroupId.Travel]: 'Travel & Places', + [EmojiGroupId.Object]: 'Objects', + [EmojiGroupId.Symbol]: 'Symbols', + [EmojiGroupId.Flag]: 'Flags', + }), + [] + ); diff --git a/src/app/components/sidebar/Sidebar.css.ts b/src/app/components/sidebar/Sidebar.css.ts new file mode 100644 index 00000000..e62ed6f5 --- /dev/null +++ b/src/app/components/sidebar/Sidebar.css.ts @@ -0,0 +1,111 @@ +import { style } from '@vanilla-extract/css'; +import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; +import { color, config, DefaultReset, toRem } from 'folds'; + +export const Sidebar = style([ + DefaultReset, + { + width: toRem(66), + backgroundColor: color.Background.Container, + borderRight: `${config.borderWidth.B300} solid ${color.Background.ContainerLine}`, + + display: 'flex', + flexDirection: 'column', + color: color.Background.OnContainer, + }, +]); + +export const SidebarStack = style([ + DefaultReset, + { + width: '100%', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + gap: config.space.S300, + padding: `${config.space.S300} 0`, + }, +]); + +const PUSH_X = 2; +export const SidebarAvatarBox = recipe({ + base: [ + DefaultReset, + { + display: 'flex', + alignItems: 'center', + position: 'relative', + transition: 'transform 200ms cubic-bezier(0, 0.8, 0.67, 0.97)', + + selectors: { + '&:hover': { + transform: `translateX(${toRem(PUSH_X)})`, + }, + '&::before': { + content: '', + display: 'none', + position: 'absolute', + left: toRem(-11.5 - PUSH_X), + width: toRem(3 + PUSH_X), + height: toRem(16), + borderRadius: `0 ${toRem(4)} ${toRem(4)} 0`, + background: 'CurrentColor', + transition: 'height 200ms linear', + }, + '&:hover::before': { + display: 'block', + width: toRem(3), + }, + }, + }, + ], + variants: { + active: { + true: { + selectors: { + '&::before': { + display: 'block', + height: toRem(24), + }, + '&:hover::before': { + width: toRem(3 + PUSH_X), + }, + }, + }, + }, + }, +}); + +export type SidebarAvatarBoxVariants = RecipeVariants; + +export const SidebarBadgeBox = recipe({ + base: [ + DefaultReset, + { + position: 'absolute', + zIndex: 1, + }, + ], + variants: { + hasCount: { + true: { + top: toRem(-6), + right: toRem(-6), + }, + false: { + top: toRem(-2), + right: toRem(-2), + }, + }, + }, + defaultVariants: { + hasCount: false, + }, +}); + +export type SidebarBadgeBoxVariants = RecipeVariants; + +export const SidebarBadgeOutline = style({ + boxShadow: `0 0 0 ${config.borderWidth.B500} ${color.Background.Container}`, +}); diff --git a/src/app/components/sidebar/Sidebar.tsx b/src/app/components/sidebar/Sidebar.tsx new file mode 100644 index 00000000..7caf1b21 --- /dev/null +++ b/src/app/components/sidebar/Sidebar.tsx @@ -0,0 +1,8 @@ +import classNames from 'classnames'; +import { as } from 'folds'; +import React from 'react'; +import * as css from './Sidebar.css'; + +export const Sidebar = as<'div'>(({ as: AsSidebar = 'div', className, ...props }, ref) => ( + +)); diff --git a/src/app/components/sidebar/SidebarAvatar.tsx b/src/app/components/sidebar/SidebarAvatar.tsx new file mode 100644 index 00000000..86665f7e --- /dev/null +++ b/src/app/components/sidebar/SidebarAvatar.tsx @@ -0,0 +1,75 @@ +import classNames from 'classnames'; +import { as, Avatar, Box, color, config, Text, Tooltip, TooltipProvider } from 'folds'; +import React, { forwardRef, MouseEventHandler, ReactNode } from 'react'; +import * as css from './Sidebar.css'; + +const SidebarAvatarBox = as<'div', css.SidebarAvatarBoxVariants>( + ({ as: AsSidebarAvatarBox = 'div', className, active, ...props }, ref) => ( + + ) +); + +export const SidebarAvatar = forwardRef< + HTMLDivElement, + css.SidebarAvatarBoxVariants & + css.SidebarBadgeBoxVariants & { + outlined?: boolean; + avatarChildren: ReactNode; + tooltip: ReactNode | string; + notificationBadge?: (badgeClassName: string) => ReactNode; + onClick?: MouseEventHandler; + onContextMenu?: MouseEventHandler; + } +>( + ( + { + active, + hasCount, + outlined, + avatarChildren, + tooltip, + notificationBadge, + onClick, + onContextMenu, + }, + ref + ) => ( + + + {tooltip} + + } + > + {(avRef) => ( + + {avatarChildren} + + )} + + {notificationBadge && ( + + {notificationBadge(css.SidebarBadgeOutline)} + + )} + + ) +); diff --git a/src/app/components/sidebar/SidebarContent.tsx b/src/app/components/sidebar/SidebarContent.tsx new file mode 100644 index 00000000..4f405871 --- /dev/null +++ b/src/app/components/sidebar/SidebarContent.tsx @@ -0,0 +1,21 @@ +import React, { ReactNode } from 'react'; +import { Box, Scroll } from 'folds'; + +type SidebarContentProps = { + scrollable: ReactNode; + sticky: ReactNode; +}; +export function SidebarContent({ scrollable, sticky }: SidebarContentProps) { + return ( + <> + + + {scrollable} + + + + {sticky} + + + ); +} diff --git a/src/app/components/sidebar/SidebarStack.tsx b/src/app/components/sidebar/SidebarStack.tsx new file mode 100644 index 00000000..c0e976c8 --- /dev/null +++ b/src/app/components/sidebar/SidebarStack.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import classNames from 'classnames'; +import { as } from 'folds'; +import * as css from './Sidebar.css'; + +export const SidebarStack = as<'div'>( + ({ as: AsSidebarStack = 'div', className, ...props }, ref) => ( + + ) +); diff --git a/src/app/components/sidebar/SidebarStackSeparator.tsx b/src/app/components/sidebar/SidebarStackSeparator.tsx new file mode 100644 index 00000000..110341ca --- /dev/null +++ b/src/app/components/sidebar/SidebarStackSeparator.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Line, toRem } from 'folds'; + +export function SidebarStackSeparator() { + return ( + + ); +} diff --git a/src/app/components/sidebar/index.ts b/src/app/components/sidebar/index.ts new file mode 100644 index 00000000..f744628e --- /dev/null +++ b/src/app/components/sidebar/index.ts @@ -0,0 +1,5 @@ +export * from './Sidebar'; +export * from './SidebarAvatar'; +export * from './SidebarContent'; +export * from './SidebarStack'; +export * from './SidebarStackSeparator'; diff --git a/src/app/components/upload-board/UploadBoard.css.ts b/src/app/components/upload-board/UploadBoard.css.ts new file mode 100644 index 00000000..80c1b264 --- /dev/null +++ b/src/app/components/upload-board/UploadBoard.css.ts @@ -0,0 +1,46 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, color, config, toRem } from 'folds'; + +export const UploadBoardBase = style([ + DefaultReset, + { + position: 'relative', + pointerEvents: 'none', + }, +]); + +export const UploadBoardContainer = style([ + DefaultReset, + { + position: 'absolute', + bottom: config.space.S200, + left: 0, + right: 0, + zIndex: config.zIndex.Max, + }, +]); + +export const UploadBoard = style({ + maxWidth: toRem(400), + width: '100%', + maxHeight: toRem(450), + height: '100%', + backgroundColor: color.Surface.Container, + color: color.Surface.OnContainer, + borderRadius: config.radii.R400, + boxShadow: config.shadow.E200, + border: `${config.borderWidth.B300} solid ${color.Surface.ContainerLine}`, + overflow: 'hidden', + pointerEvents: 'all', +}); + +export const UploadBoardHeaderContent = style({ + height: '100%', + padding: `0 ${config.space.S200}`, +}); + +export const UploadBoardContent = style({ + padding: config.space.S200, + paddingBottom: 0, + paddingRight: 0, +}); diff --git a/src/app/components/upload-board/UploadBoard.tsx b/src/app/components/upload-board/UploadBoard.tsx new file mode 100644 index 00000000..42f3899f --- /dev/null +++ b/src/app/components/upload-board/UploadBoard.tsx @@ -0,0 +1,145 @@ +import React, { MutableRefObject, ReactNode, useImperativeHandle, useRef } from 'react'; +import { Badge, Box, Chip, Header, Icon, Icons, Spinner, Text, as, percent } from 'folds'; +import classNames from 'classnames'; +import { useAtomValue } from 'jotai'; + +import * as css from './UploadBoard.css'; +import { TUploadFamilyObserverAtom, Upload, UploadStatus, UploadSuccess } from '../../state/upload'; + +type UploadBoardProps = { + header: ReactNode; +}; +export const UploadBoard = as<'div', UploadBoardProps>(({ header, children, ...props }, ref) => ( + + + + + {children} + + + {header} + + + + +)); + +export type UploadBoardImperativeHandlers = { handleSend: () => Promise }; + +type UploadBoardHeaderProps = { + open: boolean; + onToggle: () => void; + uploadFamilyObserverAtom: TUploadFamilyObserverAtom; + onCancel: (uploads: Upload[]) => void; + onSend: (uploads: UploadSuccess[]) => Promise; + imperativeHandlerRef: MutableRefObject; +}; + +export function UploadBoardHeader({ + open, + onToggle, + uploadFamilyObserverAtom, + onCancel, + onSend, + imperativeHandlerRef, +}: UploadBoardHeaderProps) { + const sendingRef = useRef(false); + const uploads = useAtomValue(uploadFamilyObserverAtom); + + const isSuccess = uploads.every((upload) => upload.status === UploadStatus.Success); + const isError = uploads.some((upload) => upload.status === UploadStatus.Error); + const progress = uploads.reduce( + (acc, upload) => { + acc.total += upload.file.size; + if (upload.status === UploadStatus.Loading) { + acc.loaded += upload.progress.loaded; + } + if (upload.status === UploadStatus.Success) { + acc.loaded += upload.file.size; + } + return acc; + }, + { loaded: 0, total: 0 } + ); + + const handleSend = async () => { + if (sendingRef.current) return; + sendingRef.current = true; + await onSend( + uploads.filter((upload) => upload.status === UploadStatus.Success) as UploadSuccess[] + ); + sendingRef.current = false; + }; + + useImperativeHandle(imperativeHandlerRef, () => ({ + handleSend, + })); + const handleCancel = () => onCancel(uploads); + + return ( +
    + + + Files + + + {isSuccess && ( + } + > + Send + + )} + {isError && !open && ( + + Upload Failed + + )} + {!isSuccess && !isError && !open && ( + <> + + {Math.round(percent(0, progress.total, progress.loaded))}% + + + + )} + {!isSuccess && open && ( + } + > + {uploads.length === 1 ? 'Remove' : 'Remove All'} + + )} + +
    + ); +} + +export const UploadBoardContent = as<'div'>(({ className, children, ...props }, ref) => ( + + {children} + +)); diff --git a/src/app/components/upload-board/index.ts b/src/app/components/upload-board/index.ts new file mode 100644 index 00000000..24ae780c --- /dev/null +++ b/src/app/components/upload-board/index.ts @@ -0,0 +1 @@ +export * from './UploadBoard'; diff --git a/src/app/components/upload-card/UploadCard.css.ts b/src/app/components/upload-card/UploadCard.css.ts new file mode 100644 index 00000000..20ac00e3 --- /dev/null +++ b/src/app/components/upload-card/UploadCard.css.ts @@ -0,0 +1,24 @@ +import { style } from '@vanilla-extract/css'; +import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { RadiiVariant, color, config } from 'folds'; + +export const UploadCard = recipe({ + base: { + padding: config.space.S300, + backgroundColor: color.SurfaceVariant.Container, + color: color.SurfaceVariant.OnContainer, + }, + variants: { + radii: RadiiVariant, + }, + defaultVariants: { + radii: '400', + }, +}); + +export type UploadCardVariant = RecipeVariants; + +export const UploadCardError = style({ + padding: `0 ${config.space.S100}`, + color: color.Critical.Main, +}); diff --git a/src/app/components/upload-card/UploadCard.tsx b/src/app/components/upload-card/UploadCard.tsx new file mode 100644 index 00000000..ae7b71b8 --- /dev/null +++ b/src/app/components/upload-card/UploadCard.tsx @@ -0,0 +1,63 @@ +import { Badge, Box, Icon, Icons, ProgressBar, Text, percent } from 'folds'; +import React, { ReactNode, forwardRef } from 'react'; + +import * as css from './UploadCard.css'; +import { bytesToSize } from '../../utils/common'; + +type UploadCardProps = { + before?: ReactNode; + children: ReactNode; + after?: ReactNode; + bottom?: ReactNode; +}; + +export const UploadCard = forwardRef( + ({ before, after, children, bottom, radii }, ref) => ( + + + {before} + + {children} + + {after} + + {bottom} + + ) +); + +type UploadCardProgressProps = { + sentBytes: number; + totalBytes: number; +}; + +export function UploadCardProgress({ sentBytes, totalBytes }: UploadCardProgressProps) { + return ( + + + + + {`${Math.round(percent(0, totalBytes, sentBytes))}%`} + + + + {bytesToSize(sentBytes)} / {bytesToSize(totalBytes)} + + + + + ); +} + +type UploadCardErrorProps = { + children: ReactNode; +}; + +export function UploadCardError({ children }: UploadCardErrorProps) { + return ( + + + {children} + + ); +} diff --git a/src/app/components/upload-card/UploadCardRenderer.tsx b/src/app/components/upload-card/UploadCardRenderer.tsx new file mode 100644 index 00000000..949f5d64 --- /dev/null +++ b/src/app/components/upload-card/UploadCardRenderer.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { Chip, Icon, IconButton, Icons, Text, color } from 'folds'; +import { UploadCard, UploadCardError, UploadCardProgress } from './UploadCard'; +import { TUploadAtom, UploadStatus, useBindUploadAtom } from '../../state/upload'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { TUploadContent } from '../../utils/matrix'; +import { getFileTypeIcon } from '../../utils/common'; + +type UploadCardRendererProps = { + file: TUploadContent; + isEncrypted?: boolean; + uploadAtom: TUploadAtom; + onRemove: (file: TUploadContent) => void; +}; +export function UploadCardRenderer({ + file, + isEncrypted, + uploadAtom, + onRemove, +}: UploadCardRendererProps) { + const mx = useMatrixClient(); + const { upload, startUpload, cancelUpload } = useBindUploadAtom( + mx, + file, + uploadAtom, + isEncrypted + ); + + if (upload.status === UploadStatus.Idle) startUpload(); + + const removeUpload = () => { + cancelUpload(); + onRemove(file); + }; + + return ( + } + after={ + <> + {upload.status === UploadStatus.Error && ( + + Retry + + )} + + + + + } + bottom={ + <> + {upload.status === UploadStatus.Idle && ( + + )} + {upload.status === UploadStatus.Loading && ( + + )} + {upload.status === UploadStatus.Error && ( + + {upload.error.message} + + )} + + } + > + + {file.name} + + {upload.status === UploadStatus.Success && ( + + )} + + ); +} diff --git a/src/app/components/upload-card/index.ts b/src/app/components/upload-card/index.ts new file mode 100644 index 00000000..3e7a5e39 --- /dev/null +++ b/src/app/components/upload-card/index.ts @@ -0,0 +1,2 @@ +export * from './UploadCard'; +export * from './UploadCardRenderer'; diff --git a/src/app/hooks/useAlive.ts b/src/app/hooks/useAlive.ts new file mode 100644 index 00000000..0bfbce8d --- /dev/null +++ b/src/app/hooks/useAlive.ts @@ -0,0 +1,15 @@ +import { useCallback, useEffect, useRef } from 'react'; + +export const useAlive = (): (() => boolean) => { + const aliveRef = useRef(true); + + useEffect(() => { + aliveRef.current = true; + return () => { + aliveRef.current = false; + }; + }, []); + + const alive = useCallback(() => aliveRef.current, []); + return alive; +}; diff --git a/src/app/hooks/useAsyncCallback.ts b/src/app/hooks/useAsyncCallback.ts new file mode 100644 index 00000000..18b63ecc --- /dev/null +++ b/src/app/hooks/useAsyncCallback.ts @@ -0,0 +1,70 @@ +import { useCallback, useState } from 'react'; +import { useAlive } from './useAlive'; + +export enum AsyncStatus { + Idle = 'idle', + Loading = 'loading', + Success = 'success', + Error = 'error', +} + +export type AsyncIdle = { + status: AsyncStatus.Idle; +}; + +export type AsyncLoading = { + status: AsyncStatus.Loading; +}; + +export type AsyncSuccess = { + status: AsyncStatus.Success; + data: T; +}; + +export type AsyncError = { + status: AsyncStatus.Error; + error: unknown; +}; + +export type AsyncState = AsyncIdle | AsyncLoading | AsyncSuccess | AsyncError; + +export type AsyncCallback = (...args: TArgs) => Promise; + +export const useAsyncCallback = ( + asyncCallback: AsyncCallback +): [AsyncState, AsyncCallback] => { + const [state, setState] = useState>({ + status: AsyncStatus.Idle, + }); + const alive = useAlive(); + + const callback: AsyncCallback = useCallback( + async (...args) => { + setState({ + status: AsyncStatus.Loading, + }); + + try { + const data = await asyncCallback(...args); + if (alive()) { + setState({ + status: AsyncStatus.Success, + data, + }); + } + return data; + } catch (e) { + if (alive()) { + setState({ + status: AsyncStatus.Error, + error: e, + }); + } + throw e; + } + }, + [asyncCallback, alive] + ); + + return [state, callback]; +}; diff --git a/src/app/hooks/useAsyncSearch.ts b/src/app/hooks/useAsyncSearch.ts new file mode 100644 index 00000000..b083a19a --- /dev/null +++ b/src/app/hooks/useAsyncSearch.ts @@ -0,0 +1,81 @@ +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { + MatchHandler, + AsyncSearch, + AsyncSearchHandler, + AsyncSearchOption, + MatchQueryOption, + NormalizeOption, + normalize, + matchQuery, + ResultHandler, +} from '../utils/AsyncSearch'; + +export type UseAsyncSearchOptions = AsyncSearchOption & { + matchOptions?: MatchQueryOption; + normalizeOptions?: NormalizeOption; +}; + +export type SearchItemStrGetter = ( + searchItem: TSearchItem +) => string | string[]; + +export type UseAsyncSearchResult = { + query: string; + items: TSearchItem[]; +}; + +export const useAsyncSearch = ( + list: TSearchItem[], + getItemStr: SearchItemStrGetter, + options?: UseAsyncSearchOptions +): [UseAsyncSearchResult | undefined, AsyncSearchHandler] => { + const [result, setResult] = useState>(); + + const [searchCallback, terminateSearch] = useMemo(() => { + setResult(undefined); + + const handleMatch: MatchHandler = (item, query) => { + const itemStr = getItemStr(item); + if (Array.isArray(itemStr)) + return !!itemStr.find((i) => + matchQuery(normalize(i, options?.normalizeOptions), query, options?.matchOptions) + ); + return matchQuery( + normalize(itemStr, options?.normalizeOptions), + query, + options?.matchOptions + ); + }; + + const handleResult: ResultHandler = (results, query) => + setResult({ + query, + items: results, + }); + + return AsyncSearch(list, handleMatch, handleResult, options); + }, [list, options, getItemStr]); + + const searchHandler: AsyncSearchHandler = useCallback( + (query) => { + const normalizedQuery = normalize(query, options?.normalizeOptions); + if (!normalizedQuery) { + setResult(undefined); + return; + } + searchCallback(normalizedQuery); + }, + [searchCallback, options?.normalizeOptions] + ); + + useEffect( + () => () => { + // terminate any ongoing search request on unmount. + terminateSearch(); + }, + [terminateSearch] + ); + + return [result, searchHandler]; +}; diff --git a/src/app/hooks/useDebounce.ts b/src/app/hooks/useDebounce.ts new file mode 100644 index 00000000..5f33976a --- /dev/null +++ b/src/app/hooks/useDebounce.ts @@ -0,0 +1,34 @@ +import { useCallback, useRef } from 'react'; + +export interface DebounceOptions { + wait?: number; + immediate?: boolean; +} +export type DebounceCallback = (...args: T) => void; + +export function useDebounce( + callback: DebounceCallback, + options?: DebounceOptions +): DebounceCallback { + const timeoutIdRef = useRef(); + const { wait, immediate } = options ?? {}; + + const debounceCallback = useCallback( + (...cbArgs: T) => { + if (timeoutIdRef.current) { + clearTimeout(timeoutIdRef.current); + timeoutIdRef.current = undefined; + } else if (immediate) { + callback(...cbArgs); + } + + timeoutIdRef.current = window.setTimeout(() => { + callback(...cbArgs); + timeoutIdRef.current = undefined; + }, wait); + }, + [callback, wait, immediate] + ); + + return debounceCallback; +} diff --git a/src/app/hooks/useFileDrop.ts b/src/app/hooks/useFileDrop.ts new file mode 100644 index 00000000..bead203f --- /dev/null +++ b/src/app/hooks/useFileDrop.ts @@ -0,0 +1,66 @@ +import { useCallback, DragEventHandler, RefObject, useState, useEffect, useRef } from 'react'; +import { getDataTransferFiles } from '../utils/dom'; + +export const useFileDropHandler = (onDrop: (file: File[]) => void): DragEventHandler => + useCallback( + (evt) => { + const files = getDataTransferFiles(evt.dataTransfer); + if (files) onDrop(files); + }, + [onDrop] + ); + +export const useFileDropZone = ( + zoneRef: RefObject, + onDrop: (file: File[]) => void +): boolean => { + const dragStateRef = useRef<'start' | 'leave' | 'over'>(); + const [active, setActive] = useState(false); + + useEffect(() => { + const target = zoneRef.current; + const handleDrop = (evt: DragEvent) => { + evt.preventDefault(); + dragStateRef.current = undefined; + setActive(false); + if (!evt.dataTransfer) return; + const files = getDataTransferFiles(evt.dataTransfer); + if (files) onDrop(files); + }; + + target?.addEventListener('drop', handleDrop); + return () => { + target?.removeEventListener('drop', handleDrop); + }; + }, [zoneRef, onDrop]); + + useEffect(() => { + const target = zoneRef.current; + const handleDragEnter = (evt: DragEvent) => { + if (evt.dataTransfer?.types.includes('Files')) { + dragStateRef.current = 'start'; + setActive(true); + } + }; + const handleDragLeave = () => { + if (dragStateRef.current !== 'over') return; + dragStateRef.current = 'leave'; + setActive(false); + }; + const handleDragOver = (evt: DragEvent) => { + evt.preventDefault(); + dragStateRef.current = 'over'; + }; + + target?.addEventListener('dragenter', handleDragEnter); + target?.addEventListener('dragleave', handleDragLeave); + target?.addEventListener('dragover', handleDragOver); + return () => { + target?.removeEventListener('dragenter', handleDragEnter); + target?.removeEventListener('dragleave', handleDragLeave); + target?.removeEventListener('dragover', handleDragOver); + }; + }, [zoneRef]); + + return active; +}; diff --git a/src/app/hooks/useFilePasteHandler.ts b/src/app/hooks/useFilePasteHandler.ts new file mode 100644 index 00000000..0f63b750 --- /dev/null +++ b/src/app/hooks/useFilePasteHandler.ts @@ -0,0 +1,11 @@ +import { useCallback, ClipboardEventHandler } from 'react'; +import { getDataTransferFiles } from '../utils/dom'; + +export const useFilePasteHandler = (onPaste: (file: File[]) => void): ClipboardEventHandler => + useCallback( + (evt) => { + const files = getDataTransferFiles(evt.clipboardData); + if (files) onPaste(files); + }, + [onPaste] + ); diff --git a/src/app/hooks/useFilePicker.ts b/src/app/hooks/useFilePicker.ts new file mode 100644 index 00000000..e772d660 --- /dev/null +++ b/src/app/hooks/useFilePicker.ts @@ -0,0 +1,15 @@ +import { useCallback } from 'react'; +import { selectFile } from '../utils/dom'; + +export const useFilePicker = ( + onSelect: (file: M extends true ? File[] : File) => void, + multiple?: M +) => + useCallback( + async (accept: string) => { + const file = await selectFile(accept, multiple); + if (!file) return; + onSelect(file); + }, + [multiple, onSelect] + ); diff --git a/src/app/hooks/useForceUpdate.ts b/src/app/hooks/useForceUpdate.ts new file mode 100644 index 00000000..0691aa92 --- /dev/null +++ b/src/app/hooks/useForceUpdate.ts @@ -0,0 +1,9 @@ +import { useReducer } from 'react'; + +const reducer = (prevCount: number): number => prevCount + 1; + +export const useForceUpdate = (): [number, () => void] => { + const [state, dispatch] = useReducer(reducer, 0); + + return [state, dispatch]; +}; diff --git a/src/app/hooks/useImagePacks.ts b/src/app/hooks/useImagePacks.ts new file mode 100644 index 00000000..ab988e36 --- /dev/null +++ b/src/app/hooks/useImagePacks.ts @@ -0,0 +1,48 @@ +import { ClientEvent, MatrixClient, MatrixEvent, Room, RoomStateEvent } from 'matrix-js-sdk'; +import { useEffect, useMemo } from 'react'; +import { getRelevantPacks, ImagePack, PackUsage } from '../plugins/custom-emoji'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { StateEvent } from '../../types/matrix/room'; +import { useForceUpdate } from './useForceUpdate'; + +export const useRelevantImagePacks = ( + mx: MatrixClient, + usage: PackUsage, + rooms: Room[] +): ImagePack[] => { + const [forceCount, forceUpdate] = useForceUpdate(); + + const relevantPacks = useMemo( + () => getRelevantPacks(mx, rooms).filter((pack) => pack.getImagesFor(usage).length > 0), + // eslint-disable-next-line react-hooks/exhaustive-deps + [mx, usage, rooms, forceCount] + ); + + useEffect(() => { + const handleUpdate = (event: MatrixEvent) => { + if ( + event.getType() === AccountDataEvent.PoniesEmoteRooms || + event.getType() === AccountDataEvent.PoniesUserEmotes + ) { + forceUpdate(); + } + const eventRoomId = event.getRoomId(); + if ( + eventRoomId && + event.getType() === StateEvent.PoniesRoomEmotes && + rooms.find((room) => room.roomId === eventRoomId) + ) { + forceUpdate(); + } + }; + + mx.on(ClientEvent.AccountData, handleUpdate); + mx.on(RoomStateEvent.Events, handleUpdate); + return () => { + mx.removeListener(ClientEvent.AccountData, handleUpdate); + mx.removeListener(RoomStateEvent.Events, handleUpdate); + }; + }, [mx, rooms, forceUpdate]); + + return relevantPacks; +}; diff --git a/src/app/hooks/useKeyDown.ts b/src/app/hooks/useKeyDown.ts new file mode 100644 index 00000000..c754d88c --- /dev/null +++ b/src/app/hooks/useKeyDown.ts @@ -0,0 +1,10 @@ +import { useEffect } from 'react'; + +export const useKeyDown = (target: Window, callback: (evt: KeyboardEvent) => void) => { + useEffect(() => { + target.addEventListener('keydown', callback); + return () => { + target.removeEventListener('keydown', callback); + }; + }, [target, callback]); +}; diff --git a/src/app/hooks/useMatrixClient.ts b/src/app/hooks/useMatrixClient.ts new file mode 100644 index 00000000..5ff6d90d --- /dev/null +++ b/src/app/hooks/useMatrixClient.ts @@ -0,0 +1,12 @@ +import { createContext, useContext } from 'react'; +import { MatrixClient } from 'matrix-js-sdk'; + +const MatrixClientContext = createContext(null); + +export const MatrixClientProvider = MatrixClientContext.Provider; + +export function useMatrixClient(): MatrixClient { + const mx = useContext(MatrixClientContext); + if (!mx) throw new Error('MatrixClient not initialized!'); + return mx; +} diff --git a/src/app/hooks/usePowerLevels.ts b/src/app/hooks/usePowerLevels.ts new file mode 100644 index 00000000..8f999d48 --- /dev/null +++ b/src/app/hooks/usePowerLevels.ts @@ -0,0 +1,86 @@ +import { Room } from 'matrix-js-sdk'; +import { useCallback } from 'react'; +import { useStateEvent } from './useStateEvent'; +import { StateEvent } from '../../types/matrix/room'; + +enum DefaultPowerLevels { + usersDefault = 0, + stateDefault = 50, + eventsDefault = 0, + invite = 0, + redact = 50, + kick = 50, + ban = 50, + historical = 0, +} + +interface IPowerLevels { + users_default?: number; + state_default?: number; + events_default?: number; + historical?: number; + invite?: number; + redact?: number; + kick?: number; + ban?: number; + + events?: Record; + users?: Record; + notifications?: Record; +} + +export function usePowerLevels(room: Room) { + const powerLevelsEvent = useStateEvent(room, StateEvent.RoomPowerLevels); + const powerLevels: IPowerLevels = powerLevelsEvent?.getContent() ?? DefaultPowerLevels; + + const getPowerLevel = useCallback( + (userId: string) => { + const { users_default: usersDefault, users } = powerLevels; + if (users && typeof users[userId] === 'number') { + return users[userId]; + } + return usersDefault ?? DefaultPowerLevels.usersDefault; + }, + [powerLevels] + ); + + const canSendEvent = useCallback( + (eventType: string | undefined, powerLevel: number) => { + const { events, events_default: eventsDefault } = powerLevels; + if (events && eventType && typeof events[eventType] === 'string') { + return powerLevel >= events[eventType]; + } + return powerLevel >= (eventsDefault ?? DefaultPowerLevels.eventsDefault); + }, + [powerLevels] + ); + + const canSendStateEvent = useCallback( + (eventType: string | undefined, powerLevel: number) => { + const { events, state_default: stateDefault } = powerLevels; + if (events && eventType && typeof events[eventType] === 'number') { + return powerLevel >= events[eventType]; + } + return powerLevel >= (stateDefault ?? DefaultPowerLevels.stateDefault); + }, + [powerLevels] + ); + + const canDoAction = useCallback( + (action: 'invite' | 'redact' | 'kick' | 'ban' | 'historical', powerLevel: number) => { + const requiredPL = powerLevels[action]; + if (typeof requiredPL === 'number') { + return powerLevel >= requiredPL; + } + return powerLevel >= DefaultPowerLevels[action]; + }, + [powerLevels] + ); + + return { + getPowerLevel, + canSendEvent, + canSendStateEvent, + canDoAction, + }; +} diff --git a/src/app/hooks/useRecentEmoji.ts b/src/app/hooks/useRecentEmoji.ts new file mode 100644 index 00000000..926075f5 --- /dev/null +++ b/src/app/hooks/useRecentEmoji.ts @@ -0,0 +1,23 @@ +import { useEffect, useState } from 'react'; +import { ClientEvent, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; +import { getRecentEmojis } from '../plugins/recent-emoji'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { IEmoji } from '../plugins/emoji'; + +export const useRecentEmoji = (mx: MatrixClient, limit?: number): IEmoji[] => { + const [recentEmoji, setRecentEmoji] = useState(() => getRecentEmojis(mx, limit)); + + useEffect(() => { + const handleAccountData = (event: MatrixEvent) => { + if (event.getType() !== AccountDataEvent.ElementRecentEmoji) return; + setRecentEmoji(getRecentEmojis(mx, limit)); + }; + + mx.on(ClientEvent.AccountData, handleAccountData); + return () => { + mx.removeListener(ClientEvent.AccountData, handleAccountData); + }; + }, [mx, limit]); + + return recentEmoji; +}; diff --git a/src/app/hooks/useResizeObserver.ts b/src/app/hooks/useResizeObserver.ts new file mode 100644 index 00000000..69ec65d0 --- /dev/null +++ b/src/app/hooks/useResizeObserver.ts @@ -0,0 +1,24 @@ +import { useEffect, useMemo } from 'react'; + +export type OnResizeCallback = (entries: ResizeObserverEntry[]) => void; + +export const getResizeObserverEntry = ( + target: Element, + entries: ResizeObserverEntry[] +): ResizeObserverEntry | undefined => entries.find((entry) => entry.target === target); + +export const useResizeObserver = ( + element: Element | null, + onResizeCallback: OnResizeCallback +): ResizeObserver => { + const resizeObserver = useMemo(() => new ResizeObserver(onResizeCallback), [onResizeCallback]); + + useEffect(() => { + if (element) resizeObserver.observe(element); + return () => { + if (element) resizeObserver.unobserve(element); + }; + }, [resizeObserver, element]); + + return resizeObserver; +}; diff --git a/src/app/hooks/useRoomMembers.ts b/src/app/hooks/useRoomMembers.ts new file mode 100644 index 00000000..544d97a0 --- /dev/null +++ b/src/app/hooks/useRoomMembers.ts @@ -0,0 +1,34 @@ +import { MatrixClient, MatrixEvent, RoomMember, RoomMemberEvent } from 'matrix-js-sdk'; +import { useEffect, useState } from 'react'; +import { useAlive } from './useAlive'; + +export const useRoomMembers = (mx: MatrixClient, roomId: string): RoomMember[] => { + const [members, setMembers] = useState([]); + const alive = useAlive(); + + useEffect(() => { + const room = mx.getRoom(roomId); + + const updateMemberList = (event?: MatrixEvent) => { + if (!room || !alive || (event && event.getRoomId() !== roomId)) return; + setMembers(room.getMembers()); + }; + + if (room) { + updateMemberList(); + room.loadMembersIfNeeded().then(() => { + if (!alive) return; + updateMemberList(); + }); + } + + mx.on(RoomMemberEvent.Membership, updateMemberList); + mx.on(RoomMemberEvent.PowerLevel, updateMemberList); + return () => { + mx.removeListener(RoomMemberEvent.Membership, updateMemberList); + mx.removeListener(RoomMemberEvent.PowerLevel, updateMemberList); + }; + }, [mx, roomId, alive]); + + return members; +}; diff --git a/src/app/hooks/useStateEvent.ts b/src/app/hooks/useStateEvent.ts new file mode 100644 index 00000000..7bc66aa2 --- /dev/null +++ b/src/app/hooks/useStateEvent.ts @@ -0,0 +1,32 @@ +import { Room } from 'matrix-js-sdk'; +import { useCallback, useMemo } from 'react'; +import { useStateEventCallback } from './useStateEventCallback'; +import { useForceUpdate } from './useForceUpdate'; +import { getStateEvent } from '../utils/room'; +import { StateEvent } from '../../types/matrix/room'; + +export const useStateEvent = (room: Room, eventType: StateEvent, stateKey = '') => { + const [updateCount, forceUpdate] = useForceUpdate(); + + useStateEventCallback( + room.client, + useCallback( + (event) => { + if ( + event.getRoomId() === room.roomId && + event.getType() === eventType && + event.getStateKey() === stateKey + ) { + forceUpdate(); + } + }, + [room, eventType, stateKey, forceUpdate] + ) + ); + + return useMemo( + () => getStateEvent(room, eventType, stateKey), + // eslint-disable-next-line react-hooks/exhaustive-deps + [room, eventType, stateKey, updateCount] + ); +}; diff --git a/src/app/hooks/useStateEventCallback.ts b/src/app/hooks/useStateEventCallback.ts new file mode 100644 index 00000000..85be3aeb --- /dev/null +++ b/src/app/hooks/useStateEventCallback.ts @@ -0,0 +1,17 @@ +import { MatrixClient, MatrixEvent, RoomState, RoomStateEvent } from 'matrix-js-sdk'; +import { useEffect } from 'react'; + +export type StateEventCallback = ( + event: MatrixEvent, + state: RoomState, + lastStateEvent: MatrixEvent | null +) => void; + +export const useStateEventCallback = (mx: MatrixClient, onStateEvent: StateEventCallback) => { + useEffect(() => { + mx.on(RoomStateEvent.Events, onStateEvent); + return () => { + mx.removeListener(RoomStateEvent.Events, onStateEvent); + }; + }, [mx, onStateEvent]); +}; diff --git a/src/app/hooks/useStateEvents.ts b/src/app/hooks/useStateEvents.ts new file mode 100644 index 00000000..dd085693 --- /dev/null +++ b/src/app/hooks/useStateEvents.ts @@ -0,0 +1,28 @@ +import { useCallback, useMemo } from 'react'; +import { Room } from 'matrix-js-sdk'; +import { StateEvent } from '../../types/matrix/room'; +import { useForceUpdate } from './useForceUpdate'; +import { useStateEventCallback } from './useStateEventCallback'; +import { getStateEvents } from '../utils/room'; + +export const useStateEvents = (room: Room, eventType: StateEvent) => { + const [updateCount, forceUpdate] = useForceUpdate(); + + useStateEventCallback( + room.client, + useCallback( + (event) => { + if (event.getRoomId() === room.roomId && event.getType() === eventType) { + forceUpdate(); + } + }, + [room, eventType, forceUpdate] + ) + ); + + return useMemo( + () => getStateEvents(room, eventType), + // eslint-disable-next-line react-hooks/exhaustive-deps + [room, eventType, updateCount] + ); +}; diff --git a/src/app/hooks/useThrottle.ts b/src/app/hooks/useThrottle.ts new file mode 100644 index 00000000..12b249f2 --- /dev/null +++ b/src/app/hooks/useThrottle.ts @@ -0,0 +1,41 @@ +import { useCallback, useRef } from 'react'; + +export interface ThrottleOptions { + wait?: number; + immediate?: boolean; +} + +export type ThrottleCallback = (...args: T) => void; + +export function useThrottle( + callback: ThrottleCallback, + options?: ThrottleOptions +): ThrottleCallback { + const timeoutIdRef = useRef(); + const argsRef = useRef(); + const { wait, immediate } = options ?? {}; + + const debounceCallback = useCallback( + (...cbArgs: T) => { + argsRef.current = cbArgs; + + if (timeoutIdRef.current) { + return; + } + if (immediate) { + callback(...cbArgs); + } + + timeoutIdRef.current = window.setTimeout(() => { + if (argsRef.current) { + callback(...argsRef.current); + } + argsRef.current = undefined; + timeoutIdRef.current = undefined; + }, wait); + }, + [callback, wait, immediate] + ); + + return debounceCallback; +} diff --git a/src/app/hooks/useTypingStatusUpdater.ts b/src/app/hooks/useTypingStatusUpdater.ts new file mode 100644 index 00000000..af76eae7 --- /dev/null +++ b/src/app/hooks/useTypingStatusUpdater.ts @@ -0,0 +1,42 @@ +import { MatrixClient } from 'matrix-js-sdk'; +import { useMemo, useRef } from 'react'; + +type TypingStatusUpdater = (typing: boolean) => void; + +const TYPING_TIMEOUT_MS = 5000; // 5 seconds + +export const useTypingStatusUpdater = (mx: MatrixClient, roomId: string): TypingStatusUpdater => { + const statusSentTsRef = useRef(0); + + const sendTypingStatus: TypingStatusUpdater = useMemo(() => { + statusSentTsRef.current = 0; + return (typing) => { + if (typing) { + if (Date.now() - statusSentTsRef.current < TYPING_TIMEOUT_MS) { + return; + } + + mx.sendTyping(roomId, true, TYPING_TIMEOUT_MS); + const sentTs = Date.now(); + statusSentTsRef.current = sentTs; + + // Don't believe server will timeout typing status; + // Clear typing status after timeout if already not; + setTimeout(() => { + if (statusSentTsRef.current === sentTs) { + mx.sendTyping(roomId, false, TYPING_TIMEOUT_MS); + statusSentTsRef.current = 0; + } + }, TYPING_TIMEOUT_MS); + return; + } + + if (Date.now() - statusSentTsRef.current < TYPING_TIMEOUT_MS) { + mx.sendTyping(roomId, false, TYPING_TIMEOUT_MS); + } + statusSentTsRef.current = 0; + }; + }, [mx, roomId]); + + return sendTypingStatus; +}; diff --git a/src/app/molecules/following-members/FollowingMembers.jsx b/src/app/molecules/following-members/FollowingMembers.jsx index 65296535..949dac76 100644 --- a/src/app/molecules/following-members/FollowingMembers.jsx +++ b/src/app/molecules/following-members/FollowingMembers.jsx @@ -17,38 +17,40 @@ function FollowingMembers({ roomTimeline }) { const [followingMembers, setFollowingMembers] = useState([]); const { roomId } = roomTimeline; const mx = initMatrix.matrixClient; - const { roomsInput } = initMatrix; const myUserId = mx.getUserId(); - const handleOnMessageSent = () => setFollowingMembers([]); - useEffect(() => { const updateFollowingMembers = () => { setFollowingMembers(roomTimeline.getLiveReaders()); }; + const updateOnEvent = (event, room) => { + if (room.roomId !== roomId) return; + setFollowingMembers(roomTimeline.getLiveReaders()); + }; updateFollowingMembers(); roomTimeline.on(cons.events.roomTimeline.LIVE_RECEIPT, updateFollowingMembers); - roomsInput.on(cons.events.roomsInput.MESSAGE_SENT, handleOnMessageSent); + mx.on('Room.timeline', updateOnEvent); return () => { roomTimeline.removeListener(cons.events.roomTimeline.LIVE_RECEIPT, updateFollowingMembers); - roomsInput.removeListener(cons.events.roomsInput.MESSAGE_SENT, handleOnMessageSent); + mx.removeListener('Room.timeline', updateOnEvent); }; - }, [roomTimeline]); + }, [roomTimeline, roomId]); const filteredM = followingMembers.filter((userId) => userId !== myUserId); - return filteredM.length !== 0 && ( - + return ( + filteredM.length !== 0 && ( + + ) ); } diff --git a/src/app/organisms/drag-drop/DragDrop.jsx b/src/app/organisms/drag-drop/DragDrop.jsx deleted file mode 100644 index e92f8a70..00000000 --- a/src/app/organisms/drag-drop/DragDrop.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './DragDrop.scss'; - -import RawModal from '../../atoms/modal/RawModal'; -import Text from '../../atoms/text/Text'; - -function DragDrop({ isOpen }) { - return ( - - Drop file to upload - - ); -} - -DragDrop.propTypes = { - isOpen: PropTypes.bool.isRequired, -}; - -export default DragDrop; diff --git a/src/app/organisms/drag-drop/DragDrop.scss b/src/app/organisms/drag-drop/DragDrop.scss deleted file mode 100644 index 2e5b4f51..00000000 --- a/src/app/organisms/drag-drop/DragDrop.scss +++ /dev/null @@ -1,12 +0,0 @@ -.drag-drop__modal { - box-shadow: none; - text-align: center; - - .text { - color: white; - } -} - -.drag-drop__overlay { - background-color: var(--bg-overlay-low); -} diff --git a/src/app/organisms/navigation/SideBar.scss b/src/app/organisms/navigation/SideBar.scss index 6ff66288..401947a4 100644 --- a/src/app/organisms/navigation/SideBar.scss +++ b/src/app/organisms/navigation/SideBar.scss @@ -7,10 +7,7 @@ width: var(--navigation-sidebar-width); height: 100%; background-color: var(--bg-surface-extra-low); - @include dir.side(border, - none, - 1px solid var(--bg-surface-border), - ); + @include dir.side(border, none, 1px solid var(--bg-surface-border)); &__scrollable, &__sticky { @@ -24,7 +21,7 @@ .scrollable-content { &::after { - content: ""; + content: ''; display: block; width: 100%; height: 8px; @@ -33,7 +30,8 @@ background-image: linear-gradient( to top, var(--bg-surface-extra-low), - var(--bg-surface-extra-low-transparent)); + var(--bg-surface-extra-low-transparent) + ); position: sticky; bottom: -1px; left: 0; @@ -44,7 +42,7 @@ .space-container, .sticky-container { @extend .cp-fx__column--c-c; - + padding: var(--sp-ultra-tight) 0; & > .sidebar-avatar, @@ -63,7 +61,7 @@ box-shadow: var(--bs-danger-border); animation-name: pushRight; animation-duration: 400ms; - animation-iteration-count: infinite; + animation-iteration-count: 30; animation-direction: alternate; } @@ -74,4 +72,4 @@ to { transform: translateX(0) scale(1); } -} \ No newline at end of file +} diff --git a/src/app/organisms/navigation/Sidebar1.tsx b/src/app/organisms/navigation/Sidebar1.tsx new file mode 100644 index 00000000..d9ee4662 --- /dev/null +++ b/src/app/organisms/navigation/Sidebar1.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import { Icon, Icons, Badge, AvatarFallback, Text } from 'folds'; +import { useAtom } from 'jotai'; + +import { + Sidebar, + SidebarContent, + SidebarStackSeparator, + SidebarStack, + SidebarAvatar, +} from '../../components/sidebar'; +import { selectedTabAtom, SidebarTab } from '../../state/selectedTab'; + +export function Sidebar1() { + const [selectedTab, setSelectedTab] = useAtom(selectedTabAtom); + + return ( + + + + } + onClick={() => setSelectedTab(SidebarTab.Home)} + /> + } + onClick={() => setSelectedTab(SidebarTab.People)} + /> + + + + ( + + )} + avatarChildren={ + + B + + } + /> + ( + + 64 + + )} + avatarChildren={ + + C + + } + /> + + + + } + /> + } + /> + + + } + sticky={ + <> + + + } + /> + + A + + } + /> + + + } + /> + + ); +} diff --git a/src/app/organisms/room/Room.jsx b/src/app/organisms/room/Room.jsx index 447686af..9d861c96 100644 --- a/src/app/organisms/room/Room.jsx +++ b/src/app/organisms/room/Room.jsx @@ -15,6 +15,7 @@ import PeopleDrawer from './PeopleDrawer'; function Room() { const [roomInfo, setRoomInfo] = useState({ + room: null, roomTimeline: null, eventId: null, }); @@ -25,14 +26,17 @@ function Room() { useEffect(() => { const handleRoomSelected = (rId, pRoomId, eId) => { roomInfo.roomTimeline?.removeInternalListeners(); - if (mx.getRoom(rId)) { + const r = mx.getRoom(rId); + if (r) { setRoomInfo({ + room: r, roomTimeline: new RoomTimeline(rId), eventId: eId ?? null, }); } else { // TODO: add ability to join room if roomId is invalid setRoomInfo({ + room: r, roomTimeline: null, eventId: null, }); @@ -43,7 +47,7 @@ function Room() { return () => { navigation.removeListener(cons.events.navigation.ROOM_SELECTED, handleRoomSelected); }; - }, [roomInfo]); + }, [roomInfo, mx]); useEffect(() => { const handleDrawerToggling = (visiblity) => setIsDrawer(visiblity); @@ -53,7 +57,7 @@ function Room() { }; }, []); - const { roomTimeline, eventId } = roomInfo; + const { room, roomTimeline, eventId } = roomInfo; if (roomTimeline === null) { setTimeout(() => openNavigation()); return ; @@ -63,7 +67,7 @@ function Room() {
    - +
    {isDrawer && }
    diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx new file mode 100644 index 00000000..17830ad9 --- /dev/null +++ b/src/app/organisms/room/RoomInput.tsx @@ -0,0 +1,539 @@ +import React, { + KeyboardEventHandler, + RefObject, + forwardRef, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { useAtom } from 'jotai'; +import isHotkey from 'is-hotkey'; +import { EventType, IContent, MsgType, Room } from 'matrix-js-sdk'; +import { ReactEditor } from 'slate-react'; +import { Transforms, Range, Editor, Element } from 'slate'; +import { + Box, + Dialog, + Icon, + IconButton, + Icons, + Overlay, + OverlayBackdrop, + OverlayCenter, + PopOut, + Scroll, + Text, + config, + toRem, +} from 'folds'; +import to from 'await-to-js'; + +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { + CustomEditor, + EditorChangeHandler, + useEditor, + Toolbar, + toMatrixCustomHTML, + toPlainText, + AUTOCOMPLETE_PREFIXES, + AutocompletePrefix, + AutocompleteQuery, + getAutocompleteQuery, + getPrevWorldRange, + resetEditor, + RoomMentionAutocomplete, + UserMentionAutocomplete, + EmoticonAutocomplete, + createEmoticonElement, + moveCursor, +} from '../../components/editor'; +import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; +import { UseStateProvider } from '../../components/UseStateProvider'; +import initMatrix from '../../../client/initMatrix'; +import { TUploadContent, encryptFile, getImageInfo } from '../../utils/matrix'; +import { useTypingStatusUpdater } from '../../hooks/useTypingStatusUpdater'; +import { useFilePicker } from '../../hooks/useFilePicker'; +import { useFilePasteHandler } from '../../hooks/useFilePasteHandler'; +import { useFileDropZone } from '../../hooks/useFileDrop'; +import { + TUploadItem, + roomIdToMsgDraftAtomFamily, + roomIdToReplyDraftAtomFamily, + roomIdToUploadItemsAtomFamily, + roomUploadAtomFamily, +} from '../../state/roomInputDrafts'; +import { UploadCardRenderer } from '../../components/upload-card'; +import { + UploadBoard, + UploadBoardContent, + UploadBoardHeader, + UploadBoardImperativeHandlers, +} from '../../components/upload-board'; +import { + Upload, + UploadStatus, + UploadSuccess, + createUploadFamilyObserverAtom, +} from '../../state/upload'; +import { getImageUrlBlob, loadImageElement } from '../../utils/dom'; +import { safeFile } from '../../utils/mimeTypes'; +import { fulfilledPromiseSettledResult } from '../../utils/common'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; +import { + getAudioMsgContent, + getFileMsgContent, + getImageMsgContent, + getVideoMsgContent, +} from './msgContent'; +import navigation from '../../../client/state/navigation'; +import cons from '../../../client/state/cons'; +import { MessageReply } from '../../molecules/message/Message'; +import colorMXID from '../../../util/colorMXID'; +import { parseReplyBody, parseReplyFormattedBody } from '../../utils/room'; +import { sanitizeText } from '../../utils/sanitize'; + +interface RoomInputProps { + roomViewRef: RefObject; + roomId: string; +} +export const RoomInput = forwardRef( + ({ roomViewRef, roomId }, ref) => { + const mx = useMatrixClient(); + const editor = useEditor(); + const room = mx.getRoom(roomId); + + const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(roomId)); + const [replyDraft, setReplyDraft] = useAtom(roomIdToReplyDraftAtomFamily(roomId)); + const [uploadBoard, setUploadBoard] = useState(true); + const [selectedFiles, setSelectedFiles] = useAtom(roomIdToUploadItemsAtomFamily(roomId)); + const uploadFamilyObserverAtom = createUploadFamilyObserverAtom( + roomUploadAtomFamily, + selectedFiles.map((f) => f.file) + ); + const uploadBoardHandlers = useRef(); + + const imagePackRooms: Room[] = useMemo(() => { + const allParentSpaces = [roomId, ...(initMatrix.roomList?.getAllParentSpaces(roomId) ?? [])]; + return allParentSpaces.reduce((list, rId) => { + const r = mx.getRoom(rId); + if (r) list.push(r); + return list; + }, []); + }, [mx, roomId]); + + const [toolbar, setToolbar] = useSetting(settingsAtom, 'editorToolbar'); + const [autocompleteQuery, setAutocompleteQuery] = + useState>(); + + const sendTypingStatus = useTypingStatusUpdater(mx, roomId); + + const handleFiles = useCallback( + async (files: File[]) => { + setUploadBoard(true); + const safeFiles = files.map(safeFile); + const fileItems: TUploadItem[] = []; + + if (mx.isRoomEncrypted(roomId)) { + const encryptFiles = fulfilledPromiseSettledResult( + await Promise.allSettled(safeFiles.map((f) => encryptFile(f))) + ); + encryptFiles.forEach((ef) => fileItems.push(ef)); + } else { + safeFiles.forEach((f) => + fileItems.push({ file: f, originalFile: f, encInfo: undefined }) + ); + } + setSelectedFiles({ + type: 'PUT', + item: fileItems, + }); + }, + [setSelectedFiles, roomId, mx] + ); + const pickFile = useFilePicker(handleFiles, true); + const handlePaste = useFilePasteHandler(handleFiles); + const dropZoneVisible = useFileDropZone(roomViewRef, handleFiles); + + useEffect(() => { + Transforms.insertFragment(editor, msgDraft); + }, [editor, msgDraft]); + + useEffect(() => { + ReactEditor.focus(editor); + return () => { + const parsedDraft = JSON.parse(JSON.stringify(editor.children)); + setMsgDraft(parsedDraft); + resetEditor(editor); + }; + }, [roomId, editor, setMsgDraft]); + + useEffect(() => { + const handleReplyTo = ( + userId: string, + eventId: string, + body: string, + formattedBody: string + ) => { + setReplyDraft({ + userId, + eventId, + body, + formattedBody, + }); + }; + navigation.on(cons.events.navigation.REPLY_TO_CLICKED, handleReplyTo); + return () => { + navigation.removeListener(cons.events.navigation.REPLY_TO_CLICKED, handleReplyTo); + }; + }, [setReplyDraft]); + + const handleRemoveUpload = useCallback( + (upload: TUploadContent | TUploadContent[]) => { + const uploads = Array.isArray(upload) ? upload : [upload]; + setSelectedFiles({ + type: 'DELETE', + item: selectedFiles.filter((f) => uploads.find((u) => u === f.file)), + }); + uploads.forEach((u) => roomUploadAtomFamily.remove(u)); + }, + [setSelectedFiles, selectedFiles] + ); + + const handleCancelUpload = (uploads: Upload[]) => { + uploads.forEach((upload) => { + if (upload.status === UploadStatus.Loading) { + mx.cancelUpload(upload.promise); + } + }); + handleRemoveUpload(uploads.map((upload) => upload.file)); + }; + + const handleSendUpload = async (uploads: UploadSuccess[]) => { + const sendPromises = uploads.map(async (upload) => { + const fileItem = selectedFiles.find((f) => f.file === upload.file); + if (fileItem && fileItem.file.type.startsWith('image')) { + const [imgError, imgContent] = await to(getImageMsgContent(fileItem, upload.mxc)); + if (imgError) console.warn(imgError); + if (imgContent) mx.sendMessage(roomId, imgContent); + return; + } + if (fileItem && fileItem.file.type.startsWith('video')) { + const [videoError, videoContent] = await to(getVideoMsgContent(mx, fileItem, upload.mxc)); + if (videoError) console.warn(videoError); + if (videoContent) mx.sendMessage(roomId, videoContent); + return; + } + if (fileItem && fileItem.file.type.startsWith('audio')) { + mx.sendMessage(roomId, getAudioMsgContent(fileItem, upload.mxc)); + return; + } + if (fileItem) { + mx.sendMessage(roomId, getFileMsgContent(fileItem, upload.mxc)); + } + }); + handleCancelUpload(uploads); + await Promise.allSettled(sendPromises); + }; + + const submit = useCallback(() => { + uploadBoardHandlers.current?.handleSend(); + + const plainText = toPlainText(editor.children).trim(); + const customHtml = toMatrixCustomHTML(editor.children); + + if (plainText === '') return; + + let body = plainText; + let formattedBody = customHtml; + if (replyDraft) { + body = parseReplyBody(replyDraft.userId, replyDraft.userId) + body; + formattedBody = + parseReplyFormattedBody( + roomId, + replyDraft.userId, + replyDraft.eventId, + replyDraft.formattedBody ?? sanitizeText(replyDraft.body) + ) + formattedBody; + } + + const content: IContent = { + msgtype: MsgType.Text, + body, + format: 'org.matrix.custom.html', + formatted_body: formattedBody, + }; + if (replyDraft) { + content['m.relates_to'] = { + 'm.in_reply_to': { + event_id: replyDraft.eventId, + }, + }; + } + mx.sendMessage(roomId, content); + resetEditor(editor); + setReplyDraft(); + sendTypingStatus(false); + }, [mx, roomId, editor, replyDraft, sendTypingStatus, setReplyDraft]); + + const handleKeyDown: KeyboardEventHandler = useCallback( + (evt) => { + const { selection } = editor; + if (isHotkey('enter', evt)) { + evt.preventDefault(); + submit(); + } + if (isHotkey('escape', evt)) { + evt.preventDefault(); + setReplyDraft(); + } + if (selection && Range.isCollapsed(selection)) { + if (isHotkey('arrowleft', evt)) { + evt.preventDefault(); + Transforms.move(editor, { unit: 'offset', reverse: true }); + } + if (isHotkey('arrowright', evt)) { + evt.preventDefault(); + Transforms.move(editor, { unit: 'offset' }); + } + } + }, + [submit, editor, setReplyDraft] + ); + + const handleChange: EditorChangeHandler = (value) => { + const prevWordRange = getPrevWorldRange(editor); + const query = prevWordRange + ? getAutocompleteQuery(editor, prevWordRange, AUTOCOMPLETE_PREFIXES) + : undefined; + + setAutocompleteQuery(query); + + const descendant = value[0]; + if (descendant && Element.isElement(descendant)) { + const isEmpty = value.length === 1 && Editor.isEmpty(editor, descendant); + sendTypingStatus(!isEmpty); + } + }; + + const handleEmoticonSelect = (key: string, shortcode: string) => { + editor.insertNode(createEmoticonElement(key, shortcode)); + moveCursor(editor); + }; + + const handleStickerSelect = async (mxc: string, shortcode: string) => { + const stickerUrl = mx.mxcUrlToHttp(mxc); + if (!stickerUrl) return; + + const info = await getImageInfo( + await loadImageElement(stickerUrl), + await getImageUrlBlob(stickerUrl) + ); + + mx.sendEvent(roomId, EventType.Sticker, { + body: shortcode, + url: mxc, + info, + }); + }; + + return ( +
    + {selectedFiles.length > 0 && ( + setUploadBoard(!uploadBoard)} + uploadFamilyObserverAtom={uploadFamilyObserverAtom} + onSend={handleSendUpload} + imperativeHandlerRef={uploadBoardHandlers} + onCancel={handleCancelUpload} + /> + } + > + {uploadBoard && ( + + + {Array.from(selectedFiles) + .reverse() + .map((fileItem, index) => ( + + ))} + + + )} + + )} + } + style={{ pointerEvents: 'none' }} + > + + + + + + {`Drop Files in "${room?.name || 'Room'}"`} + + Drag and drop files here or click for selection dialog + + + + + {autocompleteQuery?.prefix === AutocompletePrefix.RoomMention && ( + setAutocompleteQuery(undefined)} + /> + )} + {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && ( + setAutocompleteQuery(undefined)} + /> + )} + {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && ( + setAutocompleteQuery(undefined)} + /> + )} + + + setReplyDraft()} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + + +
    + ) + } + before={ + pickFile('*')} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + } + after={ + <> + setToolbar(!toolbar)} + > + + + + {(emojiBoardTab: EmojiBoardTab | undefined, setEmojiBoardTab) => ( + { + setEmojiBoardTab(undefined); + ReactEditor.focus(editor); + }} + /> + } + > + {(anchorRef) => ( + <> + setEmojiBoardTab(EmojiBoardTab.Sticker)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + setEmojiBoardTab(EmojiBoardTab.Emoji)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + + )} + + )} + + + + + + } + bottom={toolbar && } + /> +
    + ); + } +); diff --git a/src/app/organisms/room/RoomInputPlaceholder.css.ts b/src/app/organisms/room/RoomInputPlaceholder.css.ts new file mode 100644 index 00000000..d0873dad --- /dev/null +++ b/src/app/organisms/room/RoomInputPlaceholder.css.ts @@ -0,0 +1,10 @@ +import { style } from '@vanilla-extract/css'; +import { color, config, toRem } from 'folds'; + +export const RoomInputPlaceholder = style({ + minHeight: toRem(48), + backgroundColor: color.SurfaceVariant.Container, + color: color.SurfaceVariant.OnContainer, + boxShadow: `inset 0 0 0 ${config.borderWidth.B300} ${color.SurfaceVariant.ContainerLine}`, + borderRadius: config.radii.R400, +}); diff --git a/src/app/organisms/room/RoomInputPlaceholder.tsx b/src/app/organisms/room/RoomInputPlaceholder.tsx new file mode 100644 index 00000000..77c7ccf3 --- /dev/null +++ b/src/app/organisms/room/RoomInputPlaceholder.tsx @@ -0,0 +1,11 @@ +import React, { ComponentProps } from 'react'; +import { Box, as } from 'folds'; +import classNames from 'classnames'; + +import * as css from './RoomInputPlaceholder.css'; + +export const RoomInputPlaceholder = as<'div', ComponentProps>( + ({ className, ...props }, ref) => ( + + ) +); diff --git a/src/app/organisms/room/RoomTombstone.css.ts b/src/app/organisms/room/RoomTombstone.css.ts new file mode 100644 index 00000000..c4c04612 --- /dev/null +++ b/src/app/organisms/room/RoomTombstone.css.ts @@ -0,0 +1,7 @@ +import { style } from '@vanilla-extract/css'; +import { config } from 'folds'; + +export const RoomTombstone = style({ + padding: config.space.S200, + paddingLeft: config.space.S400, +}); diff --git a/src/app/organisms/room/RoomTombstone.tsx b/src/app/organisms/room/RoomTombstone.tsx new file mode 100644 index 00000000..39f0e635 --- /dev/null +++ b/src/app/organisms/room/RoomTombstone.tsx @@ -0,0 +1,67 @@ +import React, { useCallback } from 'react'; +import { Box, Button, Spinner, Text, color } from 'folds'; + +import { selectRoom } from '../../../client/action/navigation'; + +import * as css from './RoomTombstone.css'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { genRoomVia } from '../../../util/matrixUtil'; +import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; +import { Membership } from '../../../types/matrix/room'; +import { RoomInputPlaceholder } from './RoomInputPlaceholder'; + +type RoomTombstoneProps = { roomId: string; body?: string; replacementRoomId: string }; +export function RoomTombstone({ roomId, body, replacementRoomId }: RoomTombstoneProps) { + const mx = useMatrixClient(); + + const [joinState, handleJoin] = useAsyncCallback( + useCallback(() => { + const currentRoom = mx.getRoom(roomId); + const via = currentRoom ? genRoomVia(currentRoom) : []; + return mx.joinRoom(replacementRoomId, { + viaServers: via, + }); + }, [mx, roomId, replacementRoomId]) + ); + const replacementRoom = mx.getRoom(replacementRoomId); + + const handleOpen = () => { + if (replacementRoom) selectRoom(replacementRoom.roomId); + if (joinState.status === AsyncStatus.Success) selectRoom(joinState.data.roomId); + }; + + return ( + + + {body || 'This room has been replaced and is no longer active.'} + {joinState.status === AsyncStatus.Error && ( + + {(joinState.error as any)?.message ?? 'Failed to join replacement room!'} + + )} + + {replacementRoom?.getMyMembership() === Membership.Join || + joinState.status === AsyncStatus.Success ? ( + + ) : ( + + )} + + ); +} diff --git a/src/app/organisms/room/RoomView.jsx b/src/app/organisms/room/RoomView.jsx index b94c35c4..591fccea 100644 --- a/src/app/organisms/room/RoomView.jsx +++ b/src/app/organisms/room/RoomView.jsx @@ -1,6 +1,7 @@ import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './RoomView.scss'; +import { Text, config } from 'folds'; import EventEmitter from 'events'; @@ -10,16 +11,29 @@ import navigation from '../../../client/state/navigation'; import RoomViewHeader from './RoomViewHeader'; import RoomViewContent from './RoomViewContent'; import RoomViewFloating from './RoomViewFloating'; -import RoomViewInput from './RoomViewInput'; import RoomViewCmdBar from './RoomViewCmdBar'; +import { RoomInput } from './RoomInput'; +import { useStateEvent } from '../../hooks/useStateEvent'; +import { StateEvent } from '../../../types/matrix/room'; +import { RoomTombstone } from './RoomTombstone'; +import { usePowerLevels } from '../../hooks/usePowerLevels'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { RoomInputPlaceholder } from './RoomInputPlaceholder'; const viewEvent = new EventEmitter(); -function RoomView({ roomTimeline, eventId }) { +function RoomView({ room, roomTimeline, eventId }) { + const roomInputRef = useRef(null); const roomViewRef = useRef(null); // eslint-disable-next-line react/prop-types const { roomId } = roomTimeline; + const mx = useMatrixClient(); + const tombstoneEvent = useStateEvent(room, StateEvent.RoomTombstone); + const { getPowerLevel, canSendEvent } = usePowerLevels(room); + const myUserId = mx.getUserId(); + const canMessage = myUserId ? canSendEvent(undefined, getPowerLevel(myUserId)) : false; + useEffect(() => { const settingsToggle = (isVisible) => { const roomView = roomViewRef.current; @@ -47,23 +61,36 @@ function RoomView({ roomTimeline, eventId }) { - +
    - - +
    + {tombstoneEvent ? ( + + ) : ( + <> + {canMessage && ( + + )} + {!canMessage && ( + + You do not have permission to post in this room + + )} + + )} +
    +
    @@ -74,6 +101,7 @@ RoomView.defaultProps = { eventId: null, }; RoomView.propTypes = { + room: PropTypes.shape({}).isRequired, roomTimeline: PropTypes.shape({}).isRequired, eventId: PropTypes.string, }; diff --git a/src/app/organisms/room/RoomView.scss b/src/app/organisms/room/RoomView.scss index 4f06bf26..c70c2b09 100644 --- a/src/app/organisms/room/RoomView.scss +++ b/src/app/organisms/room/RoomView.scss @@ -35,11 +35,12 @@ @extend .cp-fx__item-one; position: relative; } - + &__sticky { - min-height: 85px; position: relative; background: var(--bg-surface); - border-top: 1px solid var(--bg-surface-border); } -} \ No newline at end of file + &__editor { + padding: 0 var(--sp-normal); + } +} diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index 0a9256ce..fe598bf6 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -28,6 +28,7 @@ import { useForceUpdate } from '../../hooks/useForceUpdate'; import { parseTimelineChange } from './common'; import TimelineScroll from './TimelineScroll'; import EventLimit from './EventLimit'; +import { getResizeObserverEntry, useResizeObserver } from '../../hooks/useResizeObserver'; const PAG_LIMIT = 30; const MAX_MSG_DIFF_MINUTES = 5; @@ -392,7 +393,7 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event let jumpToItemIndex = -1; -function RoomViewContent({ eventId, roomTimeline }) { +function RoomViewContent({ roomInputRef, eventId, roomTimeline }) { const [throttle] = useState(new Throttle()); const timelineSVRef = useRef(null); @@ -484,6 +485,21 @@ function RoomViewContent({ eventId, roomTimeline }) { } }, [newEvent]); + useResizeObserver( + roomInputRef.current, + useCallback((entries) => { + if (!roomInputRef.current) return; + const editorBaseEntry = getResizeObserverEntry(roomInputRef.current, entries); + if (!editorBaseEntry) return; + + const timelineScroll = timelineScrollRef.current; + if (!roomTimeline.initialized) return; + if (timelineScroll.bottom < 40 && !roomTimeline.canPaginateForward() && document.visibilityState === 'visible') { + timelineScroll.scrollToBottom(); + } + }, [roomInputRef]) + ); + const listenKeyboard = useCallback((event) => { if (event.ctrlKey || event.altKey || event.metaKey) return; if (event.key !== 'ArrowUp') return; @@ -620,6 +636,9 @@ RoomViewContent.defaultProps = { RoomViewContent.propTypes = { eventId: PropTypes.string, roomTimeline: PropTypes.shape({}).isRequired, + roomInputRef: PropTypes.shape({ + current: PropTypes.shape({}) + }).isRequired }; export default RoomViewContent; diff --git a/src/app/organisms/room/msgContent.ts b/src/app/organisms/room/msgContent.ts new file mode 100644 index 00000000..2b0c50ed --- /dev/null +++ b/src/app/organisms/room/msgContent.ts @@ -0,0 +1,148 @@ +import { IContent, MatrixClient, MsgType } from 'matrix-js-sdk'; +import to from 'await-to-js'; +import { IThumbnailContent } from '../../../types/matrix/common'; +import { + getImageFileUrl, + getThumbnail, + getThumbnailDimensions, + getVideoFileUrl, + loadImageElement, + loadVideoElement, +} from '../../utils/dom'; +import { encryptFile, getImageInfo, getThumbnailContent, getVideoInfo } from '../../utils/matrix'; +import { TUploadItem } from '../../state/roomInputDrafts'; +import { MATRIX_BLUR_HASH_PROPERTY_NAME, encodeBlurHash } from '../../utils/blurHash'; + +const generateThumbnailContent = async ( + mx: MatrixClient, + img: HTMLImageElement | HTMLVideoElement, + dimensions: [number, number], + encrypt: boolean +): Promise => { + const thumbnail = await getThumbnail(img, ...dimensions); + if (!thumbnail) throw new Error('Can not create thumbnail!'); + const encThumbData = encrypt ? await encryptFile(thumbnail) : undefined; + const thumbnailFile = encThumbData?.file ?? thumbnail; + if (!thumbnailFile) throw new Error('Can not create thumbnail!'); + + const data = await mx.uploadContent(thumbnailFile); + const thumbMxc = data?.content_uri; + if (!thumbMxc) throw new Error('Failed when uploading thumbnail!'); + const thumbnailContent = getThumbnailContent({ + thumbnail: thumbnailFile, + encInfo: encThumbData?.encInfo, + mxc: thumbMxc, + width: dimensions[0], + height: dimensions[1], + }); + return thumbnailContent; +}; + +export const getImageMsgContent = async (item: TUploadItem, mxc: string): Promise => { + const { file, originalFile, encInfo } = item; + const [imgError, imgEl] = await to(loadImageElement(getImageFileUrl(originalFile))); + if (imgError) console.warn(imgError); + + const content: IContent = { + msgtype: MsgType.Image, + body: file.name, + }; + if (imgEl) { + content.info = { + ...getImageInfo(imgEl, file), + [MATRIX_BLUR_HASH_PROPERTY_NAME]: encodeBlurHash(imgEl), + }; + } + if (encInfo) { + content.file = { + ...encInfo, + url: mxc, + }; + } else { + content.url = mxc; + } + return content; +}; + +export const getVideoMsgContent = async ( + mx: MatrixClient, + item: TUploadItem, + mxc: string +): Promise => { + const { file, originalFile, encInfo } = item; + + const [videoError, videoEl] = await to(loadVideoElement(getVideoFileUrl(originalFile))); + if (videoError) console.warn(videoError); + + const content: IContent = { + msgtype: MsgType.Video, + body: file.name, + }; + if (videoEl) { + const [thumbError, thumbContent] = await to( + generateThumbnailContent( + mx, + videoEl, + getThumbnailDimensions(videoEl.videoWidth, videoEl.videoHeight), + !!encInfo + ) + ); + if (thumbError) console.warn(thumbError); + content.info = { + ...getVideoInfo(videoEl, file), + ...thumbContent, + }; + } + if (encInfo) { + content.file = { + ...encInfo, + url: mxc, + }; + } else { + content.url = mxc; + } + return content; +}; + +export const getAudioMsgContent = (item: TUploadItem, mxc: string): IContent => { + const { file, encInfo } = item; + const content: IContent = { + msgtype: MsgType.Audio, + body: file.name, + info: { + mimetype: file.type, + size: file.size, + }, + }; + if (encInfo) { + content.file = { + ...encInfo, + url: mxc, + }; + } else { + content.url = mxc; + } + return content; +}; + +export const getFileMsgContent = (item: TUploadItem, mxc: string): IContent => { + const { file, encInfo } = item; + const content: IContent = { + msgtype: MsgType.File, + body: file.name, + filename: file.name, + info: { + mimetype: file.type, + size: file.size, + }, + }; + if (encInfo) { + content.file = { + ...encInfo, + url: mxc, + }; + } else { + content.url = mxc; + } + return content; +}; diff --git a/src/app/pages/App.jsx b/src/app/pages/App.jsx index af7cc29b..2828d7be 100644 --- a/src/app/pages/App.jsx +++ b/src/app/pages/App.jsx @@ -1,4 +1,5 @@ -import React from 'react'; +import React, { StrictMode } from 'react'; +import { Provider } from 'jotai'; import { isAuthenticated } from '../../client/state/auth'; @@ -6,7 +7,11 @@ import Auth from '../templates/auth/Auth'; import Client from '../templates/client/Client'; function App() { - return isAuthenticated() ? : ; + return ( + + {isAuthenticated() ? : } + + ); } export default App; diff --git a/src/app/plugins/custom-emoji.ts b/src/app/plugins/custom-emoji.ts new file mode 100644 index 00000000..daceef44 --- /dev/null +++ b/src/app/plugins/custom-emoji.ts @@ -0,0 +1,293 @@ +import { IImageInfo, MatrixClient, Room } from 'matrix-js-sdk'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { getAccountData, getStateEvents } from '../utils/room'; +import { StateEvent } from '../../types/matrix/room'; + +// https://github.com/Sorunome/matrix-doc/blob/soru/emotes/proposals/2545-emotes.md + +export type PackEventIdToUnknown = Record; +export type EmoteRoomIdToPackEvents = Record; +export type EmoteRoomsContent = { + rooms?: EmoteRoomIdToPackEvents; +}; + +export enum PackUsage { + Emoticon = 'emoticon', + Sticker = 'sticker', +} + +export type PackImage = { + url: string; + body?: string; + usage?: PackUsage[]; + info?: IImageInfo; +}; + +export type PackImages = Record; + +export type PackMeta = { + display_name?: string; + avatar_url?: string; + attribution?: string; + usage?: PackUsage[]; +}; + +export type ExtendedPackImage = PackImage & { + shortcode: string; +}; + +export type PackContent = { + pack?: PackMeta; + images?: PackImages; +}; + +export class ImagePack { + public id: string; + + public content: PackContent; + + public displayName?: string; + + public avatarUrl?: string; + + public usage?: PackUsage[]; + + public attribution?: string; + + public images: Map; + + public emoticons: ExtendedPackImage[]; + + public stickers: ExtendedPackImage[]; + + static parsePack(eventId: string, packContent: PackContent) { + if (!eventId || typeof packContent?.images !== 'object') { + return undefined; + } + + return new ImagePack(eventId, packContent); + } + + constructor(eventId: string, content: PackContent) { + this.id = eventId; + this.content = JSON.parse(JSON.stringify(content)); + + this.images = new Map(); + this.emoticons = []; + this.stickers = []; + + this.applyPackMeta(content); + this.applyImages(content); + } + + applyPackMeta(content: PackContent) { + const pack = content.pack ?? {}; + + this.displayName = pack.display_name; + this.avatarUrl = pack.avatar_url; + this.usage = pack.usage ?? [PackUsage.Emoticon, PackUsage.Sticker]; + this.attribution = pack.attribution; + } + + applyImages(content: PackContent) { + this.images = new Map(); + this.emoticons = []; + this.stickers = []; + if (!content.images) return; + + Object.entries(content.images).forEach(([shortcode, data]) => { + const { url } = data; + const body = data.body ?? shortcode; + const usage = data.usage ?? this.usage; + const { info } = data; + + if (!url) return; + const image: ExtendedPackImage = { + shortcode, + url, + body, + usage, + info, + }; + + this.images.set(shortcode, image); + if (usage && usage.includes(PackUsage.Emoticon)) { + this.emoticons.push(image); + } + if (usage && usage.includes(PackUsage.Sticker)) { + this.stickers.push(image); + } + }); + } + + getImages() { + return this.images; + } + + getEmojis() { + return this.emoticons; + } + + getStickers() { + return this.stickers; + } + + getImagesFor(usage: PackUsage) { + if (usage === PackUsage.Emoticon) return this.getEmojis(); + if (usage === PackUsage.Sticker) return this.getStickers(); + return this.getEmojis(); + } + + getContent() { + return this.content; + } + + getPackAvatarUrl(usage: PackUsage): string | undefined { + return this.avatarUrl || this.getImagesFor(usage)[0].url; + } + + private updatePackProperty(property: K, value: PackMeta[K]) { + if (this.content.pack === undefined) { + this.content.pack = {}; + } + this.content.pack[property] = value; + this.applyPackMeta(this.content); + } + + setAvatarUrl(avatarUrl?: string) { + this.updatePackProperty('avatar_url', avatarUrl); + } + + setDisplayName(displayName?: string) { + this.updatePackProperty('display_name', displayName); + } + + setAttribution(attribution?: string) { + this.updatePackProperty('attribution', attribution); + } + + setUsage(usage?: PackUsage[]) { + this.updatePackProperty('usage', usage); + } + + addImage(key: string, imgContent: PackImage) { + this.content.images = { + [key]: imgContent, + ...this.content.images, + }; + this.applyImages(this.content); + } + + removeImage(key: string) { + if (!this.content.images) return; + if (this.content.images[key] === undefined) return; + delete this.content.images[key]; + this.applyImages(this.content); + } + + updateImageKey(key: string, newKey: string) { + const { images } = this.content; + if (!images) return; + if (images[key] === undefined) return; + const copyImages: PackImages = {}; + Object.keys(images).forEach((imgKey) => { + copyImages[imgKey === key ? newKey : imgKey] = images[imgKey]; + }); + this.content.images = copyImages; + this.applyImages(this.content); + } + + private updateImageProperty( + key: string, + property: K, + value: PackImage[K] + ) { + if (!this.content.images) return; + if (this.content.images[key] === undefined) return; + this.content.images[key][property] = value; + this.applyImages(this.content); + } + + setImageUrl(key: string, url: string) { + this.updateImageProperty(key, 'url', url); + } + + setImageBody(key: string, body?: string) { + this.updateImageProperty(key, 'body', body); + } + + setImageInfo(key: string, info?: IImageInfo) { + this.updateImageProperty(key, 'info', info); + } + + setImageUsage(key: string, usage?: PackUsage[]) { + this.updateImageProperty(key, 'usage', usage); + } +} + +export function getRoomImagePacks(room: Room): ImagePack[] { + const dataEvents = getStateEvents(room, StateEvent.PoniesRoomEmotes); + + return dataEvents.reduce((roomPacks, packEvent) => { + const packId = packEvent?.getId(); + const content = packEvent?.getContent() as PackContent | undefined; + if (!packId || !content) return roomPacks; + const pack = ImagePack.parsePack(packId, content); + if (pack) { + roomPacks.push(pack); + } + return roomPacks; + }, []); +} + +export function getGlobalImagePacks(mx: MatrixClient): ImagePack[] { + const emoteRoomsContent = getAccountData(mx, AccountDataEvent.PoniesEmoteRooms)?.getContent() as + | EmoteRoomsContent + | undefined; + if (typeof emoteRoomsContent !== 'object') return []; + + const { rooms } = emoteRoomsContent; + if (typeof rooms !== 'object') return []; + + const roomIds = Object.keys(rooms); + + const packs = roomIds.flatMap((roomId) => { + if (typeof rooms[roomId] !== 'object') return []; + const room = mx.getRoom(roomId); + if (!room) return []; + return getRoomImagePacks(room); + }); + + return packs; +} + +export function getUserImagePack(mx: MatrixClient): ImagePack | undefined { + const userPackContent = getAccountData(mx, AccountDataEvent.PoniesUserEmotes)?.getContent() as + | PackContent + | undefined; + const userId = mx.getUserId(); + if (!userPackContent || !userId) { + return undefined; + } + + const userImagePack = ImagePack.parsePack(userId, userPackContent); + return userImagePack; +} + +/** + * @param {MatrixClient} mx Provide if you want to include user personal/global pack + * @param {Room[]} rooms Provide rooms if you want to include rooms pack + * @returns {ImagePack[]} packs + */ +export function getRelevantPacks(mx?: MatrixClient, rooms?: Room[]): ImagePack[] { + const userPack = mx && getUserImagePack(mx); + const userPacks = userPack ? [userPack] : []; + const globalPacks = mx ? getGlobalImagePacks(mx) : []; + const globalPackIds = new Set(globalPacks.map((pack) => pack.id)); + const roomsPack = rooms?.flatMap(getRoomImagePacks) ?? []; + + return userPacks.concat( + globalPacks, + roomsPack.filter((pack) => !globalPackIds.has(pack.id)) + ); +} diff --git a/src/app/plugins/emoji.ts b/src/app/plugins/emoji.ts new file mode 100644 index 00000000..36bd044e --- /dev/null +++ b/src/app/plugins/emoji.ts @@ -0,0 +1,104 @@ +import { CompactEmoji } from 'emojibase'; +import emojisData from 'emojibase-data/en/compact.json'; +import joypixels from 'emojibase-data/en/shortcodes/joypixels.json'; +import emojibase from 'emojibase-data/en/shortcodes/emojibase.json'; + +export type IEmoji = CompactEmoji & { + shortcode: string; +}; + +export enum EmojiGroupId { + People = 'People', + Nature = 'Nature', + Food = 'Food', + Activity = 'Activity', + Travel = 'Travel', + Object = 'Object', + Symbol = 'Symbol', + Flag = 'Flag', +} + +export type IEmojiGroup = { + id: EmojiGroupId; + order: number; + emojis: IEmoji[]; +}; + +export const emojiGroups: IEmojiGroup[] = [ + { + id: EmojiGroupId.People, + order: 0, + emojis: [], + }, + { + id: EmojiGroupId.Nature, + order: 1, + emojis: [], + }, + { + id: EmojiGroupId.Food, + order: 2, + emojis: [], + }, + { + id: EmojiGroupId.Activity, + order: 3, + emojis: [], + }, + { + id: EmojiGroupId.Travel, + order: 4, + emojis: [], + }, + { + id: EmojiGroupId.Object, + order: 5, + emojis: [], + }, + { + id: EmojiGroupId.Symbol, + order: 6, + emojis: [], + }, + { + id: EmojiGroupId.Flag, + order: 7, + emojis: [], + }, +]; + +export const emojis: IEmoji[] = []; + +function addEmojiToGroup(groupIndex: number, emoji: IEmoji) { + emojiGroups[groupIndex].emojis.push(emoji); +} + +function getGroupIndex(emoji: IEmoji): number | undefined { + if (emoji.group === 0 || emoji.group === 1) return 0; + if (emoji.group === 3) return 1; + if (emoji.group === 4) return 2; + if (emoji.group === 6) return 3; + if (emoji.group === 5) return 4; + if (emoji.group === 7) return 5; + if (emoji.group === 8 || typeof emoji.group === 'undefined') return 6; + if (emoji.group === 9) return 7; + return undefined; +} + +emojisData.forEach((emoji) => { + const myShortCodes = joypixels[emoji.hexcode] || emojibase[emoji.hexcode]; + if (!myShortCodes) return; + if (Array.isArray(myShortCodes) && myShortCodes.length === 0) return; + + const em: IEmoji = { + ...emoji, + shortcode: Array.isArray(myShortCodes) ? myShortCodes[0] : myShortCodes, + shortcodes: Array.isArray(myShortCodes) ? myShortCodes : emoji.shortcodes, + }; + + const groupIndex = getGroupIndex(em); + if (groupIndex !== undefined) { + addEmojiToGroup(groupIndex, em); + emojis.push(em); + } +}); diff --git a/src/app/plugins/recent-emoji.ts b/src/app/plugins/recent-emoji.ts new file mode 100644 index 00000000..3634538f --- /dev/null +++ b/src/app/plugins/recent-emoji.ts @@ -0,0 +1,44 @@ +import { MatrixClient } from 'matrix-js-sdk'; +import { getAccountData } from '../utils/room'; +import { IEmoji, emojis } from './emoji'; +import { AccountDataEvent } from '../../types/matrix/accountData'; + +type EmojiUnicode = string; +type EmojiUsageCount = number; + +export type IRecentEmojiContent = { + recent_emoji?: [EmojiUnicode, EmojiUsageCount][]; +}; + +export const getRecentEmojis = (mx: MatrixClient, limit?: number): IEmoji[] => { + const recentEmojiEvent = getAccountData(mx, AccountDataEvent.ElementRecentEmoji); + const recentEmoji = recentEmojiEvent?.getContent().recent_emoji; + if (!Array.isArray(recentEmoji)) return []; + + return recentEmoji + .sort((e1, e2) => e2[1] - e1[1]) + .slice(0, limit) + .reduce((list, [unicode]) => { + const emoji = emojis.find((e) => e.unicode === unicode); + if (emoji) list.push(emoji); + return list; + }, []); +}; + +export function addRecentEmoji(mx: MatrixClient, unicode: string) { + const recentEmojiEvent = getAccountData(mx, AccountDataEvent.ElementRecentEmoji); + const recentEmoji = recentEmojiEvent?.getContent().recent_emoji ?? []; + + const emojiIndex = recentEmoji.findIndex(([u]) => u === unicode); + let entry: [EmojiUnicode, EmojiUsageCount]; + if (emojiIndex < 0) { + entry = [unicode, 1]; + } else { + [entry] = recentEmoji.splice(emojiIndex, 1); + entry[1] += 1; + } + recentEmoji.unshift(entry); + mx.setAccountData(AccountDataEvent.ElementRecentEmoji, { + recent_emoji: recentEmoji.slice(0, 100), + }); +} diff --git a/src/app/state/hooks/inviteList.ts b/src/app/state/hooks/inviteList.ts new file mode 100644 index 00000000..f8b7e057 --- /dev/null +++ b/src/app/state/hooks/inviteList.ts @@ -0,0 +1,63 @@ +import { useAtomValue, WritableAtom } from 'jotai'; +import { selectAtom } from 'jotai/utils'; +import { MatrixClient } from 'matrix-js-sdk'; +import { useCallback } from 'react'; +import { isDirectInvite, isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; +import { compareRoomsEqual, RoomsAction } from '../utils'; +import { MDirectAction } from '../mDirectList'; + +export const useSpaceInvites = ( + mx: MatrixClient, + allInvitesAtom: WritableAtom +) => { + const selector = useCallback( + (rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))), + [mx] + ); + return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); +}; + +export const useRoomInvites = ( + mx: MatrixClient, + allInvitesAtom: WritableAtom, + mDirectAtom: WritableAtom, MDirectAction> +) => { + const mDirects = useAtomValue(mDirectAtom); + const selector = useCallback( + (rooms: string[]) => + rooms.filter( + (roomId) => + isRoom(mx.getRoom(roomId)) && + !(mDirects.has(roomId) || isDirectInvite(mx.getRoom(roomId), mx.getUserId())) + ), + [mx, mDirects] + ); + return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); +}; + +export const useDirectInvites = ( + mx: MatrixClient, + allInvitesAtom: WritableAtom, + mDirectAtom: WritableAtom, MDirectAction> +) => { + const mDirects = useAtomValue(mDirectAtom); + const selector = useCallback( + (rooms: string[]) => + rooms.filter( + (roomId) => mDirects.has(roomId) || isDirectInvite(mx.getRoom(roomId), mx.getUserId()) + ), + [mx, mDirects] + ); + return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); +}; + +export const useUnsupportedInvites = ( + mx: MatrixClient, + allInvitesAtom: WritableAtom +) => { + const selector = useCallback( + (rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))), + [mx] + ); + return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); +}; diff --git a/src/app/state/hooks/roomList.ts b/src/app/state/hooks/roomList.ts new file mode 100644 index 00000000..5d0890bd --- /dev/null +++ b/src/app/state/hooks/roomList.ts @@ -0,0 +1,54 @@ +import { useAtomValue, WritableAtom } from 'jotai'; +import { selectAtom } from 'jotai/utils'; +import { MatrixClient } from 'matrix-js-sdk'; +import { useCallback } from 'react'; +import { isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; +import { compareRoomsEqual, RoomsAction } from '../utils'; +import { MDirectAction } from '../mDirectList'; + +export const useSpaces = (mx: MatrixClient, allRoomsAtom: WritableAtom) => { + const selector = useCallback( + (rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))), + [mx] + ); + return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); +}; + +export const useRooms = ( + mx: MatrixClient, + allRoomsAtom: WritableAtom, + mDirectAtom: WritableAtom, MDirectAction> +) => { + const mDirects = useAtomValue(mDirectAtom); + const selector = useCallback( + (rooms: string[]) => + rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId)), + [mx, mDirects] + ); + return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); +}; + +export const useDirects = ( + mx: MatrixClient, + allRoomsAtom: WritableAtom, + mDirectAtom: WritableAtom, MDirectAction> +) => { + const mDirects = useAtomValue(mDirectAtom); + const selector = useCallback( + (rooms: string[]) => + rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId)), + [mx, mDirects] + ); + return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); +}; + +export const useUnsupportedRooms = ( + mx: MatrixClient, + allRoomsAtom: WritableAtom +) => { + const selector = useCallback( + (rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))), + [mx] + ); + return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); +}; diff --git a/src/app/state/hooks/settings.ts b/src/app/state/hooks/settings.ts new file mode 100644 index 00000000..3f4dab60 --- /dev/null +++ b/src/app/state/hooks/settings.ts @@ -0,0 +1,34 @@ +import { atom, useAtomValue, useSetAtom, WritableAtom } from 'jotai'; +import { SetAtom } from 'jotai/core/atom'; +import { selectAtom } from 'jotai/utils'; +import { useMemo } from 'react'; +import { Settings } from '../settings'; + +export const useSetSetting = ( + settingsAtom: WritableAtom, + key: K +) => { + const setterAtom = useMemo( + () => + atom(null, (get, set, value) => { + const s = { ...get(settingsAtom) }; + s[key] = value; + set(settingsAtom, s); + }), + [settingsAtom, key] + ); + + return useSetAtom(setterAtom); +}; + +export const useSetting = ( + settingsAtom: WritableAtom, + key: K +): [Settings[K], SetAtom] => { + const selector = useMemo(() => (s: Settings) => s[key], [key]); + const setting = useAtomValue(selectAtom(settingsAtom, selector)); + + const setter = useSetSetting(settingsAtom, key); + + return [setting, setter]; +}; diff --git a/src/app/state/hooks/useBindAtoms.ts b/src/app/state/hooks/useBindAtoms.ts new file mode 100644 index 00000000..6dc2a3de --- /dev/null +++ b/src/app/state/hooks/useBindAtoms.ts @@ -0,0 +1,16 @@ +import { MatrixClient } from 'matrix-js-sdk'; +import { allInvitesAtom, useBindAllInvitesAtom } from '../inviteList'; +import { allRoomsAtom, useBindAllRoomsAtom } from '../roomList'; +import { mDirectAtom, useBindMDirectAtom } from '../mDirectList'; +import { muteChangesAtom, mutedRoomsAtom, useBindMutedRoomsAtom } from '../mutedRoomList'; +import { roomToUnreadAtom, useBindRoomToUnreadAtom } from '../roomToUnread'; +import { roomToParentsAtom, useBindRoomToParentsAtom } from '../roomToParents'; + +export const useBindAtoms = (mx: MatrixClient) => { + useBindMDirectAtom(mx, mDirectAtom); + useBindAllInvitesAtom(mx, allInvitesAtom); + useBindAllRoomsAtom(mx, allRoomsAtom); + useBindRoomToParentsAtom(mx, roomToParentsAtom); + useBindMutedRoomsAtom(mx, mutedRoomsAtom); + useBindRoomToUnreadAtom(mx, roomToUnreadAtom, muteChangesAtom); +}; diff --git a/src/app/state/inviteList.ts b/src/app/state/inviteList.ts new file mode 100644 index 00000000..463fd352 --- /dev/null +++ b/src/app/state/inviteList.ts @@ -0,0 +1,32 @@ +import { atom, WritableAtom } from 'jotai'; +import { MatrixClient } from 'matrix-js-sdk'; +import { useMemo } from 'react'; +import { Membership } from '../../types/matrix/room'; +import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; + +const baseRoomsAtom = atom([]); +export const allInvitesAtom = atom( + (get) => get(baseRoomsAtom), + (get, set, action) => { + if (action.type === 'INITIALIZE') { + set(baseRoomsAtom, action.rooms); + return; + } + set(baseRoomsAtom, (ids) => { + const newIds = ids.filter((id) => id !== action.roomId); + if (action.type === 'PUT') newIds.push(action.roomId); + return newIds; + }); + } +); + +export const useBindAllInvitesAtom = ( + mx: MatrixClient, + allRooms: WritableAtom +) => { + useBindRoomsWithMembershipsAtom( + mx, + allRooms, + useMemo(() => [Membership.Invite], []) + ); +}; diff --git a/src/app/state/list.ts b/src/app/state/list.ts new file mode 100644 index 00000000..4f5a6191 --- /dev/null +++ b/src/app/state/list.ts @@ -0,0 +1,33 @@ +import { atom } from 'jotai'; + +export type ListAction = + | { + type: 'PUT'; + item: T | T[]; + } + | { + type: 'DELETE'; + item: T | T[]; + }; + +export const createListAtom = () => { + const baseListAtom = atom([]); + return atom>( + (get) => get(baseListAtom), + (get, set, action) => { + const items = get(baseListAtom); + const newItems = Array.isArray(action.item) ? action.item : [action.item]; + if (action.type === 'DELETE') { + set( + baseListAtom, + items.filter((item) => !newItems.includes(item)) + ); + return; + } + if (action.type === 'PUT') { + set(baseListAtom, [...items, ...newItems]); + } + } + ); +}; +export type TListAtom = ReturnType>; diff --git a/src/app/state/mDirectList.ts b/src/app/state/mDirectList.ts new file mode 100644 index 00000000..96e2f0d0 --- /dev/null +++ b/src/app/state/mDirectList.ts @@ -0,0 +1,47 @@ +import { atom, useSetAtom, WritableAtom } from 'jotai'; +import { ClientEvent, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { getAccountData, getMDirects } from '../utils/room'; + +export type MDirectAction = { + type: 'INITIALIZE' | 'UPDATE'; + rooms: Set; +}; + +const baseMDirectAtom = atom(new Set()); +export const mDirectAtom = atom, MDirectAction>( + (get) => get(baseMDirectAtom), + (get, set, action) => { + set(baseMDirectAtom, action.rooms); + } +); + +export const useBindMDirectAtom = ( + mx: MatrixClient, + mDirect: WritableAtom, MDirectAction> +) => { + const setMDirect = useSetAtom(mDirect); + + useEffect(() => { + const mDirectEvent = getAccountData(mx, AccountDataEvent.Direct); + if (mDirectEvent) { + setMDirect({ + type: 'INITIALIZE', + rooms: getMDirects(mDirectEvent), + }); + } + + const handleAccountData = (event: MatrixEvent) => { + setMDirect({ + type: 'UPDATE', + rooms: getMDirects(event), + }); + }; + + mx.on(ClientEvent.AccountData, handleAccountData); + return () => { + mx.removeListener(ClientEvent.AccountData, handleAccountData); + }; + }, [mx, setMDirect]); +}; diff --git a/src/app/state/mutedRoomList.ts b/src/app/state/mutedRoomList.ts new file mode 100644 index 00000000..d456f853 --- /dev/null +++ b/src/app/state/mutedRoomList.ts @@ -0,0 +1,101 @@ +import { atom, WritableAtom, useSetAtom } from 'jotai'; +import { ClientEvent, IPushRule, IPushRules, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { MuteChanges } from '../../types/matrix/room'; +import { findMutedRule, isMutedRule } from '../utils/room'; + +export type MutedRoomsUpdate = + | { + type: 'INITIALIZE'; + addRooms: string[]; + } + | { + type: 'UPDATE'; + addRooms: string[]; + removeRooms: string[]; + }; + +export const muteChangesAtom = atom({ + added: [], + removed: [], +}); + +const baseMutedRoomsAtom = atom(new Set()); +export const mutedRoomsAtom = atom, MutedRoomsUpdate>( + (get) => get(baseMutedRoomsAtom), + (get, set, action) => { + const mutedRooms = new Set([...get(mutedRoomsAtom)]); + if (action.type === 'INITIALIZE') { + set(baseMutedRoomsAtom, new Set([...action.addRooms])); + set(muteChangesAtom, { + added: [...action.addRooms], + removed: [], + }); + return; + } + if (action.type === 'UPDATE') { + action.removeRooms.forEach((roomId) => mutedRooms.delete(roomId)); + action.addRooms.forEach((roomId) => mutedRooms.add(roomId)); + set(baseMutedRoomsAtom, mutedRooms); + set(muteChangesAtom, { + added: [...action.addRooms], + removed: [...action.removeRooms], + }); + } + } +); + +export const useBindMutedRoomsAtom = ( + mx: MatrixClient, + mutedAtom: WritableAtom, MutedRoomsUpdate> +) => { + const setMuted = useSetAtom(mutedAtom); + + useEffect(() => { + const overrideRules = mx.getAccountData('m.push_rules')?.getContent() + ?.global?.override; + if (overrideRules) { + const mutedRooms = overrideRules.reduce((rooms, rule) => { + if (isMutedRule(rule)) rooms.push(rule.rule_id); + return rooms; + }, []); + setMuted({ + type: 'INITIALIZE', + addRooms: mutedRooms, + }); + } + }, [mx, setMuted]); + + useEffect(() => { + const handlePushRules = (mEvent: MatrixEvent, oldMEvent?: MatrixEvent) => { + if (mEvent.getType() === 'm.push_rules') { + const override = mEvent?.getContent()?.global?.override as IPushRule[] | undefined; + const oldOverride = oldMEvent?.getContent()?.global?.override as IPushRule[] | undefined; + if (!override || !oldOverride) return; + + const isMuteToggled = (rule: IPushRule, otherOverride: IPushRule[]) => { + const roomId = rule.rule_id; + + const isMuted = isMutedRule(rule); + if (!isMuted) return false; + const isOtherMuted = findMutedRule(otherOverride, roomId); + if (isOtherMuted) return false; + return true; + }; + + const mutedRules = override.filter((rule) => isMuteToggled(rule, oldOverride)); + const unMutedRules = oldOverride.filter((rule) => isMuteToggled(rule, override)); + + setMuted({ + type: 'UPDATE', + addRooms: mutedRules.map((rule) => rule.rule_id), + removeRooms: unMutedRules.map((rule) => rule.rule_id), + }); + } + }; + mx.on(ClientEvent.AccountData, handlePushRules); + return () => { + mx.removeListener(ClientEvent.AccountData, handlePushRules); + }; + }, [mx, setMuted]); +}; diff --git a/src/app/state/roomInputDrafts.ts b/src/app/state/roomInputDrafts.ts new file mode 100644 index 00000000..2708b8bd --- /dev/null +++ b/src/app/state/roomInputDrafts.ts @@ -0,0 +1,48 @@ +import { atom } from 'jotai'; +import { atomFamily } from 'jotai/utils'; +import { Descendant } from 'slate'; +import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { TListAtom, createListAtom } from './list'; +import { createUploadAtomFamily } from './upload'; +import { TUploadContent } from '../utils/matrix'; + +export const roomUploadAtomFamily = createUploadAtomFamily(); + +export type TUploadItem = { + file: TUploadContent; + originalFile: TUploadContent; + encInfo: EncryptedAttachmentInfo | undefined; +}; + +export const roomIdToUploadItemsAtomFamily = atomFamily>( + createListAtom +); + +export type RoomIdToMsgAction = + | { + type: 'PUT'; + roomId: string; + msg: Descendant[]; + } + | { + type: 'DELETE'; + roomId: string; + }; + +const createMsgDraftAtom = () => atom([]); +export type TMsgDraftAtom = ReturnType; +export const roomIdToMsgDraftAtomFamily = atomFamily(() => + createMsgDraftAtom() +); + +export type IReplyDraft = { + userId: string; + eventId: string; + body: string; + formattedBody?: string; +}; +const createReplyDraftAtom = () => atom(undefined); +export type TReplyDraftAtom = ReturnType; +export const roomIdToReplyDraftAtomFamily = atomFamily(() => + createReplyDraftAtom() +); diff --git a/src/app/state/roomList.ts b/src/app/state/roomList.ts new file mode 100644 index 00000000..7a793d8c --- /dev/null +++ b/src/app/state/roomList.ts @@ -0,0 +1,31 @@ +import { atom, WritableAtom } from 'jotai'; +import { MatrixClient } from 'matrix-js-sdk'; +import { useMemo } from 'react'; +import { Membership } from '../../types/matrix/room'; +import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; + +const baseRoomsAtom = atom([]); +export const allRoomsAtom = atom( + (get) => get(baseRoomsAtom), + (get, set, action) => { + if (action.type === 'INITIALIZE') { + set(baseRoomsAtom, action.rooms); + return; + } + set(baseRoomsAtom, (ids) => { + const newIds = ids.filter((id) => id !== action.roomId); + if (action.type === 'PUT') newIds.push(action.roomId); + return newIds; + }); + } +); +export const useBindAllRoomsAtom = ( + mx: MatrixClient, + allRooms: WritableAtom +) => { + useBindRoomsWithMembershipsAtom( + mx, + allRooms, + useMemo(() => [Membership.Join], []) + ); +}; diff --git a/src/app/state/roomToParents.ts b/src/app/state/roomToParents.ts new file mode 100644 index 00000000..374ddd57 --- /dev/null +++ b/src/app/state/roomToParents.ts @@ -0,0 +1,120 @@ +import produce from 'immer'; +import { atom, useSetAtom, WritableAtom } from 'jotai'; +import { + ClientEvent, + MatrixClient, + MatrixEvent, + Room, + RoomEvent, + RoomStateEvent, +} from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { Membership, RoomToParents, StateEvent } from '../../types/matrix/room'; +import { + getRoomToParents, + getSpaceChildren, + isSpace, + isValidChild, + mapParentWithChildren, +} from '../utils/room'; + +export type RoomToParentsAction = + | { + type: 'INITIALIZE'; + roomToParents: RoomToParents; + } + | { + type: 'PUT'; + parent: string; + children: string[]; + } + | { + type: 'DELETE'; + roomId: string; + }; + +const baseRoomToParents = atom(new Map()); +export const roomToParentsAtom = atom( + (get) => get(baseRoomToParents), + (get, set, action) => { + if (action.type === 'INITIALIZE') { + set(baseRoomToParents, action.roomToParents); + return; + } + if (action.type === 'PUT') { + set( + baseRoomToParents, + produce(get(baseRoomToParents), (draftRoomToParents) => { + mapParentWithChildren(draftRoomToParents, action.parent, action.children); + }) + ); + return; + } + if (action.type === 'DELETE') { + set( + baseRoomToParents, + produce(get(baseRoomToParents), (draftRoomToParents) => { + const noParentRooms: string[] = []; + draftRoomToParents.delete(action.roomId); + draftRoomToParents.forEach((parents, child) => { + parents.delete(action.roomId); + if (parents.size === 0) noParentRooms.push(child); + }); + noParentRooms.forEach((room) => draftRoomToParents.delete(room)); + }) + ); + } + } +); + +export const useBindRoomToParentsAtom = ( + mx: MatrixClient, + roomToParents: WritableAtom +) => { + const setRoomToParents = useSetAtom(roomToParents); + + useEffect(() => { + setRoomToParents({ type: 'INITIALIZE', roomToParents: getRoomToParents(mx) }); + + const handleAddRoom = (room: Room) => { + if (isSpace(room) && room.getMyMembership() !== Membership.Invite) { + setRoomToParents({ type: 'PUT', parent: room.roomId, children: getSpaceChildren(room) }); + } + }; + + const handleMembershipChange = (room: Room, membership: string) => { + if (isSpace(room) && membership === Membership.Join) { + setRoomToParents({ type: 'PUT', parent: room.roomId, children: getSpaceChildren(room) }); + } + }; + + const handleStateChange = (mEvent: MatrixEvent) => { + if (mEvent.getType() === StateEvent.SpaceChild) { + const childId = mEvent.getStateKey(); + const roomId = mEvent.getRoomId(); + if (childId && roomId) { + if (isValidChild(mEvent)) { + setRoomToParents({ type: 'PUT', parent: roomId, children: [childId] }); + } else { + setRoomToParents({ type: 'DELETE', roomId: childId }); + } + } + } + }; + + const handleDeleteRoom = (roomId: string) => { + setRoomToParents({ type: 'DELETE', roomId }); + }; + + mx.on(ClientEvent.Room, handleAddRoom); + mx.on(RoomEvent.MyMembership, handleMembershipChange); + mx.on(RoomStateEvent.Events, handleStateChange); + mx.on(ClientEvent.DeleteRoom, handleDeleteRoom); + return () => { + mx.removeListener(ClientEvent.Room, handleAddRoom); + mx.removeListener(RoomEvent.MyMembership, handleMembershipChange); + mx.removeListener(RoomStateEvent.Events, handleStateChange); + mx.removeListener(ClientEvent.DeleteRoom, handleDeleteRoom); + }; + }, [mx, setRoomToParents]); +}; diff --git a/src/app/state/roomToUnread.ts b/src/app/state/roomToUnread.ts new file mode 100644 index 00000000..0c7b6bd6 --- /dev/null +++ b/src/app/state/roomToUnread.ts @@ -0,0 +1,219 @@ +import produce from 'immer'; +import { atom, useSetAtom, PrimitiveAtom, WritableAtom, useAtomValue } from 'jotai'; +import { IRoomTimelineData, MatrixClient, MatrixEvent, Room, RoomEvent } from 'matrix-js-sdk'; +import { ReceiptContent, ReceiptType } from 'matrix-js-sdk/lib/@types/read_receipts'; +import { useEffect } from 'react'; +import { + MuteChanges, + Membership, + NotificationType, + RoomToUnread, + UnreadInfo, +} from '../../types/matrix/room'; +import { + getAllParents, + getNotificationType, + getUnreadInfo, + getUnreadInfos, + isNotificationEvent, + roomHaveUnread, +} from '../utils/room'; +import { roomToParentsAtom } from './roomToParents'; + +export type RoomToUnreadAction = + | { + type: 'RESET'; + unreadInfos: UnreadInfo[]; + } + | { + type: 'PUT'; + unreadInfo: UnreadInfo; + } + | { + type: 'DELETE'; + roomId: string; + }; + +const putUnreadInfo = ( + roomToUnread: RoomToUnread, + allParents: Set, + unreadInfo: UnreadInfo +) => { + const oldUnread = roomToUnread.get(unreadInfo.roomId) ?? { highlight: 0, total: 0, from: null }; + roomToUnread.set(unreadInfo.roomId, { + highlight: unreadInfo.highlight, + total: unreadInfo.total, + from: null, + }); + + const newH = unreadInfo.highlight - oldUnread.highlight; + const newT = unreadInfo.total - oldUnread.total; + + allParents.forEach((parentId) => { + const oldParentUnread = roomToUnread.get(parentId) ?? { highlight: 0, total: 0, from: null }; + roomToUnread.set(parentId, { + highlight: (oldParentUnread.highlight += newH), + total: (oldParentUnread.total += newT), + from: new Set([...(oldParentUnread.from ?? []), unreadInfo.roomId]), + }); + }); +}; + +const deleteUnreadInfo = (roomToUnread: RoomToUnread, allParents: Set, roomId: string) => { + const oldUnread = roomToUnread.get(roomId); + if (!oldUnread) return; + roomToUnread.delete(roomId); + + allParents.forEach((parentId) => { + const oldParentUnread = roomToUnread.get(parentId); + if (!oldParentUnread) return; + const newFrom = new Set([...(oldParentUnread.from ?? roomId)]); + newFrom.delete(roomId); + if (newFrom.size === 0) { + roomToUnread.delete(parentId); + return; + } + roomToUnread.set(parentId, { + highlight: oldParentUnread.highlight - oldUnread.highlight, + total: oldParentUnread.total - oldUnread.total, + from: newFrom, + }); + }); +}; + +const baseRoomToUnread = atom(new Map()); +export const roomToUnreadAtom = atom( + (get) => get(baseRoomToUnread), + (get, set, action) => { + if (action.type === 'RESET') { + const draftRoomToUnread: RoomToUnread = new Map(); + action.unreadInfos.forEach((unreadInfo) => { + putUnreadInfo( + draftRoomToUnread, + getAllParents(get(roomToParentsAtom), unreadInfo.roomId), + unreadInfo + ); + }); + set(baseRoomToUnread, draftRoomToUnread); + return; + } + if (action.type === 'PUT') { + set( + baseRoomToUnread, + produce(get(baseRoomToUnread), (draftRoomToUnread) => + putUnreadInfo( + draftRoomToUnread, + getAllParents(get(roomToParentsAtom), action.unreadInfo.roomId), + action.unreadInfo + ) + ) + ); + return; + } + if (action.type === 'DELETE' && get(baseRoomToUnread).has(action.roomId)) { + set( + baseRoomToUnread, + produce(get(baseRoomToUnread), (draftRoomToUnread) => + deleteUnreadInfo( + draftRoomToUnread, + getAllParents(get(roomToParentsAtom), action.roomId), + action.roomId + ) + ) + ); + } + } +); + +export const useBindRoomToUnreadAtom = ( + mx: MatrixClient, + unreadAtom: WritableAtom, + muteChangesAtom: PrimitiveAtom +) => { + const setUnreadAtom = useSetAtom(unreadAtom); + const muteChanges = useAtomValue(muteChangesAtom); + + useEffect(() => { + setUnreadAtom({ + type: 'RESET', + unreadInfos: getUnreadInfos(mx), + }); + }, [mx, setUnreadAtom]); + + useEffect(() => { + const handleTimelineEvent = ( + mEvent: MatrixEvent, + room: Room | undefined, + toStartOfTimeline: boolean | undefined, + removed: boolean, + data: IRoomTimelineData + ) => { + if (!room || !data.liveEvent || room.isSpaceRoom() || !isNotificationEvent(mEvent)) return; + if (getNotificationType(mx, room.roomId) === NotificationType.Mute) { + setUnreadAtom({ + type: 'DELETE', + roomId: room.roomId, + }); + return; + } + + if (mEvent.getSender() === mx.getUserId()) return; + setUnreadAtom({ type: 'PUT', unreadInfo: getUnreadInfo(room) }); + }; + mx.on(RoomEvent.Timeline, handleTimelineEvent); + return () => { + mx.removeListener(RoomEvent.Timeline, handleTimelineEvent); + }; + }, [mx, setUnreadAtom]); + + useEffect(() => { + const handleReceipt = (mEvent: MatrixEvent, room: Room) => { + if (mEvent.getType() === 'm.receipt') { + const myUserId = mx.getUserId(); + if (!myUserId) return; + if (room.isSpaceRoom()) return; + const content = mEvent.getContent(); + + const isMyReceipt = Object.keys(content).find((eventId) => + (Object.keys(content[eventId]) as ReceiptType[]).find( + (receiptType) => content[eventId][receiptType][myUserId] + ) + ); + if (isMyReceipt) { + setUnreadAtom({ type: 'DELETE', roomId: room.roomId }); + } + } + }; + mx.on(RoomEvent.Receipt, handleReceipt); + return () => { + mx.removeListener(RoomEvent.Receipt, handleReceipt); + }; + }, [mx, setUnreadAtom]); + + useEffect(() => { + muteChanges.removed.forEach((roomId) => { + const room = mx.getRoom(roomId); + if (!room) return; + if (!roomHaveUnread(mx, room)) return; + setUnreadAtom({ type: 'PUT', unreadInfo: getUnreadInfo(room) }); + }); + muteChanges.added.forEach((roomId) => { + setUnreadAtom({ type: 'DELETE', roomId }); + }); + }, [mx, setUnreadAtom, muteChanges]); + + useEffect(() => { + const handleMembershipChange = (room: Room, membership: string) => { + if (membership !== Membership.Join) { + setUnreadAtom({ + type: 'DELETE', + roomId: room.roomId, + }); + } + }; + mx.on(RoomEvent.MyMembership, handleMembershipChange); + return () => { + mx.removeListener(RoomEvent.MyMembership, handleMembershipChange); + }; + }, [mx, setUnreadAtom]); +}; diff --git a/src/app/state/selectedRoom.ts b/src/app/state/selectedRoom.ts new file mode 100644 index 00000000..1ef04de3 --- /dev/null +++ b/src/app/state/selectedRoom.ts @@ -0,0 +1,3 @@ +import { atom } from 'jotai'; + +export const selectedRoomAtom = atom(undefined); diff --git a/src/app/state/selectedTab.ts b/src/app/state/selectedTab.ts new file mode 100644 index 00000000..e680ae60 --- /dev/null +++ b/src/app/state/selectedTab.ts @@ -0,0 +1,8 @@ +import { atom } from 'jotai'; + +export enum SidebarTab { + Home = 'Home', + People = 'People', +} + +export const selectedTabAtom = atom(SidebarTab.Home); diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts new file mode 100644 index 00000000..7739c589 --- /dev/null +++ b/src/app/state/settings.ts @@ -0,0 +1,49 @@ +import { atom } from 'jotai'; + +const STORAGE_KEY = 'settings'; +export interface Settings { + themeIndex: number; + useSystemTheme: boolean; + isMarkdown: boolean; + editorToolbar: boolean; + isPeopleDrawer: boolean; + + hideMembershipEvents: boolean; + hideNickAvatarEvents: boolean; + + showNotifications: boolean; + isNotificationSounds: boolean; +} + +const defaultSettings: Settings = { + themeIndex: 0, + useSystemTheme: true, + isMarkdown: true, + editorToolbar: false, + isPeopleDrawer: true, + + hideMembershipEvents: false, + hideNickAvatarEvents: true, + + showNotifications: true, + isNotificationSounds: true, +}; + +export const getSettings = () => { + const settings = localStorage.getItem(STORAGE_KEY); + if (settings === null) return defaultSettings; + return JSON.parse(settings) as Settings; +}; + +export const setSettings = (settings: Settings) => { + localStorage.setItem(STORAGE_KEY, JSON.stringify(settings)); +}; + +const baseSettings = atom(getSettings()); +export const settingsAtom = atom( + (get) => get(baseSettings), + (get, set, update) => { + set(baseSettings, update); + setSettings(update); + } +); diff --git a/src/app/state/tabToRoom.ts b/src/app/state/tabToRoom.ts new file mode 100644 index 00000000..2f4ee92a --- /dev/null +++ b/src/app/state/tabToRoom.ts @@ -0,0 +1,34 @@ +import produce from 'immer'; +import { atom } from 'jotai'; +import { MatrixClient } from 'matrix-js-sdk'; + +type RoomInfo = { + roomId: string; + timestamp: number; +}; +type TabToRoom = Map; + +type TabToRoomAction = { + type: 'PUT'; + tabInfo: { tabId: string; roomInfo: RoomInfo }; +}; + +const baseTabToRoom = atom(new Map()); +export const tabToRoomAtom = atom( + (get) => get(baseTabToRoom), + (get, set, action) => { + if (action.type === 'PUT') { + set( + baseTabToRoom, + produce(get(baseTabToRoom), (draft) => { + draft.set(action.tabInfo.tabId, action.tabInfo.roomInfo); + }) + ); + } + } +); + +export const useBindTabToRoomAtom = (mx: MatrixClient) => { + console.log(mx); + // TODO: +}; diff --git a/src/app/state/upload.ts b/src/app/state/upload.ts new file mode 100644 index 00000000..d92b93d3 --- /dev/null +++ b/src/app/state/upload.ts @@ -0,0 +1,146 @@ +import { atom, useAtom } from 'jotai'; +import { atomFamily } from 'jotai/utils'; +import { MatrixClient, UploadResponse, UploadProgress, MatrixError } from 'matrix-js-sdk'; +import { useCallback } from 'react'; +import { useThrottle } from '../hooks/useThrottle'; +import { uploadContent, TUploadContent } from '../utils/matrix'; + +export enum UploadStatus { + Idle = 'idle', + Loading = 'loading', + Success = 'success', + Error = 'error', +} + +export type UploadIdle = { + file: TUploadContent; + status: UploadStatus.Idle; +}; + +export type UploadLoading = { + file: TUploadContent; + status: UploadStatus.Loading; + promise: Promise; + progress: UploadProgress; +}; + +export type UploadSuccess = { + file: TUploadContent; + status: UploadStatus.Success; + mxc: string; +}; + +export type UploadError = { + file: TUploadContent; + status: UploadStatus.Error; + error: MatrixError; +}; + +export type Upload = UploadIdle | UploadLoading | UploadSuccess | UploadError; + +export type UploadAtomAction = + | { + promise: Promise; + } + | { + progress: UploadProgress; + } + | { + mxc: string; + } + | { + error: MatrixError; + }; + +export const createUploadAtom = (file: TUploadContent) => { + const baseUploadAtom = atom({ + file, + status: UploadStatus.Idle, + }); + return atom( + (get) => get(baseUploadAtom), + (get, set, update) => { + const uploadState = get(baseUploadAtom); + if ('promise' in update) { + set(baseUploadAtom, { + status: UploadStatus.Loading, + file, + promise: update.promise, + progress: { loaded: 0, total: file.size }, + }); + return; + } + if ('progress' in update && uploadState.status === UploadStatus.Loading) { + set(baseUploadAtom, { + ...uploadState, + progress: update.progress, + }); + return; + } + if ('mxc' in update) { + set(baseUploadAtom, { + status: UploadStatus.Success, + file, + mxc: update.mxc, + }); + return; + } + if ('error' in update) { + set(baseUploadAtom, { + status: UploadStatus.Error, + file, + error: update.error, + }); + } + } + ); +}; +export type TUploadAtom = ReturnType; + +export const useBindUploadAtom = ( + mx: MatrixClient, + file: TUploadContent, + uploadAtom: TUploadAtom, + hideFilename?: boolean +) => { + const [upload, setUpload] = useAtom(uploadAtom); + + const handleProgress = useThrottle( + useCallback((progress: UploadProgress) => setUpload({ progress }), [setUpload]), + { immediate: true, wait: 200 } + ); + + const startUpload = useCallback( + () => + uploadContent(mx, file, { + hideFilename, + onPromise: (promise: Promise) => setUpload({ promise }), + onProgress: handleProgress, + onSuccess: (mxc) => setUpload({ mxc }), + onError: (error) => setUpload({ error }), + }), + [mx, file, hideFilename, setUpload, handleProgress] + ); + + const cancelUpload = useCallback(async () => { + if (upload.status === UploadStatus.Loading) { + await mx.cancelUpload(upload.promise); + } + }, [mx, upload]); + + return { + upload, + startUpload, + cancelUpload, + }; +}; + +export const createUploadAtomFamily = () => + atomFamily(createUploadAtom); +export type TUploadAtomFamily = ReturnType; + +export const createUploadFamilyObserverAtom = ( + uploadFamily: TUploadAtomFamily, + uploads: TUploadContent[] +) => atom((get) => uploads.map((upload) => get(uploadFamily(upload)))); +export type TUploadFamilyObserverAtom = ReturnType; diff --git a/src/app/state/utils.ts b/src/app/state/utils.ts new file mode 100644 index 00000000..355c9411 --- /dev/null +++ b/src/app/state/utils.ts @@ -0,0 +1,64 @@ +import { useSetAtom, WritableAtom } from 'jotai'; +import { ClientEvent, MatrixClient, Room, RoomEvent } from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { Membership } from '../../types/matrix/room'; + +export type RoomsAction = + | { + type: 'INITIALIZE'; + rooms: string[]; + } + | { + type: 'PUT' | 'DELETE'; + roomId: string; + }; + +export const useBindRoomsWithMembershipsAtom = ( + mx: MatrixClient, + roomsAtom: WritableAtom, + memberships: Membership[] +) => { + const setRoomsAtom = useSetAtom(roomsAtom); + + useEffect(() => { + const satisfyMembership = (room: Room): boolean => + !!memberships.find((membership) => membership === room.getMyMembership()); + setRoomsAtom({ + type: 'INITIALIZE', + rooms: mx + .getRooms() + .filter(satisfyMembership) + .map((room) => room.roomId), + }); + + const handleAddRoom = (room: Room) => { + if (satisfyMembership(room)) { + setRoomsAtom({ type: 'PUT', roomId: room.roomId }); + } + }; + + const handleMembershipChange = (room: Room) => { + if (!satisfyMembership(room)) { + setRoomsAtom({ type: 'DELETE', roomId: room.roomId }); + } + }; + + const handleDeleteRoom = (roomId: string) => { + setRoomsAtom({ type: 'DELETE', roomId }); + }; + + mx.on(ClientEvent.Room, handleAddRoom); + mx.on(RoomEvent.MyMembership, handleMembershipChange); + mx.on(ClientEvent.DeleteRoom, handleDeleteRoom); + return () => { + mx.removeListener(ClientEvent.Room, handleAddRoom); + mx.removeListener(RoomEvent.MyMembership, handleMembershipChange); + mx.removeListener(ClientEvent.DeleteRoom, handleDeleteRoom); + }; + }, [mx, memberships, setRoomsAtom]); +}; + +export const compareRoomsEqual = (a: string[], b: string[]) => { + if (a.length !== b.length) return false; + return a.every((roomId, roomIdIndex) => roomId === b[roomIdIndex]); +}; diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index d83845b8..cc9d88fa 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -18,14 +18,13 @@ import EmojiBoardOpener from '../../organisms/emoji-board/EmojiBoardOpener'; import initMatrix from '../../../client/initMatrix'; import navigation from '../../../client/state/navigation'; import cons from '../../../client/state/cons'; -import DragDrop from '../../organisms/drag-drop/DragDrop'; import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; +import { MatrixClientProvider } from '../../hooks/useMatrixClient'; function Client() { const [isLoading, changeLoading] = useState(true); const [loadingMsg, setLoadingMsg] = useState('Heating up'); - const [dragCounter, setDragCounter] = useState(0); const classNameHidden = 'client__item-hidden'; const navWrapperRef = useRef(null); @@ -44,19 +43,17 @@ function Client() { navigation.on(cons.events.navigation.ROOM_SELECTED, onRoomSelected); navigation.on(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); - return (() => { + return () => { navigation.removeListener(cons.events.navigation.ROOM_SELECTED, onRoomSelected); navigation.removeListener(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); - }); + }; }, []); useEffect(() => { + changeLoading(true); let counter = 0; const iId = setInterval(() => { - const msgList = [ - 'Almost there...', - 'Looks like you have a lot of stuff to heat up!', - ]; + const msgList = ['Almost there...', 'Looks like you have a lot of stuff to heat up!']; if (counter === msgList.length - 1) { setLoadingMsg(msgList[msgList.length - 1]); clearInterval(iId); @@ -80,103 +77,48 @@ function Client() {
    initMatrix.clearCacheAndReload()}> Clear cache & reload initMatrix.logout()}>Logout + } + render={(toggle) => ( + )} - render={(toggle) => } />
    - {loadingMsg} + + {loadingMsg} +
    - Cinny + + Cinny +
    ); } - function dragContainsFiles(e) { - if (!e.dataTransfer.types) return false; - - for (let i = 0; i < e.dataTransfer.types.length; i += 1) { - if (e.dataTransfer.types[i] === 'Files') return true; - } - return false; - } - - function modalOpen() { - return navigation.isRawModalVisible && dragCounter <= 0; - } - - function handleDragOver(e) { - if (!dragContainsFiles(e)) return; - - e.preventDefault(); - - if (!navigation.selectedRoomId || modalOpen()) { - e.dataTransfer.dropEffect = 'none'; - } - } - - function handleDragEnter(e) { - e.preventDefault(); - - if (navigation.selectedRoomId && !modalOpen() && dragContainsFiles(e)) { - setDragCounter(dragCounter + 1); - } - } - - function handleDragLeave(e) { - e.preventDefault(); - - if (navigation.selectedRoomId && !modalOpen() && dragContainsFiles(e)) { - setDragCounter(dragCounter - 1); - } - } - - function handleDrop(e) { - e.preventDefault(); - - setDragCounter(0); - - if (modalOpen()) return; - - const roomId = navigation.selectedRoomId; - if (!roomId) return; - - const { files } = e.dataTransfer; - if (!files?.length) return; - const file = files[0]; - initMatrix.roomsInput.setAttachment(roomId, file); - initMatrix.roomsInput.emit(cons.events.roomsInput.ATTACHMENT_SET, file); - } - return ( -
    -
    - + +
    +
    + +
    +
    + +
    + + + +
    -
    - -
    - - - - - -
    + ); } diff --git a/src/app/utils/AsyncSearch.ts b/src/app/utils/AsyncSearch.ts new file mode 100644 index 00000000..4baacf04 --- /dev/null +++ b/src/app/utils/AsyncSearch.ts @@ -0,0 +1,102 @@ +export type NormalizeOption = { + caseSensitive?: boolean; + normalizeUnicode?: boolean; + ignoreWhitespace?: boolean; +}; + +export type MatchQueryOption = { + contain?: boolean; +}; + +export type AsyncSearchOption = { + limit?: number; +}; + +export type MatchHandler = ( + item: TSearchItem, + query: string +) => boolean; +export type ResultHandler = ( + results: TSearchItem[], + query: string +) => void; + +export type AsyncSearchHandler = (query: string) => void; +export type TerminateAsyncSearch = () => void; + +export const normalize = (str: string, options?: NormalizeOption) => { + let nStr = str.normalize(options?.normalizeUnicode ?? true ? 'NFKC' : 'NFC'); + if (!options?.caseSensitive) nStr = nStr.toLocaleLowerCase(); + if (options?.ignoreWhitespace ?? true) nStr = nStr.replace(/\s/g, ''); + return nStr; +}; + +export const matchQuery = (item: string, query: string, options?: MatchQueryOption): boolean => { + if (options?.contain) return item.indexOf(query) !== -1; + return item.startsWith(query); +}; + +export const AsyncSearch = ( + list: TSearchItem[], + match: MatchHandler, + onResult: ResultHandler, + options?: AsyncSearchOption +): [AsyncSearchHandler, TerminateAsyncSearch] => { + let resultList: TSearchItem[] = []; + + let searchIndex = 0; + let sessionStartTimestamp = 0; + let sessionScheduleId: number | undefined; + + const terminateSearch: TerminateAsyncSearch = () => { + resultList = []; + searchIndex = 0; + sessionStartTimestamp = 0; + if (sessionScheduleId) clearTimeout(sessionScheduleId); + sessionScheduleId = undefined; + }; + + const find = (query: string, sessionTimestamp: number) => { + const findingCount = resultList.length; + sessionScheduleId = undefined; + // return if find session got reset + if (sessionTimestamp !== sessionStartTimestamp) return; + + sessionStartTimestamp = window.performance.now(); + for (; searchIndex < list.length; searchIndex += 1) { + if (match(list[searchIndex], query)) { + resultList.push(list[searchIndex]); + if (typeof options?.limit === 'number' && resultList.length >= options.limit) { + break; + } + } + + const matchFinishTime = window.performance.now(); + if (matchFinishTime - sessionStartTimestamp > 8) { + const currentFindingCount = resultList.length; + const thisSessionTimestamp = sessionStartTimestamp; + if (findingCount !== currentFindingCount) onResult(resultList, query); + + searchIndex += 1; + sessionScheduleId = window.setTimeout(() => find(query, thisSessionTimestamp), 1); + return; + } + } + + if (findingCount !== resultList.length || findingCount === 0) { + onResult(resultList, query); + } + terminateSearch(); + }; + + const search: AsyncSearchHandler = (query: string) => { + terminateSearch(); + if (query === '') { + onResult(resultList, query); + return; + } + find(query, sessionStartTimestamp); + }; + + return [search, terminateSearch]; +}; diff --git a/src/app/utils/blurHash.ts b/src/app/utils/blurHash.ts new file mode 100644 index 00000000..0de5a922 --- /dev/null +++ b/src/app/utils/blurHash.ts @@ -0,0 +1,19 @@ +import { encode } from 'blurhash'; + +export const MATRIX_BLUR_HASH_PROPERTY_NAME = 'xyz.amorgan.blurhash'; + +export const encodeBlurHash = ( + img: HTMLImageElement | HTMLVideoElement, + width?: number, + height?: number +): string | undefined => { + const canvas = document.createElement('canvas'); + canvas.width = width || img.width; + canvas.height = height || img.height; + const context = canvas.getContext('2d'); + + if (!context) return undefined; + context.drawImage(img, 0, 0, canvas.width, canvas.height); + const data = context.getImageData(0, 0, canvas.width, canvas.height); + return encode(data.data, data.width, data.height, 4, 4); +}; diff --git a/src/app/utils/common.ts b/src/app/utils/common.ts new file mode 100644 index 00000000..d3804ae8 --- /dev/null +++ b/src/app/utils/common.ts @@ -0,0 +1,32 @@ +import { IconName, IconSrc } from 'folds'; + +export const bytesToSize = (bytes: number): string => { + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + if (bytes === 0) return '0KB'; + + let sizeIndex = Math.floor(Math.log(bytes) / Math.log(1000)); + + if (sizeIndex === 0) sizeIndex = 1; + + return `${(bytes / 1000 ** sizeIndex).toFixed(1)} ${sizes[sizeIndex]}`; +}; + +export const getFileTypeIcon = (icons: Record, fileType: string): IconSrc => { + const type = fileType.toLowerCase(); + if (type.startsWith('audio')) { + return icons.Play; + } + if (type.startsWith('video')) { + return icons.Vlc; + } + if (type.startsWith('image')) { + return icons.Photo; + } + return icons.File; +}; + +export const fulfilledPromiseSettledResult = (prs: PromiseSettledResult[]): T[] => + prs.reduce((values, pr) => { + if (pr.status === 'fulfilled') values.push(pr.value); + return values; + }, []); diff --git a/src/app/utils/disposable.ts b/src/app/utils/disposable.ts new file mode 100644 index 00000000..7840fe49 --- /dev/null +++ b/src/app/utils/disposable.ts @@ -0,0 +1,8 @@ +export type DisposeCallback = (...args: Q) => R; +export type DisposableContext

    = ( + ...args: P +) => DisposeCallback; + +export const disposable =

    ( + context: DisposableContext +) => context; diff --git a/src/app/utils/dom.ts b/src/app/utils/dom.ts new file mode 100644 index 00000000..d717adf2 --- /dev/null +++ b/src/app/utils/dom.ts @@ -0,0 +1,133 @@ +export const targetFromEvent = (evt: Event, selector: string): Element | undefined => { + const targets = evt.composedPath() as Element[]; + return targets.find((target) => target.matches?.(selector)); +}; + +export const editableActiveElement = (): boolean => + !!document.activeElement && + /^(input)|(textarea)$/.test(document.activeElement.nodeName.toLowerCase()); + +export const inVisibleScrollArea = ( + scrollElement: HTMLElement, + childElement: HTMLElement +): boolean => { + const scrollTop = scrollElement.offsetTop + scrollElement.scrollTop; + const scrollBottom = scrollTop + scrollElement.offsetHeight; + + const childTop = childElement.offsetTop; + const childBottom = childTop + childElement.clientHeight; + + if (childTop >= scrollTop && childTop < scrollBottom) return true; + if (childTop < scrollTop && childBottom > scrollTop) return true; + return false; +}; + +export type FilesOrFile = T extends true ? File[] : File; + +export const selectFile = ( + accept: string, + multiple?: M +): Promise | undefined> => + new Promise((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + if (accept) input.accept = accept; + if (multiple) input.multiple = true; + + const changeHandler = () => { + const fileList = input.files; + if (!fileList) { + resolve(undefined); + } else { + const files: File[] = [...fileList].filter((file) => file); + resolve((multiple ? files : files[0]) as FilesOrFile); + } + input.removeEventListener('change', changeHandler); + }; + + input.addEventListener('change', changeHandler); + input.click(); + }); + +export const getDataTransferFiles = (dataTransfer: DataTransfer): File[] | undefined => { + const fileList = dataTransfer.files; + const files = [...fileList].filter((file) => file); + if (files.length === 0) return undefined; + return files; +}; + +export const getImageUrlBlob = async (url: string) => { + const res = await fetch(url); + const blob = await res.blob(); + return blob; +}; + +export const getImageFileUrl = (fileOrBlob: File | Blob) => URL.createObjectURL(fileOrBlob); + +export const getVideoFileUrl = (fileOrBlob: File | Blob) => URL.createObjectURL(fileOrBlob); + +export const loadImageElement = (url: string): Promise => + new Promise((resolve, reject) => { + const img = document.createElement('img'); + img.onload = () => resolve(img); + img.onerror = (err) => reject(err); + img.src = url; + }); + +export const loadVideoElement = (url: string): Promise => + new Promise((resolve, reject) => { + const video = document.createElement('video'); + video.preload = 'metadata'; + video.playsInline = true; + video.muted = true; + + video.onloadeddata = () => { + resolve(video); + video.pause(); + }; + video.onerror = (e) => { + reject(e); + }; + + video.src = url; + video.load(); + video.play(); + }); + +export const getThumbnailDimensions = (width: number, height: number): [number, number] => { + const MAX_WIDTH = 400; + const MAX_HEIGHT = 300; + let targetWidth = width; + let targetHeight = height; + if (targetHeight > MAX_HEIGHT) { + targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight)); + targetHeight = MAX_HEIGHT; + } + if (targetWidth > MAX_WIDTH) { + targetHeight = Math.floor(targetHeight * (MAX_WIDTH / targetWidth)); + targetWidth = MAX_WIDTH; + } + return [targetWidth, targetHeight]; +}; + +export const getThumbnail = ( + img: HTMLImageElement | SVGImageElement | HTMLVideoElement, + width: number, + height: number, + thumbnailMimeType?: string +): Promise => + new Promise((resolve) => { + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext('2d'); + if (!context) { + resolve(undefined); + return; + } + context.drawImage(img, 0, 0, width, height); + + canvas.toBlob((thumbnail) => { + resolve(thumbnail ?? undefined); + }, thumbnailMimeType ?? 'image/jpeg'); + }); diff --git a/src/app/utils/key-symbol.ts b/src/app/utils/key-symbol.ts new file mode 100644 index 00000000..7e758fd9 --- /dev/null +++ b/src/app/utils/key-symbol.ts @@ -0,0 +1,6 @@ +export enum KeySymbol { + Command = '⌘', + Shift = '⇧', + Option = '⌥', + Control = '⌃', +} diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts new file mode 100644 index 00000000..56eeb9fc --- /dev/null +++ b/src/app/utils/keyboard.ts @@ -0,0 +1,25 @@ +import isHotkey from 'is-hotkey'; +import { KeyboardEventHandler } from 'react'; + +export interface KeyboardEventLike { + key: string; + which: number; + altKey: boolean; + ctrlKey: boolean; + metaKey: boolean; + shiftKey: boolean; + preventDefault(): void; +} + +export const onTabPress = (evt: KeyboardEventLike, callback: () => void) => { + if (isHotkey('tab', evt)) { + evt.preventDefault(); + callback(); + } +}; + +export const preventScrollWithArrowKey: KeyboardEventHandler = (evt) => { + if (isHotkey(['arrowup', 'arrowright', 'arrowdown', 'arrowleft'], evt)) { + evt.preventDefault(); + } +}; diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts new file mode 100644 index 00000000..7f2fc0f2 --- /dev/null +++ b/src/app/utils/matrix.ts @@ -0,0 +1,118 @@ +import { EncryptedAttachmentInfo, encryptAttachment } from 'browser-encrypt-attachment'; +import { MatrixClient, MatrixError, UploadProgress, UploadResponse } from 'matrix-js-sdk'; +import { IImageInfo, IThumbnailContent, IVideoInfo } from '../../types/matrix/common'; + +export const matchMxId = (id: string): RegExpMatchArray | null => + id.match(/^([@!$+#])(\S+):(\S+)$/); + +export const validMxId = (id: string): boolean => !!matchMxId(id); + +export const getMxIdServer = (userId: string): string | undefined => matchMxId(userId)?.[3]; + +export const getMxIdLocalPart = (userId: string): string | undefined => matchMxId(userId)?.[2]; + +export const isUserId = (id: string): boolean => validMxId(id) && id.startsWith('@'); + +export const getImageInfo = (img: HTMLImageElement, fileOrBlob: File | Blob): IImageInfo => { + const info: IImageInfo = {}; + info.w = img.width; + info.h = img.height; + info.mimetype = fileOrBlob.type; + info.size = fileOrBlob.size; + return info; +}; + +export const getVideoInfo = (video: HTMLVideoElement, fileOrBlob: File | Blob): IVideoInfo => { + const info: IVideoInfo = {}; + info.duration = Number.isNaN(video.duration) ? undefined : video.duration; + info.w = video.videoWidth; + info.h = video.videoHeight; + info.mimetype = fileOrBlob.type; + info.size = fileOrBlob.size; + return info; +}; + +export const getThumbnailContent = (thumbnailInfo: { + thumbnail: File | Blob; + encInfo: EncryptedAttachmentInfo | undefined; + mxc: string; + width: number; + height: number; +}): IThumbnailContent => { + const { thumbnail, encInfo, mxc, width, height } = thumbnailInfo; + + const content: IThumbnailContent = { + thumbnail_info: { + mimetype: thumbnail.type, + size: thumbnail.size, + w: width, + h: height, + }, + }; + if (encInfo) { + content.thumbnail_file = { + ...encInfo, + url: mxc, + }; + } else { + content.thumbnail_url = mxc; + } + return content; +}; + +export const encryptFile = async ( + file: File | Blob +): Promise<{ + encInfo: EncryptedAttachmentInfo; + file: File; + originalFile: File | Blob; +}> => { + const dataBuffer = await file.arrayBuffer(); + const encryptedAttachment = await encryptAttachment(dataBuffer); + const encFile = new File([encryptedAttachment.data], file.name, { + type: file.type, + }); + return { + encInfo: encryptedAttachment.info, + file: encFile, + originalFile: file, + }; +}; + +export type TUploadContent = File | Blob; + +export type ContentUploadOptions = { + name?: string; + fileType?: string; + hideFilename?: boolean; + onPromise?: (promise: Promise) => void; + onProgress?: (progress: UploadProgress) => void; + onSuccess: (mxc: string) => void; + onError: (error: MatrixError) => void; +}; + +export const uploadContent = async ( + mx: MatrixClient, + file: TUploadContent, + options: ContentUploadOptions +) => { + const { name, fileType, hideFilename, onProgress, onPromise, onSuccess, onError } = options; + + const uploadPromise = mx.uploadContent(file, { + name, + type: fileType, + includeFilename: !hideFilename, + progressHandler: onProgress, + }); + onPromise?.(uploadPromise); + try { + const data = await uploadPromise; + const mxc = data.content_uri; + if (mxc) onSuccess(mxc); + else onError(new MatrixError(data)); + } catch (e: any) { + const error = typeof e?.message === 'string' ? e.message : undefined; + const errcode = typeof e?.name === 'string' ? e.message : undefined; + onError(new MatrixError({ error, errcode })); + } +}; diff --git a/src/app/utils/mimeTypes.ts b/src/app/utils/mimeTypes.ts new file mode 100644 index 00000000..c432bdc3 --- /dev/null +++ b/src/app/utils/mimeTypes.ts @@ -0,0 +1,47 @@ +// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts +export const ALLOWED_BLOB_MIMETYPES = [ + 'image/jpeg', + 'image/gif', + 'image/png', + 'image/apng', + 'image/webp', + 'image/avif', + + 'video/mp4', + 'video/webm', + 'video/ogg', + 'video/quicktime', + + 'audio/mp4', + 'audio/webm', + 'audio/aac', + 'audio/mpeg', + 'audio/ogg', + 'audio/wave', + 'audio/wav', + 'audio/x-wav', + 'audio/x-pn-wav', + 'audio/flac', + 'audio/x-flac', +]; + +export const getBlobSafeMimeType = (mimeType: string) => { + if (typeof mimeType !== 'string') return 'application/octet-stream'; + const [type] = mimeType.split(';'); + if (!ALLOWED_BLOB_MIMETYPES.includes(type)) { + return 'application/octet-stream'; + } + // Required for Chromium browsers + if (type === 'video/quicktime') { + return 'video/mp4'; + } + return type; +}; + +export const safeFile = (f: File) => { + const safeType = getBlobSafeMimeType(f.type); + if (safeType !== f.type) { + return new File([f], f.name, { type: safeType }); + } + return f; +}; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts new file mode 100644 index 00000000..daf95600 --- /dev/null +++ b/src/app/utils/room.ts @@ -0,0 +1,265 @@ +import { IconName, IconSrc } from 'folds'; + +import { + IPushRule, + IPushRules, + JoinRule, + MatrixClient, + MatrixEvent, + NotificationCountType, + Room, +} from 'matrix-js-sdk'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { + NotificationType, + RoomToParents, + RoomType, + StateEvent, + UnreadInfo, +} from '../../types/matrix/room'; + +export const getStateEvent = ( + room: Room, + eventType: StateEvent, + stateKey = '' +): MatrixEvent | undefined => room.currentState.getStateEvents(eventType, stateKey) ?? undefined; + +export const getStateEvents = (room: Room, eventType: StateEvent): MatrixEvent[] => + room.currentState.getStateEvents(eventType); + +export const getAccountData = ( + mx: MatrixClient, + eventType: AccountDataEvent +): MatrixEvent | undefined => mx.getAccountData(eventType); + +export const getMDirects = (mDirectEvent: MatrixEvent): Set => { + const roomIds = new Set(); + const userIdToDirects = mDirectEvent?.getContent(); + + if (userIdToDirects === undefined) return roomIds; + + Object.keys(userIdToDirects).forEach((userId) => { + const directs = userIdToDirects[userId]; + if (Array.isArray(directs)) { + directs.forEach((id) => { + if (typeof id === 'string') roomIds.add(id); + }); + } + }); + + return roomIds; +}; + +export const isDirectInvite = (room: Room | null, myUserId: string | null): boolean => { + if (!room || !myUserId) return false; + const me = room.getMember(myUserId); + const memberEvent = me?.events?.member; + const content = memberEvent?.getContent(); + return content?.is_direct === true; +}; + +export const isSpace = (room: Room | null): boolean => { + if (!room) return false; + const event = getStateEvent(room, StateEvent.RoomCreate); + if (!event) return false; + return event.getContent().type === RoomType.Space; +}; + +export const isRoom = (room: Room | null): boolean => { + if (!room) return false; + const event = getStateEvent(room, StateEvent.RoomCreate); + if (!event) return false; + return event.getContent().type === undefined; +}; + +export const isUnsupportedRoom = (room: Room | null): boolean => { + if (!room) return false; + const event = getStateEvent(room, StateEvent.RoomCreate); + if (!event) return true; // Consider room unsupported if m.room.create event doesn't exist + return event.getContent().type !== undefined && event.getContent().type !== RoomType.Space; +}; + +export function isValidChild(mEvent: MatrixEvent): boolean { + return mEvent.getType() === StateEvent.SpaceChild && Object.keys(mEvent.getContent()).length > 0; +} + +export const getAllParents = (roomToParents: RoomToParents, roomId: string): Set => { + const allParents = new Set(); + + const addAllParentIds = (rId: string) => { + if (allParents.has(rId)) return; + allParents.add(rId); + + const parents = roomToParents.get(rId); + parents?.forEach((id) => addAllParentIds(id)); + }; + addAllParentIds(roomId); + allParents.delete(roomId); + return allParents; +}; + +export const getSpaceChildren = (room: Room) => + getStateEvents(room, StateEvent.SpaceChild).reduce((filtered, mEvent) => { + const stateKey = mEvent.getStateKey(); + if (isValidChild(mEvent) && stateKey) { + filtered.push(stateKey); + } + return filtered; + }, []); + +export const mapParentWithChildren = ( + roomToParents: RoomToParents, + roomId: string, + children: string[] +) => { + const allParents = getAllParents(roomToParents, roomId); + children.forEach((childId) => { + if (allParents.has(childId)) { + // Space cycle detected. + return; + } + const parents = roomToParents.get(childId) ?? new Set(); + parents.add(roomId); + roomToParents.set(childId, parents); + }); +}; + +export const getRoomToParents = (mx: MatrixClient): RoomToParents => { + const map: RoomToParents = new Map(); + mx.getRooms() + .filter((room) => isSpace(room)) + .forEach((room) => mapParentWithChildren(map, room.roomId, getSpaceChildren(room))); + + return map; +}; + +export const isMutedRule = (rule: IPushRule) => + rule.actions[0] === 'dont_notify' && rule.conditions?.[0]?.kind === 'event_match'; + +export const findMutedRule = (overrideRules: IPushRule[], roomId: string) => + overrideRules.find((rule) => rule.rule_id === roomId && isMutedRule(rule)); + +export const getNotificationType = (mx: MatrixClient, roomId: string): NotificationType => { + let roomPushRule: IPushRule | undefined; + try { + roomPushRule = mx.getRoomPushRule('global', roomId); + } catch { + roomPushRule = undefined; + } + + if (!roomPushRule) { + const overrideRules = mx.getAccountData('m.push_rules')?.getContent() + ?.global?.override; + if (!overrideRules) return NotificationType.Default; + + return findMutedRule(overrideRules, roomId) ? NotificationType.Mute : NotificationType.Default; + } + + if (roomPushRule.actions[0] === 'notify') return NotificationType.AllMessages; + return NotificationType.MentionsAndKeywords; +}; + +export const isNotificationEvent = (mEvent: MatrixEvent) => { + const eType = mEvent.getType(); + if ( + ['m.room.create', 'm.room.message', 'm.room.encrypted', 'm.room.member', 'm.sticker'].find( + (type) => type === eType + ) + ) + return false; + if (eType === 'm.room.member') return false; + + if (mEvent.isRedacted()) return false; + if (mEvent.getRelation()?.rel_type === 'm.replace') return false; + + return true; +}; + +export const roomHaveUnread = (mx: MatrixClient, room: Room) => { + const userId = mx.getUserId(); + if (!userId) return false; + const readUpToId = room.getEventReadUpTo(userId); + const liveEvents = room.getLiveTimeline().getEvents(); + + if (liveEvents[liveEvents.length - 1]?.getSender() === userId) { + return false; + } + + for (let i = liveEvents.length - 1; i >= 0; i -= 1) { + const event = liveEvents[i]; + if (!event) return false; + if (event.getId() === readUpToId) return false; + if (isNotificationEvent(event)) return true; + } + return true; +}; + +export const getUnreadInfo = (room: Room): UnreadInfo => { + const total = room.getUnreadNotificationCount(NotificationCountType.Total); + const highlight = room.getUnreadNotificationCount(NotificationCountType.Highlight); + return { + roomId: room.roomId, + highlight, + total: highlight > total ? highlight : total, + }; +}; + +export const getUnreadInfos = (mx: MatrixClient): UnreadInfo[] => { + const unreadInfos = mx.getRooms().reduce((unread, room) => { + if (room.isSpaceRoom()) return unread; + if (room.getMyMembership() !== 'join') return unread; + if (getNotificationType(mx, room.roomId) === NotificationType.Mute) return unread; + + if (roomHaveUnread(mx, room)) { + unread.push(getUnreadInfo(room)); + } + + return unread; + }, []); + return unreadInfos; +}; + +export const joinRuleToIconSrc = ( + icons: Record, + joinRule: JoinRule, + space: boolean +): IconSrc | undefined => { + if (joinRule === JoinRule.Restricted) { + return space ? icons.Space : icons.Hash; + } + if (joinRule === JoinRule.Knock) { + return space ? icons.SpaceLock : icons.HashLock; + } + if (joinRule === JoinRule.Invite) { + return space ? icons.SpaceLock : icons.HashLock; + } + if (joinRule === JoinRule.Public) { + return space ? icons.SpaceGlobe : icons.HashGlobe; + } + return undefined; +}; + +export const getRoomAvatarUrl = (mx: MatrixClient, room: Room): string | undefined => { + const url = + room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 32, 32, 'crop', undefined, false) ?? + undefined; + if (url) return url; + return room.getAvatarUrl(mx.baseUrl, 32, 32, 'crop') ?? undefined; +}; + +export const parseReplyBody = (userId: string, body: string) => + `> <${userId}> ${body.replace(/\n/g, '\n> ')}\n\n`; + +export const parseReplyFormattedBody = ( + roomId: string, + userId: string, + eventId: string, + formattedBody: string +): string => { + const replyToLink = `In reply to`; + const userLink = `${userId}`; + + return `

    ${replyToLink}${userLink}
    ${formattedBody}
    `; +}; diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts new file mode 100644 index 00000000..555089de --- /dev/null +++ b/src/app/utils/sanitize.ts @@ -0,0 +1,10 @@ +export const sanitizeText = (body: string) => { + const tagsToReplace: Record = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + }; + return body.replace(/[&<>'"]/g, (tag) => tagsToReplace[tag] || tag); +}; diff --git a/src/app/utils/user-agent.ts b/src/app/utils/user-agent.ts new file mode 100644 index 00000000..61a903f5 --- /dev/null +++ b/src/app/utils/user-agent.ts @@ -0,0 +1,5 @@ +import { UAParser } from 'ua-parser-js'; + +export const ua = () => UAParser(window.navigator.userAgent); + +export const isMacOS = () => ua().os.name === 'Mac OS'; diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index 420f3154..9b8d1d82 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -23,6 +23,11 @@ class InitMatrix extends EventEmitter { } async init() { + if (this.matrixClient) { + console.warn('Client is already initialized!') + return; + } + await this.startClient(); this.setupSync(); this.listenEvents(); diff --git a/src/client/mx.ts b/src/client/mx.ts new file mode 100644 index 00000000..30909458 --- /dev/null +++ b/src/client/mx.ts @@ -0,0 +1,7 @@ +import { MatrixClient } from 'matrix-js-sdk'; +import initMatrix from './initMatrix'; + +export const mx = (): MatrixClient => { + if (!initMatrix.matrixClient) console.error('Matrix client is used before initialization!'); + return initMatrix.matrixClient!; +}; diff --git a/src/client/state/RoomList.js b/src/client/state/RoomList.js index a1570480..fc137ae2 100644 --- a/src/client/state/RoomList.js +++ b/src/client/state/RoomList.js @@ -220,12 +220,6 @@ class RoomList extends EventEmitter { this.inviteRooms.clear(); this.matrixClient.getRooms().forEach((room) => { const { roomId } = room; - const tombstone = room.currentState.events.get('m.room.tombstone'); - if (tombstone?.get('') !== undefined) { - const repRoomId = tombstone.get('').getContent().replacement_room; - const repRoomMembership = this.matrixClient.getRoom(repRoomId)?.getMyMembership(); - if (repRoomMembership === 'join') return; - } if (room.getMyMembership() === 'invite') { if (this._isDMInvite(room)) this.inviteDirects.add(roomId); diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 32f55fcc..af2e279a 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -1,7 +1,9 @@ +import { lightTheme } from 'folds'; import EventEmitter from 'events'; import appDispatcher from '../dispatcher'; import cons from './cons'; +import { darkTheme, butterTheme, silverTheme } from '../../colors.css'; function getSettings() { const settings = localStorage.getItem('settings'); @@ -20,6 +22,7 @@ class Settings extends EventEmitter { constructor() { super(); + this.themeClasses = [lightTheme, silverTheme, darkTheme, butterTheme]; this.themes = ['', 'silver-theme', 'dark-theme', 'butter-theme']; this.themeIndex = this.getThemeIndex(); @@ -31,6 +34,10 @@ class Settings extends EventEmitter { this._showNotifications = this.getShowNotifications(); this.isNotificationSounds = this.getIsNotificationSounds(); + this.darkModeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + + this.darkModeQueryList.addEventListener('change', () => this.applyTheme()) + this.isTouchScreenDevice = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); } @@ -49,20 +56,19 @@ class Settings extends EventEmitter { } _clearTheme() { - document.body.classList.remove('system-theme'); - this.themes.forEach((themeName) => { - if (themeName === '') return; - document.body.classList.remove(themeName); + this.themes.forEach((themeName, index) => { + if (themeName !== '') document.body.classList.remove(themeName); + document.body.classList.remove(this.themeClasses[index]); }); } applyTheme() { this._clearTheme(); - if (this.useSystemTheme) { - document.body.classList.add('system-theme'); - } else if (this.themes[this.themeIndex]) { - document.body.classList.add(this.themes[this.themeIndex]); - } + const autoThemeIndex = this.darkModeQueryList.matches ? 2 : 0; + const themeIndex = this.useSystemTheme ? autoThemeIndex : this.themeIndex; + if (this.themes[themeIndex] === undefined) return + if (this.themes[themeIndex]) document.body.classList.add(this.themes[themeIndex]); + document.body.classList.add(this.themeClasses[themeIndex]); } setTheme(themeIndex) { diff --git a/src/colors.css.ts b/src/colors.css.ts new file mode 100644 index 00000000..9b854bef --- /dev/null +++ b/src/colors.css.ts @@ -0,0 +1,238 @@ +import { createTheme } from '@vanilla-extract/css'; +import { color } from 'folds'; + +export const silverTheme = createTheme(color, { + Background: { + Container: '#E6E6E6', + ContainerHover: '#DADADA', + ContainerActive: '#CECECE', + ContainerLine: '#C2C2C2', + OnContainer: '#000000', + }, + + Surface: { + Container: '#F2F2F2', + ContainerHover: '#E6E6E6', + ContainerActive: '#DADADA', + ContainerLine: '#CECECE', + OnContainer: '#000000', + }, + + SurfaceVariant: { + Container: '#E6E6E6', + ContainerHover: '#DADADA', + ContainerActive: '#CECECE', + ContainerLine: '#C2C2C2', + OnContainer: '#000000', + }, + + Primary: { + Main: '#1858D5', + MainHover: '#164FC0', + MainActive: '#144BB5', + MainLine: '#1346AA', + OnMain: '#FFFFFF', + Container: '#E8EEFB', + ContainerHover: '#DCE6F9', + ContainerActive: '#D1DEF7', + ContainerLine: '#C5D5F5', + OnContainer: '#113E95', + }, + + Secondary: { + Main: '#000000', + MainHover: '#0C0C0C', + MainActive: '#181818', + MainLine: '#303030', + OnMain: '#F2F2F2', + Container: '#CECECE', + ContainerHover: '#C2C2C2', + ContainerActive: '#B5B5B5', + ContainerLine: '#A9A9A9', + OnContainer: '#0C0C0C', + }, + + Success: { + Main: '#00844C', + MainHover: '#007744', + MainActive: '#007041', + MainLine: '#006A3D', + OnMain: '#FFFFFF', + Container: '#E5F3ED', + ContainerHover: '#D9EDE4', + ContainerActive: '#CCE6DB', + ContainerLine: '#BFE0D2', + OnContainer: '#005C35', + }, + + Warning: { + Main: '#A85400', + MainHover: '#974C00', + MainActive: '#8F4700', + MainLine: '#864300', + OnMain: '#FFFFFF', + Container: '#F6EEE5', + ContainerHover: '#F2E5D9', + ContainerActive: '#EEDDCC', + ContainerLine: '#E9D4BF', + OnContainer: '#763B00', + }, + + Critical: { + Main: '#C40E0E', + MainHover: '#AC0909', + MainActive: '#A60C0C', + MainLine: '#9C0B0B', + OnMain: '#FFFFFF', + Container: '#F9E7E7', + ContainerHover: '#F6DBDB', + ContainerActive: '#F3CFCF', + ContainerLine: '#F0C3C3', + OnContainer: '#890A0A', + }, + + Other: { + FocusRing: 'rgba(0 0 0 / 50%)', + Shadow: 'rgba(0 0 0 / 20%)', + Overlay: 'rgba(0 0 0 / 50%)', + }, +}); + +const darkThemeData = { + Background: { + Container: '#15171A', + ContainerHover: '#1F2326', + ContainerActive: '#2A2E33', + ContainerLine: '#343A40', + OnContainer: '#ffffff', + }, + + Surface: { + Container: '#1F2326', + ContainerHover: '#2A2E33', + ContainerActive: '#343A40', + ContainerLine: '#3F464D', + OnContainer: '#ffffff', + }, + + SurfaceVariant: { + Container: '#2A2E33', + ContainerHover: '#343A40', + ContainerActive: '#3F464D', + ContainerLine: '#495159', + OnContainer: '#ffffff', + }, + + Primary: { + Main: '#BDB6EC', + MainHover: '#B2AAE9', + MainActive: '#ADA3E8', + MainLine: '#A79DE6', + OnMain: '#2C2843', + Container: '#413C65', + ContainerHover: '#494370', + ContainerActive: '#50497B', + ContainerLine: '#575086', + OnContainer: '#E3E1F7', + }, + + Secondary: { + Main: '#D1E8FF', + MainHover: '#BCD1E5', + MainActive: '#B2C5D9', + MainLine: '#A7BACC', + OnMain: '#15171A', + Container: '#343A40', + ContainerHover: '#3F464D', + ContainerActive: '#495159', + ContainerLine: '#545D66', + OnContainer: '#C7DCF2', + }, + + Success: { + Main: '#85E0BA', + MainHover: '#70DBAF', + MainActive: '#66D9A9', + MainLine: '#5CD6A3', + OnMain: '#0F3D2A', + Container: '#175C3F', + ContainerHover: '#1A6646', + ContainerActive: '#1C704D', + ContainerLine: '#1F7A54', + OnContainer: '#CCF2E2', + }, + + Warning: { + Main: '#E3BA91', + MainHover: '#DFAF7E', + MainActive: '#DDA975', + MainLine: '#DAA36C', + OnMain: '#3F2A15', + Container: '#5E3F20', + ContainerHover: '#694624', + ContainerActive: '#734D27', + ContainerLine: '#7D542B', + OnContainer: '#F3E2D1', + }, + + Critical: { + Main: '#E69D9D', + MainHover: '#E28D8D', + MainActive: '#E08585', + MainLine: '#DE7D7D', + OnMain: '#401C1C', + Container: '#602929', + ContainerHover: '#6B2E2E', + ContainerActive: '#763333', + ContainerLine: '#803737', + OnContainer: '#F5D6D6', + }, + + Other: { + FocusRing: 'rgba(255, 255, 255, 0.5)', + Shadow: 'rgba(0, 0, 0, 1)', + Overlay: 'rgba(0, 0, 0, 0.6)', + }, +}; + +export const darkTheme = createTheme(color, darkThemeData); + +export const butterTheme = createTheme(color, { + ...darkThemeData, + Background: { + Container: '#1A1916', + ContainerHover: '#262621', + ContainerActive: '#33322C', + ContainerLine: '#403F38', + OnContainer: '#FFFBDE', + }, + + Surface: { + Container: '#262621', + ContainerHover: '#33322C', + ContainerActive: '#403F38', + ContainerLine: '#4D4B43', + OnContainer: '#FFFBDE', + }, + + SurfaceVariant: { + Container: '#33322C', + ContainerHover: '#403F38', + ContainerActive: '#4D4B43', + ContainerLine: '#59584E', + OnContainer: '#FFFBDE', + }, + + Secondary: { + Main: '#FFFBDE', + MainHover: '#E5E2C8', + MainActive: '#D9D5BD', + MainLine: '#CCC9B2', + OnMain: '#1A1916', + Container: '#403F38', + ContainerHover: '#4D4B43', + ContainerActive: '#59584E', + ContainerLine: '#666459', + OnContainer: '#F2EED3', + }, +}); diff --git a/src/ext.d.ts b/src/ext.d.ts new file mode 100644 index 00000000..55f59327 --- /dev/null +++ b/src/ext.d.ts @@ -0,0 +1,23 @@ +declare module 'browser-encrypt-attachment' { + export interface EncryptedAttachmentInfo { + v: string; + key: { + alg: string; + key_ops: string[]; + kty: string; + k: string; + ext: boolean; + }; + iv: string; + hashes: { + [alg: string]: string; + }; + } + + export interface EncryptedAttachment { + data: ArrayBuffer; + info: EncryptedAttachmentInfo; + } + + export function encryptAttachment(dataBuffer: ArrayBuffer): Promise; +} diff --git a/src/index.jsx b/src/index.jsx index a252f6f0..e7256e25 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,5 +1,13 @@ +/* eslint-disable import/first */ import React from 'react'; import ReactDom from 'react-dom'; +import { enableMapSet } from 'immer'; +import '@fontsource/inter/variable.css'; +import 'folds/dist/style.css'; +import { configClass, varsClass } from 'folds'; + +enableMapSet(); + import './font'; import './index.scss'; @@ -7,6 +15,8 @@ import settings from './client/state/settings'; import App from './app/pages/App'; +document.body.classList.add(configClass, varsClass); + settings.applyTheme(); ReactDom.render(, document.getElementById('root')); diff --git a/src/index.scss b/src/index.scss index 39d0612b..93443fe9 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,14 +1,20 @@ @use './app/partials/screen'; -:root { +@font-face { + font-family: Twemoji; + src: url('../public/font/Twemoji.Mozilla.v.7.0.woff2'), + url('../public/font/Twemoji.Mozilla.v0.7.0.ttf'); + font-display: swap; +} +:root { /* background color | --bg-[background type]: value */ - --bg-surface: #FFFFFF; - --bg-surface-transparent: #FFFFFF00; - --bg-surface-low: #F6F6F6; - --bg-surface-low-transparent: #F6F6F600; - --bg-surface-extra-low: #F6F6F6; - --bg-surface-extra-low-transparent: #F6F6F600; + --bg-surface: #ffffff; + --bg-surface-transparent: #ffffff00; + --bg-surface-low: #f6f6f6; + --bg-surface-low-transparent: #f6f6f600; + --bg-surface-extra-low: #f6f6f6; + --bg-surface-extra-low-transparent: #f6f6f600; --bg-surface-hover: rgba(0, 0, 0, 3%); --bg-surface-active: rgba(0, 0, 0, 5%); --bg-surface-border: rgba(0, 0, 0, 6%); @@ -22,7 +28,7 @@ --bg-positive-hover: rgba(69, 184, 59, 8%); --bg-positive-active: rgba(69, 184, 59, 15%); --bg-positive-border: rgba(69, 184, 59, 40%); - + --bg-caution: rgb(255, 179, 0); --bg-caution-hover: rgba(255, 179, 0, 8%); --bg-caution-active: rgba(255, 179, 0, 15%); @@ -37,18 +43,18 @@ --bg-badge: #989898; --bg-ping: hsla(137deg, 100%, 68%, 40%); --bg-ping-hover: hsla(137deg, 100%, 68%, 50%); - --bg-divider: hsla(0, 0%, 0%, .1); + --bg-divider: hsla(0, 0%, 0%, 0.1); /* text color | --tc-[background type]-[priority]: value */ --tc-surface-high: #000000; --tc-surface-normal: rgba(0, 0, 0, 78%); --tc-surface-normal-low: rgba(0, 0, 0, 60%); --tc-surface-low: rgba(0, 0, 0, 48%); - + --tc-primary-high: #ffffff; --tc-primary-normal: rgba(255, 255, 255, 68%); --tc-primary-low: rgba(255, 255, 255, 40%); - + --tc-positive-high: var(--bg-positive); --tc-positive-normal: rgb(69, 184, 59, 80%); --tc-positive-low: rgb(69, 184, 59, 60%); @@ -56,7 +62,7 @@ --tc-caution-high: var(--bg-caution); --tc-caution-normal: rgb(255, 179, 0, 80%); --tc-caution-low: rgb(255, 179, 0, 60%); - + --tc-danger-high: var(--bg-danger); --tc-danger-normal: rgba(240, 71, 71, 88%); --tc-danger-low: rgba(240, 71, 71, 60%); @@ -66,7 +72,6 @@ --tc-tooltip: white; --tc-badge: white; - /* system icons | --ic-[background type]-[priority]: value */ --ic-surface-high: #272727; --ic-surface-normal: #626262; @@ -102,7 +107,6 @@ --av-small: 36px; --av-extra-small: 24px; - /* shadow and overlay */ --bg-overlay: rgba(0, 0, 0, 20%); --bg-overlay-low: rgba(0, 0, 0, 50%); @@ -124,11 +128,9 @@ --bs-danger-border: inset 0 0 0 1px var(--bg-danger-border); --bs-danger-outline: 0 0 0 2px var(--bg-danger-border); - /* border */ --bo-radius: 8px; - /* font styles: font-size, letter-spacing, line-hight */ --fs-h1: 36px; --ls-h1: -1.5px; @@ -160,7 +162,6 @@ --fw-medium: 500; --fw-bold: 700; - /* spacing | --sp-[space]: value */ --sp-none: 0px; --sp-ultra-tight: 4px; @@ -170,7 +171,6 @@ --sp-loose: 20px; --sp-extra-loose: 32px; - /* other */ --border-width: 1px; --header-height: 54px; @@ -180,7 +180,7 @@ --people-drawer-width: calc(268px - var(--border-width)); --popup-window-drawer-width: 280px; - + @include screen.smallerThan(tabletBreakpoint) { --navigation-drawer-width: calc(240px + var(--border-width)); --people-drawer-width: calc(256px - var(--border-width)); @@ -191,11 +191,11 @@ --fluid-push: cubic-bezier(0, 0.8, 0.67, 0.97); --fluid-slide-down: cubic-bezier(0.02, 0.82, 0.4, 0.96); --fluid-slide-up: cubic-bezier(0.13, 0.56, 0.25, 0.99); - - --font-primary: 'Roboto', sans-serif; - --font-secondary: 'Roboto', sans-serif; -} + --font-emoji: 'Twemoji'; + --font-primary: 'Roboto', var(--font-emoji), sans-serif; + --font-secondary: 'Roboto', var(--font-emoji), sans-serif; +} .silver-theme { /* background color | --bg-[background type]: value */ @@ -207,7 +207,8 @@ --bg-surface-extra-low-transparent: hsla(0, 0%, 91%, 0); } -@mixin dark-mode() { +.dark-theme, +.butter-theme { /* background color | --bg-[background type]: value */ --bg-surface: hsl(208, 8%, 20%); --bg-surface-transparent: hsla(208, 8%, 20%, 0); @@ -228,15 +229,14 @@ --bg-badge: hsl(0, 0%, 75%); --bg-ping: hsla(137deg, 100%, 38%, 40%); --bg-ping-hover: hsla(137deg, 100%, 38%, 50%); - --bg-divider: hsla(0, 0%, 100%, .1); - + --bg-divider: hsla(0, 0%, 100%, 0.1); /* text color | --tc-[background type]-[priority]: value */ --tc-surface-high: rgba(255, 255, 255, 98%); --tc-surface-normal: rgba(255, 255, 255, 94%); --tc-surface-normal-low: rgba(255, 255, 255, 60%); --tc-surface-low: rgba(255, 255, 255, 58%); - + --tc-primary-high: #ffffff; --tc-primary-normal: rgba(255, 255, 255, 0.68); --tc-primary-low: rgba(255, 255, 255, 0.4); @@ -262,7 +262,7 @@ --mx-uc-7: hsl(243, 100%, 74%); --mx-uc-8: hsl(94, 66%, 50%); } - + /* shadow and overlay */ --bg-overlay: rgba(0, 0, 0, 60%); --bg-overlay-low: rgba(0, 0, 0, 80%); @@ -274,7 +274,7 @@ --bs-primary-border: inset 0 0 0 1px var(--bg-primary-border); --bs-primary-outline: 0 0 0 2px var(--bg-primary-border); - + /* font styles: font-size, letter-spacing, line-hight */ --fs-h1: 35.6px; @@ -292,18 +292,7 @@ /* override normal font weight for dark mode */ --fw-normal: 350; - --font-secondary: 'InterVariable', 'Roboto', sans-serif; -} - -.dark-theme, -.butter-theme { - @include dark-mode(); -} - -@media (prefers-color-scheme: dark) { - .system-theme { - @include dark-mode(); - } + --font-secondary: 'InterVariable', 'Roboto', var(--font-emoji), sans-serif; } .butter-theme { @@ -317,14 +306,12 @@ --bg-badge: #c4c1ab; - /* text color | --tc-[background type]-[priority]: value */ --tc-surface-high: rgb(255, 251, 222, 94%); --tc-surface-normal: rgba(255, 251, 222, 94%); - --tc-surface-normal-low: rgba(255, 251, 222, 60%); + --tc-surface-normal-low: rgba(255, 251, 222, 60%); --tc-surface-low: rgba(255, 251, 222, 58%); - /* system icons | --ic-[background type]-[priority]: value */ --ic-surface-high: rgb(255, 251, 222); --ic-surface-normal: rgba(255, 251, 222, 84%); @@ -387,9 +374,11 @@ body { height: 100%; } -*, *::before, *::after { +*, +*::before, +*::after { box-sizing: border-box; - -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: transparent; } a { @@ -428,16 +417,16 @@ button { textarea, input, input[type], -input[type=text], -input[type=username], -input[type=password], -input[type=email], -input[type=checkbox] { +input[type='text'], +input[type='username'], +input[type='password'], +input[type='email'], +input[type='checkbox'] { -webkit-appearance: none; -moz-appearance: none; appearance: none; } -input[type=checkbox] { +input[type='checkbox'] { margin: 0; padding: 0; width: 20px; @@ -451,7 +440,7 @@ input[type=checkbox] { &:checked { background-color: var(--bg-primary); &::before { - content: ""; + content: ''; display: inline-block; width: 12px; height: 6px; @@ -468,11 +457,11 @@ textarea { } .noselect { -webkit-touch-callout: none; /* iOS Safari */ - -webkit-user-select: none; /* Safari */ - -khtml-user-select: none; /* Konqueror HTML */ - -moz-user-select: none; /* Old versions of Firefox */ - -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently + -webkit-user-select: none; /* Safari */ + -khtml-user-select: none; /* Konqueror HTML */ + -moz-user-select: none; /* Old versions of Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently supported by Chrome, Edge, Opera and Firefox */ } @@ -484,4 +473,4 @@ audio:not([controls]) { display: flex; justify-content: center; align-items: center; -} \ No newline at end of file +} diff --git a/src/types/matrix/accountData.ts b/src/types/matrix/accountData.ts new file mode 100644 index 00000000..1078cb35 --- /dev/null +++ b/src/types/matrix/accountData.ts @@ -0,0 +1,12 @@ +export enum AccountDataEvent { + PushRules = 'm.push_rules', + Direct = 'm.direct', + IgnoredUserList = 'm.ignored_user_list', + + CinnySpaces = 'in.cinny.spaces', + + ElementRecentEmoji = 'io.element.recent_emoji', + + PoniesUserEmotes = 'im.ponies.user_emotes', + PoniesEmoteRooms = 'im.ponies.emote_rooms', +} diff --git a/src/types/matrix/common.ts b/src/types/matrix/common.ts new file mode 100644 index 00000000..94a46a90 --- /dev/null +++ b/src/types/matrix/common.ts @@ -0,0 +1,22 @@ +import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; + +export type IImageInfo = { + w?: number; + h?: number; + mimetype?: string; + size?: number; +}; + +export type IVideoInfo = IImageInfo & { + duration?: number; +}; + +export type IEncryptedFile = EncryptedAttachmentInfo & { + url: string; +}; + +export type IThumbnailContent = { + thumbnail_info?: IImageInfo; + thumbnail_file?: IEncryptedFile; + thumbnail_url?: string; +}; diff --git a/src/types/matrix/room.ts b/src/types/matrix/room.ts new file mode 100644 index 00000000..93e87615 --- /dev/null +++ b/src/types/matrix/room.ts @@ -0,0 +1,61 @@ +export enum Membership { + Invite = 'invite', + Knock = 'knock', + Join = 'join', + Leave = 'leave', + Ban = 'ban', +} + +export enum StateEvent { + RoomCanonicalAlias = 'm.room.canonical_alias', + RoomCreate = 'm.room.create', + RoomJoinRules = 'm.room.join_rules', + RoomMember = 'm.room.member', + RoomThirdPartyInvite = 'm.room.third_party_invite', + RoomPowerLevels = 'm.room.power_levels', + RoomName = 'm.room.name', + RoomTopic = 'm.room.topic', + RoomAvatar = 'm.room.avatar', + RoomPinnedEvents = 'm.room.pinned_events', + RoomEncryption = 'm.room.encryption', + RoomHistoryVisibility = 'm.room.history_visibility', + RoomGuestAccess = 'm.room.guest_access', + RoomServerAcl = 'm.room.server_acl', + RoomTombstone = 'm.room.tombstone', + + SpaceChild = 'm.space.child', + SpaceParent = 'm.space.parent', + + PoniesRoomEmotes = 'im.ponies.room_emotes', +} + +export enum RoomType { + Space = 'm.space', +} + +export enum NotificationType { + Default = 'default', + AllMessages = 'all_messages', + MentionsAndKeywords = 'mentions_and_keywords', + Mute = 'mute', +} + +export type RoomToParents = Map>; +export type RoomToUnread = Map< + string, + { + total: number; + highlight: number; + from: Set | null; + } +>; +export type UnreadInfo = { + roomId: string; + total: number; + highlight: number; +}; + +export type MuteChanges = { + added: string[]; + removed: string[]; +}; diff --git a/src/util/sanitize.js b/src/util/sanitize.js index 79cc0418..3723a11b 100644 --- a/src/util/sanitize.js +++ b/src/util/sanitize.js @@ -6,7 +6,7 @@ let mx = null; const permittedHtmlTags = [ 'font', 'del', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol', 'sup', 'sub', - 'li', 'b', 'i', 'u', 'strong', 'em', 'strike', 'code', + 'li', 'b', 'i', 'u', 'strong', 'em', 'strike', 's', 'code', 'hr', 'br', 'div', 'table', 'thead', 'tbody', 'tr', 'th', 'td', 'caption', 'pre', 'span', 'img', 'details', 'summary', ]; diff --git a/tsconfig.json b/tsconfig.json index e109a97c..02eb1843 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,8 +2,9 @@ "compilerOptions": { "sourceMap": true, "jsx": "react", - "target": "ES6", + "target": "ES2016", "allowJs": true, + "strict": true, "esModuleInterop": true, "moduleResolution": "Node", "outDir": "dist", diff --git a/vite.config.js b/vite.config.js index 979e9aa0..6a443166 100644 --- a/vite.config.js +++ b/vite.config.js @@ -2,6 +2,7 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { wasm } from '@rollup/plugin-wasm'; import { viteStaticCopy } from 'vite-plugin-static-copy'; +import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import inject from '@rollup/plugin-inject'; import { svgLoader } from './viteSvgLoader'; @@ -37,6 +38,7 @@ export default defineConfig({ }, plugins: [ viteStaticCopy(copyFiles), + vanillaExtractPlugin(), svgLoader(), wasm(), react(), From 2bbf0d1b825ecb177d2e9964c11a403874ca9178 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:29:33 +1000 Subject: [PATCH 441/824] Bump vite from 4.0.1 to 4.3.9 (#1256) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.0.1 to 4.3.9. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.9/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 434 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 417 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62675247..3c5b27c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.0.4", + "vite": "4.3.9", "vite-plugin-static-copy": "0.13.0" }, "engines": { @@ -4321,9 +4321,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4628,9 +4634,9 @@ } }, "node_modules/postcss": { - "version": "8.4.20", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", - "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "funding": [ { "type": "opencollective", @@ -4639,10 +4645,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -5007,9 +5017,9 @@ } }, "node_modules/rollup": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.7.5.tgz", - "integrity": "sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", + "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5593,15 +5603,14 @@ } }, "node_modules/vite": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", - "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { - "esbuild": "^0.16.3", - "postcss": "^8.4.20", - "resolve": "^1.22.1", - "rollup": "^3.7.0" + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" }, "bin": { "vite": "bin/vite.js" @@ -5694,6 +5703,395 @@ "node": ">= 10.0.0" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index 38be28df..855b5688 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.0.4", + "vite": "4.3.9", "vite-plugin-static-copy": "0.13.0" } } From 15feac81c9ae9b683c9bd01a6ddd37afe0e332dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:32:10 +1000 Subject: [PATCH 442/824] Bump actions/upload-artifact from 3.1.1 to 3.1.2 (#1055) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3.1.1...v3.1.2) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 5be04293..9cd911fc 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -25,7 +25,7 @@ jobs: NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Upload artifact - uses: actions/upload-artifact@v3.1.1 + uses: actions/upload-artifact@v3.1.2 with: name: preview path: dist @@ -33,7 +33,7 @@ jobs: - name: Save pr number run: echo ${PR_NUMBER} > ./pr.txt - name: Upload pr number - uses: actions/upload-artifact@v3.1.1 + uses: actions/upload-artifact@v3.1.2 with: name: pr path: ./pr.txt From 14b4969a656bc7d6960a129cf4ea33b0a8f6b1e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:34:23 +1000 Subject: [PATCH 443/824] Bump actions/setup-node from 3.5.1 to 3.6.0 (#1057) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.5.1 to 3.6.0. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3.5.1...v3.6.0) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 9cd911fc..5a612a6c 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.2.0 - name: Setup node - uses: actions/setup-node@v3.5.1 + uses: actions/setup-node@v3.6.0 with: node-version: 18.12.1 cache: "npm" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 12785f46..319fc4ca 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.2.0 - name: Setup node - uses: actions/setup-node@v3.5.1 + uses: actions/setup-node@v3.6.0 with: node-version: 18.12.1 cache: "npm" diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 8d72a86e..6f9edd44 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.2.0 - name: Setup node - uses: actions/setup-node@v3.5.1 + uses: actions/setup-node@v3.6.0 with: node-version: 18.12.1 cache: "npm" From 9f2fb716f7fe15de120ae4cde4a112553eb8c785 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:36:13 +1000 Subject: [PATCH 444/824] Bump thollander/actions-comment-pull-request from 2.0.0 to 2.3.1 (#1081) Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2.0.0 to 2.3.1. - [Release notes](https://github.com/thollander/actions-comment-pull-request/releases) - [Commits](https://github.com/thollander/actions-comment-pull-request/compare/c22fb302208b7b170d252a61a505d2ea27245eff...632cf9ce90574d125be56b5f3405cda41a84e2fd) --- updated-dependencies: - dependency-name: thollander/actions-comment-pull-request dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index ab54f8df..741d0651 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -45,7 +45,7 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_PR_CINNY }} timeout-minutes: 1 - name: Comment preview on PR - uses: thollander/actions-comment-pull-request@c22fb302208b7b170d252a61a505d2ea27245eff + uses: thollander/actions-comment-pull-request@632cf9ce90574d125be56b5f3405cda41a84e2fd env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From f1fcde2142bb22f984353d59c30336af1195ac37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:38:53 +1000 Subject: [PATCH 445/824] Bump dawidd6/action-download-artifact from 2.24.2 to 2.27.0 (#1202) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 2.24.2 to 2.27.0. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/e6e25ac3a2b93187502a8be1ef9e9603afc34925...246dbf436b23d7c49e21a7ab8204ca9ecd1fe615) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 741d0651..fdb0e810 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -15,7 +15,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download pr number - uses: dawidd6/action-download-artifact@e6e25ac3a2b93187502a8be1ef9e9603afc34925 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} @@ -24,7 +24,7 @@ jobs: id: pr run: echo "id=$(> $GITHUB_OUTPUT - name: Download artifact - uses: dawidd6/action-download-artifact@e6e25ac3a2b93187502a8be1ef9e9603afc34925 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} From ed5431680ff37bdb3f8685df69a91e91ffdd9dd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:21:07 +1000 Subject: [PATCH 446/824] Bump actions/checkout from 3.2.0 to 3.5.3 (#1276) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.2.0 to 3.5.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.2.0...v3.5.3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 5a612a6c..d7731055 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: Setup node uses: actions/setup-node@v3.6.0 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 47dbfe32..d4b1d73a 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: Build Docker image uses: docker/build-push-action@v3.2.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index b417df10..30d00760 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 319fc4ca..8935c510 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: Setup node uses: actions/setup-node@v3.6.0 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 6f9edd44..f2cd3fa1 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: Setup node uses: actions/setup-node@v3.6.0 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.5.3 - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx From db33707e5eeddaa7eb97d98df5e7ea9a80667609 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:24:17 +1000 Subject: [PATCH 447/824] fix(deps): update dependency matrix-js-sdk to v24.1.0 [security] (#1251) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c5b27c8..99e3c913 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "24.0.0", + "matrix-js-sdk": "24.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -4225,18 +4225,18 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.0.0.tgz", - "integrity": "sha512-AOhO036ziDf6lwYoauj5DES/RJ6RDTq+vrK2yO/GW/8n+bAXhkjWc9AA/WcTK/9SkNHS46ZanmolkhS1n8WniQ==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.1.0.tgz", + "integrity": "sha512-xEx2ZoNsS56dwgqLJ3rIv2SUpFxdQLrLKmJCpMatMUKCAg+NGuZfpQ3QXblIbGaqFNQZCH7fC7S48AeTMZp1Jw==", "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.3", + "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.5", "another-json": "^0.2.0", "bs58": "^5.0.0", "content-type": "^1.0.4", "loglevel": "^1.7.1", "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.0.0", + "matrix-widget-api": "^1.3.1", "p-retry": "4", "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6", @@ -4247,9 +4247,9 @@ } }, "node_modules/matrix-widget-api": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.1.1.tgz", - "integrity": "sha512-gNSgmgSwvOsOcWK9k2+tOhEMYBiIMwX95vMZu0JqY7apkM02xrOzUBuPRProzN8CnbIALH7e3GAhatF6QCNvtA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.4.0.tgz", + "integrity": "sha512-dw0dRylGQzDUoiaY/g5xx1tBbS7aoov31PRtFMAvG58/4uerYllV9Gfou7w+I1aglwB6hihTREzKltVjARWV6A==", "dependencies": { "@types/events": "^3.0.0", "events": "^3.2.0" diff --git a/package.json b/package.json index 855b5688..5f0f42f2 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "katex": "0.16.4", "linkify-html": "4.0.2", "linkifyjs": "4.0.2", - "matrix-js-sdk": "24.0.0", + "matrix-js-sdk": "24.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", From 511c8ea79d266854009575476797a32190b77f43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:25:20 +1000 Subject: [PATCH 448/824] Bump nginx from 1.23.3-alpine to 1.25.0-alpine (#1254) Bumps nginx from 1.23.3-alpine to 1.25.0-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index af9abbd9..3cae982a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm run build ## App -FROM nginx:1.23.3-alpine +FROM nginx:1.25.0-alpine COPY --from=builder /src/dist /app From a07d954f1c3ab6401205651c3cdff2df666edd66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:26:54 +1000 Subject: [PATCH 449/824] Bump docker/metadata-action from 4.1.1 to 4.5.0 (#1271) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.1.1 to 4.5.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v4.1.1...v4.5.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index f2cd3fa1..25ac23bb 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -84,7 +84,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v4.1.1 + uses: docker/metadata-action@v4.5.0 with: images: | ${{ secrets.DOCKER_USERNAME }}/cinny From bd64f7bd868d79365ea1aa096c146ddab4e19e28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:28:07 +1000 Subject: [PATCH 450/824] Bump thollander/actions-comment-pull-request from 2.3.1 to 2.4.0 (#1272) Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/thollander/actions-comment-pull-request/releases) - [Commits](https://github.com/thollander/actions-comment-pull-request/compare/632cf9ce90574d125be56b5f3405cda41a84e2fd...dadb7667129e23f12ca3925c90dc5cd7121ab57e) --- updated-dependencies: - dependency-name: thollander/actions-comment-pull-request dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index fdb0e810..c4d82436 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -45,7 +45,7 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_PR_CINNY }} timeout-minutes: 1 - name: Comment preview on PR - uses: thollander/actions-comment-pull-request@632cf9ce90574d125be56b5f3405cda41a84e2fd + uses: thollander/actions-comment-pull-request@dadb7667129e23f12ca3925c90dc5cd7121ab57e env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 1c27a292383af262b491d2e04f3da655d3730c0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:28:39 +1000 Subject: [PATCH 451/824] Bump docker/setup-buildx-action from 2.2.1 to 2.6.0 (#1274) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.2.1 to 2.6.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.2.1...v2.6.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 25ac23bb..84c963fe 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.2.1 + uses: docker/setup-buildx-action@v2.6.0 - name: Login to Docker Hub uses: docker/login-action@v2.1.0 with: From 6d199244efa054760b6c0cd75f509708e0c80aee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:29:18 +1000 Subject: [PATCH 452/824] Bump docker/build-push-action from 3.2.0 to 4.1.0 (#1275) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.2.0 to 4.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3.2.0...v4.1.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index d4b1d73a..3edc3c18 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Build Docker image - uses: docker/build-push-action@v3.2.0 + uses: docker/build-push-action@v4.1.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 84c963fe..484ecba9 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v3.2.0 + uses: docker/build-push-action@v4.1.0 with: context: . platforms: linux/amd64,linux/arm64 From 2883b4c35b12d35272d4cebb1185cf1938d402c2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 14 Jun 2023 03:47:18 +1000 Subject: [PATCH 453/824] Fix editor bugs (#1281) * focus editor on reply click * fix emoji and sticker img object-fit * fix cursor not moving with autocomplete * stop sanitizing sending plain text body * improve autocomplete query parsing * add escape to turn off active editor toolbar item --- src/app/components/editor/Editor.tsx | 3 +- .../autocomplete/EmoticonAutocomplete.tsx | 2 +- .../editor/autocomplete/autocompleteQuery.ts | 13 +++--- src/app/components/editor/common.ts | 22 +++++++++- src/app/components/editor/keyboard.ts | 43 ++++++++++++++----- src/app/components/editor/output.ts | 2 +- .../components/emoji-board/EmojiBoard.css.tsx | 2 + src/app/components/emoji-board/EmojiBoard.tsx | 1 + src/app/organisms/room/RoomInput.tsx | 3 +- 9 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index edf1ac6d..2657b213 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -93,7 +93,8 @@ export const CustomEditor = forwardRef( const handleKeydown: KeyboardEventHandler = useCallback( (evt) => { onKeyDown?.(evt); - toggleKeyboardShortcut(editor, evt); + const shortcutToggled = toggleKeyboardShortcut(editor, evt); + if (shortcutToggled) evt.preventDefault(); }, [editor, onKeyDown] ); diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index e5af3fa1..17712b87 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -104,7 +104,7 @@ export function EmoticonAutocomplete({ as="img" src={mx.mxcUrlToHttp(key) || key} alt={emoticon.shortcode} - style={{ width: toRem(24), height: toRem(24) }} + style={{ width: toRem(24), height: toRem(24), objectFit: 'contain' }} /> ) : ( ( validPrefixes: readonly TPrefix[] ): TPrefix | undefined => { const world = Editor.string(editor, queryRange); - const prefix = world[0] as TPrefix | undefined; - if (!prefix) return undefined; - return validPrefixes.includes(prefix) ? prefix : undefined; + return validPrefixes.find((p) => world.startsWith(p)); }; -export const getAutocompleteQueryText = (editor: Editor, queryRange: BaseRange): string => - Editor.string(editor, queryRange).slice(1); +export const getAutocompleteQueryText = ( + editor: Editor, + queryRange: BaseRange, + prefix: string +): string => Editor.string(editor, queryRange).slice(prefix.length); export const getAutocompleteQuery = ( editor: Editor, @@ -41,6 +42,6 @@ export const getAutocompleteQuery = ( return { range: queryRange, prefix, - text: getAutocompleteQueryText(editor, queryRange), + text: getAutocompleteQueryText(editor, queryRange, prefix), }; }; diff --git a/src/app/components/editor/common.ts b/src/app/components/editor/common.ts index c9cf086c..619a1bfe 100644 --- a/src/app/components/editor/common.ts +++ b/src/app/components/editor/common.ts @@ -2,11 +2,25 @@ import { BasePoint, BaseRange, Editor, Element, Point, Range, Transforms } from import { BlockType, MarkType } from './Elements'; import { EmoticonElement, FormattedText, HeadingLevel, LinkElement, MentionElement } from './slate'; +const ALL_MARK_TYPE: MarkType[] = [ + MarkType.Bold, + MarkType.Code, + MarkType.Italic, + MarkType.Spoiler, + MarkType.StrikeThrough, + MarkType.Underline, +]; + export const isMarkActive = (editor: Editor, format: MarkType) => { const marks = Editor.marks(editor); return marks ? marks[format] === true : false; }; +export const isAnyMarkActive = (editor: Editor) => { + const marks = Editor.marks(editor); + return marks && !!ALL_MARK_TYPE.find((type) => marks[type] === true); +}; + export const toggleMark = (editor: Editor, format: MarkType) => { const isActive = isMarkActive(editor, format); @@ -17,6 +31,10 @@ export const toggleMark = (editor: Editor, format: MarkType) => { } }; +export const removeAllMark = (editor: Editor) => { + ALL_MARK_TYPE.forEach((mark) => Editor.removeMark(editor, mark)); +}; + export const isBlockActive = (editor: Editor, format: BlockType) => { const [match] = Editor.nodes(editor, { match: (node) => Element.isElement(node) && node.type === format, @@ -140,11 +158,11 @@ export const replaceWithElement = (editor: Editor, selectRange: BaseRange, eleme }; export const moveCursor = (editor: Editor, withSpace?: boolean) => { - // without timeout it works properly when we select autocomplete with Tab or Space + // without timeout move cursor doesn't works properly. setTimeout(() => { Transforms.move(editor); if (withSpace) editor.insertText(' '); - }, 1); + }, 100); }; interface PointUntilCharOptions { diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index 52217dd5..3fbe5363 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -1,7 +1,7 @@ import { isHotkey } from 'is-hotkey'; import { KeyboardEvent } from 'react'; import { Editor } from 'slate'; -import { isBlockActive, toggleBlock, toggleMark } from './common'; +import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './common'; import { BlockType, MarkType } from './Elements'; export const INLINE_HOTKEYS: Record = { @@ -22,19 +22,42 @@ export const BLOCK_HOTKEYS: Record = { }; const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); -export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent) => { - BLOCK_KEYS.forEach((hotkey) => { +/** + * @return boolean true if shortcut is toggled. + */ +export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent): boolean => { + if (isHotkey('escape', event)) { + if (isAnyMarkActive(editor)) { + removeAllMark(editor); + return true; + } + console.log(isBlockActive(editor, BlockType.Paragraph)); + if (!isBlockActive(editor, BlockType.Paragraph)) { + toggleBlock(editor, BlockType.Paragraph); + return true; + } + return false; + } + + const blockToggled = BLOCK_KEYS.find((hotkey) => { if (isHotkey(hotkey, event)) { event.preventDefault(); toggleBlock(editor, BLOCK_HOTKEYS[hotkey]); + return true; } + return false; }); + if (blockToggled) return true; - if (!isBlockActive(editor, BlockType.CodeBlock)) - INLINE_KEYS.forEach((hotkey) => { - if (isHotkey(hotkey, event)) { - event.preventDefault(); - toggleMark(editor, INLINE_HOTKEYS[hotkey]); - } - }); + const inlineToggled = isBlockActive(editor, BlockType.CodeBlock) + ? false + : INLINE_KEYS.find((hotkey) => { + if (isHotkey(hotkey, event)) { + event.preventDefault(); + toggleMark(editor, INLINE_HOTKEYS[hotkey]); + return true; + } + return false; + }); + return !!inlineToggled; }; diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 091dab79..38c54499 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -88,7 +88,7 @@ const elementToPlainText = (node: CustomElement, children: string): string => { export const toPlainText = (node: Descendant | Descendant[]): string => { if (Array.isArray(node)) return node.map((n) => toPlainText(n)).join(''); - if (Text.isText(node)) return sanitizeText(node.text); + if (Text.isText(node)) return node.text; const children = node.children.map((n) => toPlainText(n)).join(''); return elementToPlainText(node, children); diff --git a/src/app/components/emoji-board/EmojiBoard.css.tsx b/src/app/components/emoji-board/EmojiBoard.css.tsx index 0fefc5b9..adeb2500 100644 --- a/src/app/components/emoji-board/EmojiBoard.css.tsx +++ b/src/app/components/emoji-board/EmojiBoard.css.tsx @@ -122,6 +122,7 @@ export const CustomEmojiImg = style([ { width: toRem(32), height: toRem(32), + objectFit: 'contain', }, ]); @@ -130,5 +131,6 @@ export const StickerImg = style([ { width: toRem(96), height: toRem(96), + objectFit: 'contain', }, ]); diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index c5f5038c..3b1ccc55 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -373,6 +373,7 @@ function ImagePackSidebarStack({ style={{ width: toRem(24), height: toRem(24), + objectFit: 'contain', }} src={mx.mxcUrlToHttp(pack.getPackAvatarUrl(usage) ?? '') || pack.avatarUrl} alt={label || 'Unknown Pack'} diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index 17830ad9..e79f4883 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -184,12 +184,13 @@ export const RoomInput = forwardRef( body, formattedBody, }); + ReactEditor.focus(editor); }; navigation.on(cons.events.navigation.REPLY_TO_CLICKED, handleReplyTo); return () => { navigation.removeListener(cons.events.navigation.REPLY_TO_CLICKED, handleReplyTo); }; - }, [setReplyDraft]); + }, [setReplyDraft, editor]); const handleRemoveUpload = useCallback( (upload: TUploadContent | TUploadContent[]) => { From bc5e7445d9cb1ff2ad71981b8d405c221aacbd34 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 16 Jun 2023 11:09:09 +1000 Subject: [PATCH 454/824] Add ESC btn to toolbar to quickly exit formatting (#1283) * Add ESC btn to toolbar to quickly exit formatting * add horizontal scroll to toolbar item * make editor toolbar usable in touch device * fix editor hotkeys not working in window * remove unused import --- src/app/components/editor/Editor.css.ts | 14 +- src/app/components/editor/Editor.tsx | 8 +- src/app/components/editor/Toolbar.tsx | 225 +++++++++++++++--------- src/app/components/editor/common.ts | 4 +- src/app/components/editor/keyboard.ts | 6 +- src/app/organisms/room/RoomInput.tsx | 58 ++++-- src/app/utils/key-symbol.ts | 3 + 7 files changed, 210 insertions(+), 108 deletions(-) diff --git a/src/app/components/editor/Editor.css.ts b/src/app/components/editor/Editor.css.ts index 034ded79..9ec8cfaf 100644 --- a/src/app/components/editor/Editor.css.ts +++ b/src/app/components/editor/Editor.css.ts @@ -43,6 +43,7 @@ export const EditorPlaceholder = style([ { position: 'absolute', zIndex: 1, + width: '100%', opacity: config.opacity.Placeholder, pointerEvents: 'none', userSelect: 'none', @@ -55,9 +56,10 @@ export const EditorPlaceholder = style([ }, ]); -export const EditorToolbar = style([ - DefaultReset, - { - padding: config.space.S100, - }, -]); +export const EditorToolbarBase = style({ + padding: `0 ${config.borderWidth.B300}`, +}); + +export const EditorToolbar = style({ + padding: config.space.S100, +}); diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index 2657b213..3f048a6f 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -104,7 +104,13 @@ export const CustomEditor = forwardRef( // eslint-disable-next-line @typescript-eslint/no-unused-vars const { style, ...props } = attributes; return ( - + {children} ); diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index a84fca22..72e2c38c 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -10,6 +10,7 @@ import { Line, Menu, PopOut, + Scroll, Text, Tooltip, TooltipProvider, @@ -17,7 +18,14 @@ import { } from 'folds'; import React, { ReactNode, useState } from 'react'; import { ReactEditor, useSlate } from 'slate-react'; -import { isBlockActive, isMarkActive, toggleBlock, toggleMark } from './common'; +import { + isAnyMarkActive, + isBlockActive, + isMarkActive, + removeAllMark, + toggleBlock, + toggleMark, +} from './common'; import * as css from './Editor.css'; import { BlockType, MarkType } from './Elements'; import { HeadingLevel } from './slate'; @@ -44,6 +52,11 @@ function BtnTooltip({ text, shortCode }: { text: string; shortCode?: string }) { type MarkButtonProps = { format: MarkType; icon: IconSrc; tooltip: ReactNode }; export function MarkButton({ format, icon, tooltip }: MarkButtonProps) { const editor = useSlate(); + const disableInline = isBlockActive(editor, BlockType.CodeBlock); + + if (disableInline) { + removeAllMark(editor); + } const handleClick = () => { toggleMark(editor, format); @@ -58,10 +71,11 @@ export function MarkButton({ format, icon, tooltip }: MarkButtonProps) { variant="SurfaceVariant" onClick={handleClick} aria-pressed={isMarkActive(editor, format)} - size="300" + size="400" radii="300" + disabled={disableInline} > - + )} @@ -89,10 +103,10 @@ export function BlockButton({ format, icon, tooltip }: BlockButtonProps) { variant="SurfaceVariant" onClick={handleClick} aria-pressed={isBlockActive(editor, format)} - size="300" + size="400" radii="300" > - + )} @@ -115,6 +129,7 @@ export function HeadingBlockButton() { return ( - handleMenuSelect(1)} size="300" radii="300"> - + handleMenuSelect(1)} size="400" radii="300"> + - handleMenuSelect(2)} size="300" radii="300"> - + handleMenuSelect(2)} size="400" radii="300"> + - handleMenuSelect(3)} size="300" radii="300"> - + handleMenuSelect(3)} size="400" radii="300"> + @@ -151,97 +166,143 @@ export function HeadingBlockButton() { variant="SurfaceVariant" onClick={() => (isActive ? toggleBlock(editor, BlockType.Heading) : setOpen(!open))} aria-pressed={isActive} - size="300" + size="400" radii="300" > - - + + )} ); } -export function Toolbar() { +type ExitFormattingProps = { tooltip: ReactNode }; +export function ExitFormatting({ tooltip }: ExitFormattingProps) { const editor = useSlate(); - const allowInline = !isBlockActive(editor, BlockType.CodeBlock); - const modKey = isMacOS() ? KeySymbol.Command : 'Ctrl'; + + const handleClick = () => { + if (isAnyMarkActive(editor)) { + removeAllMark(editor); + } else if (!isBlockActive(editor, BlockType.Paragraph)) { + toggleBlock(editor, BlockType.Paragraph); + } + ReactEditor.focus(editor); + }; return ( - - - - - } - /> - - } - /> - - } - /> - - } - /> - - {allowInline && ( - <> - - - } + + {(triggerRef) => ( + + {`Exit ${KeySymbol.Hyper}`} + + )} + + ); +} + +export function Toolbar() { + const editor = useSlate(); + const modKey = isMacOS() ? KeySymbol.Command : 'Ctrl'; + + const canEscape = isAnyMarkActive(editor) || !isBlockActive(editor, BlockType.Paragraph); + + return ( + + + + <> + + } + /> + } + /> + } + /> + + } + /> + } + /> + } + /> + + + + + + } /> - } + + } /> - } + + } /> - } /> - } - /> - } - /> + - - )} + {canEscape && ( + <> + + + } + /> + + + )} + + ); } diff --git a/src/app/components/editor/common.ts b/src/app/components/editor/common.ts index 619a1bfe..2f20790d 100644 --- a/src/app/components/editor/common.ts +++ b/src/app/components/editor/common.ts @@ -32,7 +32,9 @@ export const toggleMark = (editor: Editor, format: MarkType) => { }; export const removeAllMark = (editor: Editor) => { - ALL_MARK_TYPE.forEach((mark) => Editor.removeMark(editor, mark)); + ALL_MARK_TYPE.forEach((mark) => { + if (isMarkActive(editor, mark)) Editor.removeMark(editor, mark); + }); }; export const isBlockActive = (editor: Editor, format: BlockType) => { diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index 3fbe5363..b6e1c3f4 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -15,7 +15,7 @@ export const INLINE_HOTKEYS: Record = { const INLINE_KEYS = Object.keys(INLINE_HOTKEYS); export const BLOCK_HOTKEYS: Record = { - 'mod+shift+0': BlockType.OrderedList, + 'mod+shift+7': BlockType.OrderedList, 'mod+shift+8': BlockType.UnorderedList, "mod+shift+'": BlockType.BlockQuote, 'mod+shift+;': BlockType.CodeBlock, @@ -26,12 +26,12 @@ const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); * @return boolean true if shortcut is toggled. */ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent): boolean => { - if (isHotkey('escape', event)) { + if (isHotkey('mod+e', event)) { if (isAnyMarkActive(editor)) { removeAllMark(editor); return true; } - console.log(isBlockActive(editor, BlockType.Paragraph)); + if (!isBlockActive(editor, BlockType.Paragraph)) { toggleBlock(editor, BlockType.Paragraph); return true; diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index e79f4883..3a22b57f 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -19,6 +19,7 @@ import { Icon, IconButton, Icons, + Line, Overlay, OverlayBackdrop, OverlayCenter, @@ -95,6 +96,7 @@ import { MessageReply } from '../../molecules/message/Message'; import colorMXID from '../../../util/colorMXID'; import { parseReplyBody, parseReplyFormattedBody } from '../../utils/room'; import { sanitizeText } from '../../utils/sanitize'; +import { getResizeObserverEntry, useResizeObserver } from '../../hooks/useResizeObserver'; interface RoomInputProps { roomViewRef: RefObject; @@ -158,6 +160,16 @@ export const RoomInput = forwardRef( const handlePaste = useFilePasteHandler(handleFiles); const dropZoneVisible = useFileDropZone(roomViewRef, handleFiles); + const [mobile, setMobile] = useState(document.body.clientWidth < 500); + useResizeObserver( + document.body, + useCallback((entries) => { + const bodyEntry = getResizeObserverEntry(document.body, entries); + if (bodyEntry && bodyEntry.contentRect.width < 500) setMobile(true); + else setMobile(false); + }, []) + ); + useEffect(() => { Transforms.insertFragment(editor, msgDraft); }, [editor, msgDraft]); @@ -500,27 +512,36 @@ export const RoomInput = forwardRef( > {(anchorRef) => ( <> - setEmojiBoardTab(EmojiBoardTab.Sticker)} - variant="SurfaceVariant" - size="300" - radii="300" - > - - + {!mobile && ( + setEmojiBoardTab(EmojiBoardTab.Sticker)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + )} setEmojiBoardTab(EmojiBoardTab.Emoji)} variant="SurfaceVariant" size="300" radii="300" > - + )} @@ -532,7 +553,14 @@ export const RoomInput = forwardRef( } - bottom={toolbar && } + bottom={ + toolbar && ( +
    + + +
    + ) + } />
    ); diff --git a/src/app/utils/key-symbol.ts b/src/app/utils/key-symbol.ts index 7e758fd9..00dd1042 100644 --- a/src/app/utils/key-symbol.ts +++ b/src/app/utils/key-symbol.ts @@ -3,4 +3,7 @@ export enum KeySymbol { Shift = '⇧', Option = '⌥', Control = '⌃', + Hyper = '✦', + Super = '❖', + Escape = '⎋', } From 41f67cabc047dc44c36c5b907004c4d03b782a9d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 16 Jun 2023 11:11:03 +1000 Subject: [PATCH 455/824] Add editor history (#1284) * add slate editor history * reset mark on editor reset --- package-lock.json | 12 ++++++++++++ package.json | 1 + src/app/components/editor/Editor.tsx | 4 ++-- src/app/components/editor/common.ts | 9 +++++++++ src/app/components/editor/slate.d.ts | 7 +++---- src/app/organisms/room/RoomInput.tsx | 3 +++ 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99e3c913..bb98ea69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "react-modal": "3.16.1", "sanitize-html": "2.8.0", "slate": "0.90.0", + "slate-history": "0.93.0", "slate-react": "0.90.0", "tippy.js": "6.3.7", "twemoji": "14.0.2", @@ -5210,6 +5211,17 @@ "tiny-warning": "^1.0.3" } }, + "node_modules/slate-history": { + "version": "0.93.0", + "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.93.0.tgz", + "integrity": "sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, "node_modules/slate-react": { "version": "0.90.0", "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.90.0.tgz", diff --git a/package.json b/package.json index 5f0f42f2..bf9adeae 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "react-modal": "3.16.1", "sanitize-html": "2.8.0", "slate": "0.90.0", + "slate-history": "0.93.0", "slate-react": "0.90.0", "tippy.js": "6.3.7", "twemoji": "14.0.2", diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index 3f048a6f..f4241e0e 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -7,7 +7,6 @@ import React, { useCallback, useState, } from 'react'; - import { Box, Scroll, Text } from 'folds'; import { Descendant, Editor, createEditor } from 'slate'; import { @@ -18,6 +17,7 @@ import { RenderElementProps, RenderPlaceholderProps, } from 'slate-react'; +import { withHistory } from 'slate-history'; import { BlockType, RenderElement, RenderLeaf } from './Elements'; import { CustomElement } from './slate'; import * as css from './Editor.css'; @@ -50,7 +50,7 @@ const withVoid = (editor: Editor): Editor => { }; export const useEditor = (): Editor => { - const [editor] = useState(withInline(withVoid(withReact(createEditor())))); + const [editor] = useState(withInline(withVoid(withReact(withHistory(createEditor()))))); return editor; }; diff --git a/src/app/components/editor/common.ts b/src/app/components/editor/common.ts index 2f20790d..19884097 100644 --- a/src/app/components/editor/common.ts +++ b/src/app/components/editor/common.ts @@ -124,6 +124,15 @@ export const resetEditor = (editor: Editor) => { }); toggleBlock(editor, BlockType.Paragraph); + removeAllMark(editor); +}; + +export const resetEditorHistory = (editor: Editor) => { + // eslint-disable-next-line no-param-reassign + editor.history = { + undos: [], + redos: [], + }; }; export const createMentionElement = ( diff --git a/src/app/components/editor/slate.d.ts b/src/app/components/editor/slate.d.ts index a321904b..74b20708 100644 --- a/src/app/components/editor/slate.d.ts +++ b/src/app/components/editor/slate.d.ts @@ -1,10 +1,11 @@ import { BaseEditor } from 'slate'; import { ReactEditor } from 'slate-react'; +import { HistoryEditor } from 'slate-history'; import { BlockType } from './Elements'; export type HeadingLevel = 1 | 2 | 3; -export type Editor = BaseEditor & ReactEditor; +export type Editor = BaseEditor & HistoryEditor & ReactEditor; export type Text = { text: string; @@ -96,11 +97,9 @@ export type CustomElement = | OrderedListElement | UnorderedListElement; -export type CustomEditor = BaseEditor & ReactEditor; - declare module 'slate' { interface CustomTypes { - Editor: BaseEditor & ReactEditor; + Editor: Editor; Element: CustomElement; Text: FormattedText & Text; } diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index 3a22b57f..39016add 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -50,6 +50,7 @@ import { EmoticonAutocomplete, createEmoticonElement, moveCursor, + resetEditorHistory, } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; @@ -180,6 +181,7 @@ export const RoomInput = forwardRef( const parsedDraft = JSON.parse(JSON.stringify(editor.children)); setMsgDraft(parsedDraft); resetEditor(editor); + resetEditorHistory(editor); }; }, [roomId, editor, setMsgDraft]); @@ -288,6 +290,7 @@ export const RoomInput = forwardRef( } mx.sendMessage(roomId, content); resetEditor(editor); + resetEditorHistory(editor); setReplyDraft(); sendTypingStatus(false); }, [mx, roomId, editor, replyDraft, sendTypingStatus, setReplyDraft]); From f05dccd384e60d7e93be307c409a3b5f0bda066f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:07:04 +1000 Subject: [PATCH 456/824] Bump nginx from 1.25.0-alpine to 1.25.1-alpine (#1288) Bumps nginx from 1.25.0-alpine to 1.25.1-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3cae982a..da04492c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm run build ## App -FROM nginx:1.25.0-alpine +FROM nginx:1.25.1-alpine COPY --from=builder /src/dist /app From e6a343c7ec512f861725dbb5b37100967cb8ccf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:07:34 +1000 Subject: [PATCH 457/824] Bump docker/login-action from 2.1.0 to 2.2.0 (#1289) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2.1.0...v2.2.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 484ecba9..ef2cd752 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -72,12 +72,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.6.0 - name: Login to Docker Hub - uses: docker/login-action@v2.1.0 + uses: docker/login-action@v2.2.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to the Container registry - uses: docker/login-action@v2.1.0 + uses: docker/login-action@v2.2.0 with: registry: ghcr.io username: ${{ github.actor }} From bec78e84e6db82dec19cb1a8e004af07e40f029e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:08:08 +1000 Subject: [PATCH 458/824] Bump docker/setup-qemu-action from 2.1.0 to 2.2.0 (#1295) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2.1.0...v2.2.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index ef2cd752..413cb11d 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Set up QEMU - uses: docker/setup-qemu-action@v2.1.0 + uses: docker/setup-qemu-action@v2.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.6.0 - name: Login to Docker Hub From e65dd330848051e6ee93e2bce536cd49c349cdad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:08:37 +1000 Subject: [PATCH 459/824] Bump docker/build-push-action from 4.1.0 to 4.1.1 (#1290) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 3edc3c18..30235157 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Build Docker image - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 413cb11d..277fc742 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: context: . platforms: linux/amd64,linux/arm64 From 3b1e3ea62cb63d4e00b89fa0c9efa2fc1e058c59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:09:06 +1000 Subject: [PATCH 460/824] Bump docker/metadata-action from 4.5.0 to 4.6.0 (#1292) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.5.0 to 4.6.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v4.5.0...v4.6.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 277fc742..058b5f23 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -84,7 +84,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v4.5.0 + uses: docker/metadata-action@v4.6.0 with: images: | ${{ secrets.DOCKER_USERNAME }}/cinny From b78d568d9f5b80ab674df6890dfc974de7c1c88c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:09:25 +1000 Subject: [PATCH 461/824] Bump cla-assistant/github-action from 2.2.1 to 2.3.0 (#1294) Bumps [cla-assistant/github-action](https://github.com/cla-assistant/github-action) from 2.2.1 to 2.3.0. - [Release notes](https://github.com/cla-assistant/github-action/releases) - [Commits](https://github.com/cla-assistant/github-action/compare/v2.2.1...v2.3.0) --- updated-dependencies: - dependency-name: cla-assistant/github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index b433b8d9..1b9461b6 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -12,7 +12,7 @@ jobs: - name: 'CLA Assistant' if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' # Beta Release - uses: cla-assistant/github-action@v2.2.1 + uses: cla-assistant/github-action@v2.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # the below token should have repo scope and must be manually added by you in the repository's secret From 715f2bc90743af665cfd2ed7258c1aaf2ce90fae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 09:10:12 +1000 Subject: [PATCH 462/824] Bump docker/setup-buildx-action from 2.6.0 to 2.7.0 (#1293) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.6.0...v2.7.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 058b5f23..66f40523 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.6.0 + uses: docker/setup-buildx-action@v2.7.0 - name: Login to Docker Hub uses: docker/login-action@v2.2.0 with: From 4c84673bdf3ef3ffe593efe1f2614caa28a963a3 Mon Sep 17 00:00:00 2001 From: ZeroAurora Date: Wed, 21 Jun 2023 08:00:43 +0800 Subject: [PATCH 463/824] Improve verification instructions (#1301) --- src/app/organisms/settings/DeviceManage.jsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 4825e238..74738ea8 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -217,6 +217,26 @@ function DeviceManage() {
    Unverified sessions + {!isMeVerified && ( +
    + +
    + )} + {isMeVerified && unverified.length > 0 && ( +
    + +
    + )} {!isCSEnabled && (
    Date: Wed, 21 Jun 2023 20:59:02 +1000 Subject: [PATCH 464/824] fix global pack showing all room packs (#1303) --- src/app/plugins/custom-emoji.ts | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/app/plugins/custom-emoji.ts b/src/app/plugins/custom-emoji.ts index daceef44..ffb37944 100644 --- a/src/app/plugins/custom-emoji.ts +++ b/src/app/plugins/custom-emoji.ts @@ -1,4 +1,4 @@ -import { IImageInfo, MatrixClient, Room } from 'matrix-js-sdk'; +import { IImageInfo, MatrixClient, MatrixEvent, Room } from 'matrix-js-sdk'; import { AccountDataEvent } from '../../types/matrix/accountData'; import { getAccountData, getStateEvents } from '../utils/room'; import { StateEvent } from '../../types/matrix/room'; @@ -225,21 +225,24 @@ export class ImagePack { } } -export function getRoomImagePacks(room: Room): ImagePack[] { - const dataEvents = getStateEvents(room, StateEvent.PoniesRoomEmotes); - - return dataEvents.reduce((roomPacks, packEvent) => { +export function packEventsToImagePacks(packEvents: MatrixEvent[]): ImagePack[] { + return packEvents.reduce((imagePacks, packEvent) => { const packId = packEvent?.getId(); const content = packEvent?.getContent() as PackContent | undefined; - if (!packId || !content) return roomPacks; + if (!packId || !content) return imagePacks; const pack = ImagePack.parsePack(packId, content); if (pack) { - roomPacks.push(pack); + imagePacks.push(pack); } - return roomPacks; + return imagePacks; }, []); } +export function getRoomImagePacks(room: Room): ImagePack[] { + const dataEvents = getStateEvents(room, StateEvent.PoniesRoomEmotes); + return packEventsToImagePacks(dataEvents); +} + export function getGlobalImagePacks(mx: MatrixClient): ImagePack[] { const emoteRoomsContent = getAccountData(mx, AccountDataEvent.PoniesEmoteRooms)?.getContent() as | EmoteRoomsContent @@ -255,7 +258,14 @@ export function getGlobalImagePacks(mx: MatrixClient): ImagePack[] { if (typeof rooms[roomId] !== 'object') return []; const room = mx.getRoom(roomId); if (!room) return []; - return getRoomImagePacks(room); + const packEventIdToUnknown = rooms[roomId]; + const roomPacks = getStateEvents(room, StateEvent.PoniesRoomEmotes); + const globalPacks = roomPacks.filter((mE) => { + const packKey = mE.getStateKey(); + if (typeof packKey === 'string') return !!packEventIdToUnknown[packKey]; + return false; + }); + return packEventsToImagePacks(globalPacks); }); return packs; From da32d0d9e7b2ccee0352cc63999fbf23bd4de869 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 21 Jun 2023 22:26:27 +1000 Subject: [PATCH 465/824] Update project link (#1302) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d4a38ac..0910dfbb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@

    A Matrix client focusing primarily on simple, elegant and secure interface. The main goal is to have an instant messaging application that is easy on people and has a modern touch. -- [Roadmap](https://github.com/ajbura/cinny/projects/11) +- [Roadmap](https://github.com/orgs/cinnyapp/projects/1) - [Contributing](./CONTRIBUTING.md) From c07905c360c7c975d9eda39964764ff0cb63ad01 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 22 Jun 2023 09:14:50 +1000 Subject: [PATCH 466/824] Improve Members Right Panel (#1286) * fix room members hook * fix resize observer hook * add intersection observer hook * install react-virtual lib * improve right panel - WIP * add filters for members * fix bug in async search * categories members and add search * show spinner on room member fetch * make invite member btn clickable * so no member text * add line between room view and member drawer * fix imports * add screen size hook * fix set setting hook * make member drawer responsive * extract power level tags hook * fix room members hook * fix use async search api * produce search result on filter change --- package-lock.json | 173 +++++- package.json | 2 + .../autocomplete/EmoticonAutocomplete.tsx | 7 +- .../autocomplete/RoomMentionAutocomplete.tsx | 7 +- .../autocomplete/UserMentionAutocomplete.tsx | 7 +- src/app/components/emoji-board/EmojiBoard.tsx | 11 +- src/app/hooks/useAsyncSearch.ts | 17 +- src/app/hooks/useIntersectionObserver.ts | 37 ++ src/app/hooks/usePowerLevelTags.ts | 38 ++ src/app/hooks/useResizeObserver.ts | 7 +- src/app/hooks/useRoomMembers.ts | 15 +- src/app/hooks/useScreenSize.ts | 36 ++ src/app/organisms/room/MembersDrawer.css.ts | 64 +++ src/app/organisms/room/MembersDrawer.tsx | 528 ++++++++++++++++++ src/app/organisms/room/Room.jsx | 26 +- src/app/organisms/room/RoomInput.tsx | 21 +- src/app/organisms/room/RoomViewContent.jsx | 4 +- src/app/organisms/room/RoomViewHeader.jsx | 56 +- src/app/state/hooks/settings.ts | 7 +- 19 files changed, 984 insertions(+), 79 deletions(-) create mode 100644 src/app/hooks/useIntersectionObserver.ts create mode 100644 src/app/hooks/usePowerLevelTags.ts create mode 100644 src/app/hooks/useScreenSize.ts create mode 100644 src/app/organisms/room/MembersDrawer.css.ts create mode 100644 src/app/organisms/room/MembersDrawer.tsx diff --git a/package-lock.json b/package-lock.json index bb98ea69..61eebbf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", + "@tanstack/react-virtual": "3.0.0-beta.54", "@tippyjs/react": "4.2.6", "@vanilla-extract/css": "1.9.3", "@vanilla-extract/recipes": "0.3.0", @@ -37,6 +38,7 @@ "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "24.1.0", + "millify": "6.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -1106,6 +1108,30 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@tanstack/react-virtual": { + "version": "3.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.54.tgz", + "integrity": "sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==", + "dependencies": { + "@tanstack/virtual-core": "3.0.0-beta.54" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.54.tgz", + "integrity": "sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tippyjs/react": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", @@ -1669,7 +1695,6 @@ "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" } @@ -2058,6 +2083,19 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3349,6 +3387,14 @@ "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", @@ -3771,6 +3817,14 @@ "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==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4286,6 +4340,17 @@ "node": ">=8.6" } }, + "node_modules/millify": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/millify/-/millify-6.1.0.tgz", + "integrity": "sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==", + "dependencies": { + "yargs": "^17.0.1" + }, + "bin": { + "millify": "bin/millify" + } + }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", @@ -4965,6 +5030,14 @@ "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": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", @@ -5256,6 +5329,24 @@ "node": ">=0.10.0" } }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==" + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -5307,7 +5398,6 @@ "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" }, @@ -6166,12 +6256,66 @@ "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==", + "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/wrap-ansi/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "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==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -6186,6 +6330,31 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index bf9adeae..beaae095 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", + "@tanstack/react-virtual": "3.0.0-beta.54", "@tippyjs/react": "4.2.6", "@vanilla-extract/css": "1.9.3", "@vanilla-extract/recipes": "0.3.0", @@ -47,6 +48,7 @@ "linkify-html": "4.0.2", "linkifyjs": "4.0.2", "matrix-js-sdk": "24.1.0", + "millify": "6.1.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index 17712b87..2e556000 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -60,12 +60,13 @@ export function EmoticonAutocomplete({ ); }, [imagePacks]); - const [result, search] = useAsyncSearch(searchList, getEmoticonStr, SEARCH_OPTIONS); + const [result, search, resetSearch] = useAsyncSearch(searchList, getEmoticonStr, SEARCH_OPTIONS); const autoCompleteEmoticon = result ? result.items : recentEmoji; useEffect(() => { - search(query.text); - }, [query.text, search]); + if (query.text) search(query.text); + else resetSearch(); + }, [query.text, search, resetSearch]); const handleAutocomplete: EmoticonCompleteHandler = (key, shortcode) => { const emoticonEl = createEmoticonElement(key, shortcode); diff --git a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx index 2edfb8bc..6bea1952 100644 --- a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx @@ -81,7 +81,7 @@ export function RoomMentionAutocomplete({ return [...spaces, ...rooms, ...directs].sort(roomIdByActivity); }, []); - const [result, search] = useAsyncSearch( + const [result, search, resetSearch] = useAsyncSearch( allRoomId, useCallback( (rId) => { @@ -99,8 +99,9 @@ export function RoomMentionAutocomplete({ const autoCompleteRoomIds = result ? result.items : allRoomId.slice(0, 20); useEffect(() => { - search(query.text); - }, [query.text, search]); + if (query.text) search(query.text); + else resetSearch(); + }, [query.text, search, resetSearch]); const handleAutocomplete: MentionAutoCompleteHandler = (roomAliasOrId, name) => { const mentionEl = createMentionElement( diff --git a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx index 10088ada..00ecb015 100644 --- a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx @@ -94,12 +94,13 @@ export function UserMentionAutocomplete({ const roomAliasOrId = room?.getCanonicalAlias() || roomId; const members = useRoomMembers(mx, roomId); - const [result, search] = useAsyncSearch(members, getRoomMemberStr, SEARCH_OPTIONS); + const [result, search, resetSearch] = useAsyncSearch(members, getRoomMemberStr, SEARCH_OPTIONS); const autoCompleteMembers = result ? result.items : members.slice(0, 20); useEffect(() => { - search(query.text); - }, [query.text, search]); + if (query.text) search(query.text); + else resetSearch(); + }, [query.text, search, resetSearch]); const handleAutocomplete: MentionAutoCompleteHandler = (uId, name) => { const mentionEl = createMentionElement( diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 3b1ccc55..4005234a 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -647,15 +647,20 @@ export function EmojiBoard({ return list; }, [emojiTab, usage, imagePacks]); - const [result, search] = useAsyncSearch(searchList, getSearchListItemStr, SEARCH_OPTIONS); + const [result, search, resetSearch] = useAsyncSearch( + searchList, + getSearchListItemStr, + SEARCH_OPTIONS + ); const handleOnChange: ChangeEventHandler = useDebounce( useCallback( (evt) => { const term = evt.target.value; - search(term); + if (term) search(term); + else resetSearch(); }, - [search] + [search, resetSearch] ), { wait: 200 } ); diff --git a/src/app/hooks/useAsyncSearch.ts b/src/app/hooks/useAsyncSearch.ts index b083a19a..d0e73e7f 100644 --- a/src/app/hooks/useAsyncSearch.ts +++ b/src/app/hooks/useAsyncSearch.ts @@ -25,11 +25,13 @@ export type UseAsyncSearchResult = items: TSearchItem[]; }; +export type SearchResetHandler = () => void; + export const useAsyncSearch = ( list: TSearchItem[], getItemStr: SearchItemStrGetter, options?: UseAsyncSearchOptions -): [UseAsyncSearchResult | undefined, AsyncSearchHandler] => { +): [UseAsyncSearchResult | undefined, AsyncSearchHandler, SearchResetHandler] => { const [result, setResult] = useState>(); const [searchCallback, terminateSearch] = useMemo(() => { @@ -51,7 +53,7 @@ export const useAsyncSearch = ( const handleResult: ResultHandler = (results, query) => setResult({ query, - items: results, + items: [...results], }); return AsyncSearch(list, handleMatch, handleResult, options); @@ -60,15 +62,16 @@ export const useAsyncSearch = ( const searchHandler: AsyncSearchHandler = useCallback( (query) => { const normalizedQuery = normalize(query, options?.normalizeOptions); - if (!normalizedQuery) { - setResult(undefined); - return; - } searchCallback(normalizedQuery); }, [searchCallback, options?.normalizeOptions] ); + const resetHandler: SearchResetHandler = useCallback(() => { + terminateSearch(); + setResult(undefined); + }, [terminateSearch]); + useEffect( () => () => { // terminate any ongoing search request on unmount. @@ -77,5 +80,5 @@ export const useAsyncSearch = ( [terminateSearch] ); - return [result, searchHandler]; + return [result, searchHandler, resetHandler]; }; diff --git a/src/app/hooks/useIntersectionObserver.ts b/src/app/hooks/useIntersectionObserver.ts new file mode 100644 index 00000000..754007ae --- /dev/null +++ b/src/app/hooks/useIntersectionObserver.ts @@ -0,0 +1,37 @@ +import { useEffect, useState } from 'react'; + +export type OnIntersectionCallback = (entries: IntersectionObserverEntry[]) => void; + +export type IntersectionObserverOpts = { + root?: Element | Document | null; + rootMargin?: string; + threshold?: number | number[]; +}; + +export const getIntersectionObserverEntry = ( + target: Element | Document, + entries: IntersectionObserverEntry[] +): IntersectionObserverEntry | undefined => entries.find((entry) => entry.target === target); + +export const useIntersectionObserver = ( + onIntersectionCallback: OnIntersectionCallback, + opts?: IntersectionObserverOpts | (() => IntersectionObserverOpts), + observeElement?: Element | null | (() => Element | null) +): IntersectionObserver | undefined => { + const [intersectionObserver, setIntersectionObserver] = useState(); + + useEffect(() => { + const initOpts = typeof opts === 'function' ? opts() : opts; + setIntersectionObserver(new IntersectionObserver(onIntersectionCallback, initOpts)); + }, [onIntersectionCallback, opts]); + + useEffect(() => { + const element = typeof observeElement === 'function' ? observeElement() : observeElement; + if (element) intersectionObserver?.observe(element); + return () => { + if (element) intersectionObserver?.unobserve(element); + }; + }, [intersectionObserver, observeElement]); + + return intersectionObserver; +}; diff --git a/src/app/hooks/usePowerLevelTags.ts b/src/app/hooks/usePowerLevelTags.ts new file mode 100644 index 00000000..dd0a3df8 --- /dev/null +++ b/src/app/hooks/usePowerLevelTags.ts @@ -0,0 +1,38 @@ +import { useCallback, useMemo } from 'react'; + +export type PowerLevelTag = { + name: string; +}; +export const usePowerLevelTags = () => { + const powerLevelTags = useMemo( + () => ({ + 9000: { + name: 'Goku', + }, + 101: { + name: 'Founder', + }, + 100: { + name: 'Admin', + }, + 50: { + name: 'Moderator', + }, + 0: { + name: 'Default', + }, + }), + [] + ); + + return useCallback( + (powerLevel: number): PowerLevelTag => { + if (powerLevel >= 9000) return powerLevelTags[9000]; + if (powerLevel >= 101) return powerLevelTags[101]; + if (powerLevel === 100) return powerLevelTags[100]; + if (powerLevel >= 50) return powerLevelTags[50]; + return powerLevelTags[0]; + }, + [powerLevelTags] + ); +}; diff --git a/src/app/hooks/useResizeObserver.ts b/src/app/hooks/useResizeObserver.ts index 69ec65d0..1e0fc726 100644 --- a/src/app/hooks/useResizeObserver.ts +++ b/src/app/hooks/useResizeObserver.ts @@ -8,17 +8,18 @@ export const getResizeObserverEntry = ( ): ResizeObserverEntry | undefined => entries.find((entry) => entry.target === target); export const useResizeObserver = ( - element: Element | null, - onResizeCallback: OnResizeCallback + onResizeCallback: OnResizeCallback, + observeElement?: Element | null | (() => Element | null) ): ResizeObserver => { const resizeObserver = useMemo(() => new ResizeObserver(onResizeCallback), [onResizeCallback]); useEffect(() => { + const element = typeof observeElement === 'function' ? observeElement() : observeElement; if (element) resizeObserver.observe(element); return () => { if (element) resizeObserver.unobserve(element); }; - }, [resizeObserver, element]); + }, [resizeObserver, observeElement]); return resizeObserver; }; diff --git a/src/app/hooks/useRoomMembers.ts b/src/app/hooks/useRoomMembers.ts index 544d97a0..df369011 100644 --- a/src/app/hooks/useRoomMembers.ts +++ b/src/app/hooks/useRoomMembers.ts @@ -1,23 +1,25 @@ import { MatrixClient, MatrixEvent, RoomMember, RoomMemberEvent } from 'matrix-js-sdk'; import { useEffect, useState } from 'react'; -import { useAlive } from './useAlive'; export const useRoomMembers = (mx: MatrixClient, roomId: string): RoomMember[] => { const [members, setMembers] = useState([]); - const alive = useAlive(); useEffect(() => { const room = mx.getRoom(roomId); + let loadingMembers = true; + let disposed = false; const updateMemberList = (event?: MatrixEvent) => { - if (!room || !alive || (event && event.getRoomId() !== roomId)) return; + if (!room || disposed || (event && event.getRoomId() !== roomId)) return; + if (loadingMembers) return; setMembers(room.getMembers()); }; if (room) { - updateMemberList(); + setMembers(room.getMembers()); room.loadMembersIfNeeded().then(() => { - if (!alive) return; + loadingMembers = false; + if (disposed) return; updateMemberList(); }); } @@ -25,10 +27,11 @@ export const useRoomMembers = (mx: MatrixClient, roomId: string): RoomMember[] = mx.on(RoomMemberEvent.Membership, updateMemberList); mx.on(RoomMemberEvent.PowerLevel, updateMemberList); return () => { + disposed = true; mx.removeListener(RoomMemberEvent.Membership, updateMemberList); mx.removeListener(RoomMemberEvent.PowerLevel, updateMemberList); }; - }, [mx, roomId, alive]); + }, [mx, roomId]); return members; }; diff --git a/src/app/hooks/useScreenSize.ts b/src/app/hooks/useScreenSize.ts new file mode 100644 index 00000000..4afe9083 --- /dev/null +++ b/src/app/hooks/useScreenSize.ts @@ -0,0 +1,36 @@ +import { useCallback, useState } from 'react'; +import { getResizeObserverEntry, useResizeObserver } from './useResizeObserver'; + +export const TABLET_BREAKPOINT = 1124; +export const MOBILE_BREAKPOINT = 750; + +export enum ScreenSize { + Desktop = 'Desktop', + Tablet = 'Tablet', + Mobile = 'Mobile', +} + +export const getScreenSize = (width: number): ScreenSize => { + if (width > TABLET_BREAKPOINT) return ScreenSize.Desktop; + if (width > MOBILE_BREAKPOINT) return ScreenSize.Tablet; + return ScreenSize.Mobile; +}; + +export const useScreenSize = (): [ScreenSize, number] => { + const [size, setSize] = useState<[ScreenSize, number]>([ + getScreenSize(document.body.clientWidth), + document.body.clientWidth, + ]); + useResizeObserver( + useCallback((entries) => { + const bodyEntry = getResizeObserverEntry(document.body, entries); + if (bodyEntry) { + const bWidth = bodyEntry.contentRect.width; + setSize([getScreenSize(bWidth), bWidth]); + } + }, []), + document.body + ); + + return size; +}; diff --git a/src/app/organisms/room/MembersDrawer.css.ts b/src/app/organisms/room/MembersDrawer.css.ts new file mode 100644 index 00000000..2718e92d --- /dev/null +++ b/src/app/organisms/room/MembersDrawer.css.ts @@ -0,0 +1,64 @@ +import { keyframes, style } from '@vanilla-extract/css'; +import { color, config, toRem } from 'folds'; + +export const MembersDrawer = style({ + width: toRem(266), + backgroundColor: color.Background.Container, + color: color.Background.OnContainer, +}); + +export const MembersDrawerHeader = style({ + flexShrink: 0, + padding: `0 ${config.space.S200} 0 ${config.space.S300}`, + borderBottomWidth: config.borderWidth.B300, +}); + +export const MemberDrawerContentBase = style({ + position: 'relative', + overflow: 'hidden', +}); + +export const MemberDrawerContent = style({ + padding: `${config.space.S300} 0`, +}); + +const ScrollBtnAnime = keyframes({ + '0%': { + transform: `translate(-50%, -100%) scale(0)`, + }, + '100%': { + transform: `translate(-50%, 0) scale(1)`, + }, +}); + +export const DrawerScrollTop = style({ + position: 'absolute', + top: config.space.S200, + left: '50%', + transform: 'translateX(-50%)', + zIndex: 1, + animation: `${ScrollBtnAnime} 100ms`, +}); + +export const DrawerGroup = style({ + padding: `0 ${config.space.S100} 0 ${config.space.S300}`, +}); + +export const MembersGroup = style({ + paddingLeft: config.space.S200, +}); +export const MembersGroupLabel = style({ + padding: config.space.S200, + selectors: { + '&:not(:first-child)': { + paddingTop: config.space.S500, + }, + }, +}); + +export const DrawerVirtualItem = style({ + position: 'absolute', + top: 0, + left: 0, + width: '100%', +}); diff --git a/src/app/organisms/room/MembersDrawer.tsx b/src/app/organisms/room/MembersDrawer.tsx new file mode 100644 index 00000000..d50c3666 --- /dev/null +++ b/src/app/organisms/room/MembersDrawer.tsx @@ -0,0 +1,528 @@ +import React, { + ChangeEventHandler, + MouseEventHandler, + useCallback, + useMemo, + useRef, + useState, +} from 'react'; +import { + Avatar, + AvatarFallback, + AvatarImage, + Box, + Chip, + ContainerColor, + Header, + Icon, + IconButton, + Icons, + Input, + Menu, + MenuItem, + PopOut, + Scroll, + Spinner, + Text, + Tooltip, + TooltipProvider, + config, +} from 'folds'; +import { Room, RoomMember } from 'matrix-js-sdk'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import FocusTrap from 'focus-trap-react'; +import millify from 'millify'; +import classNames from 'classnames'; + +import { openInviteUser, openProfileViewer } from '../../../client/action/navigation'; +import * as css from './MembersDrawer.css'; +import { useRoomMembers } from '../../hooks/useRoomMembers'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { + getIntersectionObserverEntry, + useIntersectionObserver, +} from '../../hooks/useIntersectionObserver'; +import { Membership } from '../../../types/matrix/room'; +import { UseStateProvider } from '../../components/UseStateProvider'; +import { UseAsyncSearchOptions, useAsyncSearch } from '../../hooks/useAsyncSearch'; +import { useDebounce } from '../../hooks/useDebounce'; +import colorMXID from '../../../util/colorMXID'; +import { usePowerLevelTags, PowerLevelTag } from '../../hooks/usePowerLevelTags'; + +export const MembershipFilters = { + filterJoined: (m: RoomMember) => m.membership === Membership.Join, + filterInvited: (m: RoomMember) => m.membership === Membership.Invite, + filterLeaved: (m: RoomMember) => + m.membership === Membership.Leave && + m.events.member?.getStateKey() === m.events.member?.getSender(), + filterKicked: (m: RoomMember) => + m.membership === Membership.Leave && + m.events.member?.getStateKey() !== m.events.member?.getSender(), + filterBanned: (m: RoomMember) => m.membership === Membership.Ban, +}; + +export type MembershipFilterFn = (m: RoomMember) => boolean; + +export type MembershipFilter = { + name: string; + filterFn: MembershipFilterFn; + color: ContainerColor; +}; + +const useMembershipFilterMenu = (): MembershipFilter[] => + useMemo( + () => [ + { + name: 'Joined', + filterFn: MembershipFilters.filterJoined, + color: 'Surface', + }, + { + name: 'Invited', + filterFn: MembershipFilters.filterInvited, + color: 'Success', + }, + { + name: 'Left', + filterFn: MembershipFilters.filterLeaved, + color: 'Secondary', + }, + { + name: 'Kicked', + filterFn: MembershipFilters.filterKicked, + color: 'Warning', + }, + { + name: 'Banned', + filterFn: MembershipFilters.filterBanned, + color: 'Critical', + }, + ], + [] + ); + +export const SortFilters = { + filterAscending: (a: RoomMember, b: RoomMember) => + a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1, + filterDescending: (a: RoomMember, b: RoomMember) => + a.name.toLowerCase() > b.name.toLowerCase() ? -1 : 1, + filterNewestFirst: (a: RoomMember, b: RoomMember) => + (b.events.member?.getTs() ?? 0) - (a.events.member?.getTs() ?? 0), + filterOldest: (a: RoomMember, b: RoomMember) => + (a.events.member?.getTs() ?? 0) - (b.events.member?.getTs() ?? 0), +}; + +export type SortFilterFn = (a: RoomMember, b: RoomMember) => number; + +export type SortFilter = { + name: string; + filterFn: SortFilterFn; +}; + +const useSortFilterMenu = (): SortFilter[] => + useMemo( + () => [ + { + name: 'A to Z', + filterFn: SortFilters.filterAscending, + }, + { + name: 'Z to A', + filterFn: SortFilters.filterDescending, + }, + { + name: 'Newest First', + filterFn: SortFilters.filterNewestFirst, + }, + { + name: 'Oldest First', + filterFn: SortFilters.filterOldest, + }, + ], + [] + ); + +export type MembersFilterOptions = { + membershipFilter: MembershipFilter; + sortFilter: SortFilter; +}; + +const SEARCH_OPTIONS: UseAsyncSearchOptions = { + limit: 100, + matchOptions: { + contain: true, + }, +}; +const getMemberItemStr = (m: RoomMember) => [m.name, m.userId]; + +type MembersDrawerProps = { + room: Room; +}; +export function MembersDrawer({ room }: MembersDrawerProps) { + const mx = useMatrixClient(); + const scrollRef = useRef(null); + const searchInputRef = useRef(null); + const scrollTopAnchorRef = useRef(null); + const members = useRoomMembers(mx, room.roomId); + const getPowerLevelTag = usePowerLevelTags(); + const fetchingMembers = members.length < room.getJoinedMemberCount(); + + const membershipFilterMenu = useMembershipFilterMenu(); + const sortFilterMenu = useSortFilterMenu(); + const [filter, setFilter] = useState({ + membershipFilter: membershipFilterMenu[0], + sortFilter: sortFilterMenu[0], + }); + const [onTop, setOnTop] = useState(true); + + const filteredMembers = useMemo( + () => + members + .filter(filter.membershipFilter.filterFn) + .sort(filter.sortFilter.filterFn) + .sort((a, b) => b.powerLevel - a.powerLevel), + [members, filter] + ); + + const [result, search, resetSearch] = useAsyncSearch( + filteredMembers, + getMemberItemStr, + SEARCH_OPTIONS + ); + if (!result && searchInputRef.current?.value) search(searchInputRef.current.value); + + const processMembers = result ? result.items : filteredMembers; + + const PLTagOrRoomMember = useMemo(() => { + let prevTag: PowerLevelTag | undefined; + const tagOrMember: Array = []; + processMembers.forEach((m) => { + const plTag = getPowerLevelTag(m.powerLevel); + if (plTag !== prevTag) { + prevTag = plTag; + tagOrMember.push(plTag); + } + tagOrMember.push(m); + }); + return tagOrMember; + }, [processMembers, getPowerLevelTag]); + + const virtualizer = useVirtualizer({ + count: PLTagOrRoomMember.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 40, + overscan: 10, + }); + + useIntersectionObserver( + useCallback((intersectionEntries) => { + if (!scrollTopAnchorRef.current) return; + const entry = getIntersectionObserverEntry(scrollTopAnchorRef.current, intersectionEntries); + if (entry) setOnTop(entry.isIntersecting); + }, []), + useCallback(() => ({ root: scrollRef.current }), []), + useCallback(() => scrollTopAnchorRef.current, []) + ); + + const handleSearchChange: ChangeEventHandler = useDebounce( + useCallback( + (evt) => { + if (evt.target.value) search(evt.target.value); + else resetSearch(); + }, + [search, resetSearch] + ), + { wait: 200 } + ); + + const handleMemberClick: MouseEventHandler = (evt) => { + const btn = evt.currentTarget as HTMLButtonElement; + const userId = btn.getAttribute('data-user-id'); + openProfileViewer(userId, room.roomId); + }; + + return ( + +
    + + + + {`${millify(room.getJoinedMemberCount(), { precision: 1 })} Members`} + + + + + Invite Member + + } + > + {(triggerRef) => ( + openInviteUser(room.roomId)} + > + + + )} + + + +
    + + + + + Filter + + + {(open, setOpen) => ( + setOpen(false), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + + {membershipFilterMenu.map((menuItem) => ( + { + setFilter((f) => ({ ...f, membershipFilter: menuItem })); + setOpen(false); + }} + > + {menuItem.name} + + ))} + + + } + > + {(anchorRef) => ( + setOpen(!open)} + variant={filter.membershipFilter.color} + radii="400" + outlined + after={} + > + {filter.membershipFilter.name} + + )} + + )} + + + {(open, setOpen) => ( + setOpen(false), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + + {sortFilterMenu.map((menuItem) => ( + { + setFilter((f) => ({ ...f, sortFilter: menuItem })); + setOpen(false); + }} + > + {menuItem.name} + + ))} + + + } + > + {(anchorRef) => ( + setOpen(!open)} + variant="Surface" + radii="400" + outlined + after={} + > + {`Order: ${filter.sortFilter.name}`} + + )} + + )} + + + + + + Search + } + after={ + result && ( + 0 ? 'Success' : 'Critical'} + size="400" + radii="Pill" + onClick={() => { + if (searchInputRef.current) searchInputRef.current.value = ''; + resetSearch(); + }} + after={} + > + {`${result.items.length || 'No'} ${ + result.items.length === 1 ? 'Result' : 'Results' + }`} + + ) + } + /> + + + {!onTop && ( + + virtualizer.scrollToOffset(0)} + variant="Surface" + radii="Pill" + outlined + size="300" + aria-label="Scroll to Top" + > + + + + )} + + {!fetchingMembers && !result && processMembers.length === 0 && ( + + {`No "${filter.membershipFilter.name}" Members`} + + )} + + +
    + {virtualizer.getVirtualItems().map((vItem) => { + const tagOrMember = PLTagOrRoomMember[vItem.index]; + if (!('userId' in tagOrMember)) { + return ( + + {tagOrMember.name} + + ); + } + + const member = tagOrMember; + const avatarUrl = member.getAvatarUrl( + mx.baseUrl, + 100, + 100, + 'crop', + undefined, + false + ); + + return ( + + {avatarUrl ? ( + + ) : ( + + {member.name[0]} + + )} + + } + > + + {member.name} + + + ); + })} +
    +
    + + {fetchingMembers && ( + + + + )} +
    +
    +
    +
    + ); +} diff --git a/src/app/organisms/room/Room.jsx b/src/app/organisms/room/Room.jsx index 9d861c96..0603b985 100644 --- a/src/app/organisms/room/Room.jsx +++ b/src/app/organisms/room/Room.jsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; import './Room.scss'; +import { Line } from 'folds'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; -import settings from '../../../client/state/settings'; import RoomTimeline from '../../../client/state/RoomTimeline'; import navigation from '../../../client/state/navigation'; import { openNavigation } from '../../../client/action/navigation'; @@ -11,7 +11,10 @@ import { openNavigation } from '../../../client/action/navigation'; import Welcome from '../welcome/Welcome'; import RoomView from './RoomView'; import RoomSettings from './RoomSettings'; -import PeopleDrawer from './PeopleDrawer'; +import { MembersDrawer } from './MembersDrawer'; +import { ScreenSize, useScreenSize } from '../../hooks/useScreenSize'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; function Room() { const [roomInfo, setRoomInfo] = useState({ @@ -19,7 +22,8 @@ function Room() { roomTimeline: null, eventId: null, }); - const [isDrawer, setIsDrawer] = useState(settings.isPeopleDrawer); + const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); + const [screenSize] = useScreenSize(); const mx = initMatrix.matrixClient; @@ -49,14 +53,6 @@ function Room() { }; }, [roomInfo, mx]); - useEffect(() => { - const handleDrawerToggling = (visiblity) => setIsDrawer(visiblity); - settings.on(cons.events.settings.PEOPLE_DRAWER_TOGGLED, handleDrawerToggling); - return () => { - settings.removeListener(cons.events.settings.PEOPLE_DRAWER_TOGGLED, handleDrawerToggling); - }; - }, []); - const { room, roomTimeline, eventId } = roomInfo; if (roomTimeline === null) { setTimeout(() => openNavigation()); @@ -69,7 +65,13 @@ function Room() {
    - {isDrawer && } + + {screenSize === ScreenSize.Desktop && isDrawer && ( + <> + + + + )}
    ); } diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index 39016add..e869e16d 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -97,7 +97,7 @@ import { MessageReply } from '../../molecules/message/Message'; import colorMXID from '../../../util/colorMXID'; import { parseReplyBody, parseReplyFormattedBody } from '../../utils/room'; import { sanitizeText } from '../../utils/sanitize'; -import { getResizeObserverEntry, useResizeObserver } from '../../hooks/useResizeObserver'; +import { useScreenSize } from '../../hooks/useScreenSize'; interface RoomInputProps { roomViewRef: RefObject; @@ -161,15 +161,8 @@ export const RoomInput = forwardRef( const handlePaste = useFilePasteHandler(handleFiles); const dropZoneVisible = useFileDropZone(roomViewRef, handleFiles); - const [mobile, setMobile] = useState(document.body.clientWidth < 500); - useResizeObserver( - document.body, - useCallback((entries) => { - const bodyEntry = getResizeObserverEntry(document.body, entries); - if (bodyEntry && bodyEntry.contentRect.width < 500) setMobile(true); - else setMobile(false); - }, []) - ); + const [, screenWidth] = useScreenSize(); + const hideStickerBtn = screenWidth < 500; useEffect(() => { Transforms.insertFragment(editor, msgDraft); @@ -515,7 +508,7 @@ export const RoomInput = forwardRef( > {(anchorRef) => ( <> - {!mobile && ( + {!hideStickerBtn && ( setEmojiBoardTab(EmojiBoardTab.Sticker)} @@ -532,7 +525,7 @@ export const RoomInput = forwardRef( setEmojiBoardTab(EmojiBoardTab.Emoji)} variant="SurfaceVariant" @@ -542,7 +535,9 @@ export const RoomInput = forwardRef( diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx index fe598bf6..5726fe11 100644 --- a/src/app/organisms/room/RoomViewContent.jsx +++ b/src/app/organisms/room/RoomViewContent.jsx @@ -486,7 +486,6 @@ function RoomViewContent({ roomInputRef, eventId, roomTimeline }) { }, [newEvent]); useResizeObserver( - roomInputRef.current, useCallback((entries) => { if (!roomInputRef.current) return; const editorBaseEntry = getResizeObserverEntry(roomInputRef.current, entries); @@ -497,7 +496,8 @@ function RoomViewContent({ roomInputRef, eventId, roomTimeline }) { if (timelineScroll.bottom < 40 && !roomTimeline.canPaginateForward() && document.visibilityState === 'visible') { timelineScroll.scrollToBottom(); } - }, [roomInputRef]) + }, [roomInputRef]), + useCallback(() => roomInputRef.current, [roomInputRef]), ); const listenKeyboard = useCallback((event) => { diff --git a/src/app/organisms/room/RoomViewHeader.jsx b/src/app/organisms/room/RoomViewHeader.jsx index 46a6ba0e..6571241e 100644 --- a/src/app/organisms/room/RoomViewHeader.jsx +++ b/src/app/organisms/room/RoomViewHeader.jsx @@ -8,8 +8,11 @@ import { blurOnBubbling } from '../../atoms/button/script'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { toggleRoomSettings, openReusableContextMenu, openNavigation } from '../../../client/action/navigation'; -import { togglePeopleDrawer } from '../../../client/action/settings'; +import { + toggleRoomSettings, + openReusableContextMenu, + openNavigation, +} from '../../../client/action/navigation'; import colorMXID from '../../../util/colorMXID'; import { getEventCords } from '../../../util/common'; @@ -28,23 +31,26 @@ import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg import BackArrowIC from '../../../../public/res/ic/outlined/chevron-left.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; +import { useSetSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; function RoomViewHeader({ roomId }) { const [, forceUpdate] = useForceUpdate(); const mx = initMatrix.matrixClient; const isDM = initMatrix.roomList.directs.has(roomId); const room = mx.getRoom(roomId); + const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); let avatarSrc = room.getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); - avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') : avatarSrc; + avatarSrc = isDM + ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') + : avatarSrc; const roomName = room.name; const roomHeaderBtnRef = useRef(null); useEffect(() => { const settingsToggle = (isVisibile) => { const rawIcon = roomHeaderBtnRef.current.lastElementChild; - rawIcon.style.transform = isVisibile - ? 'rotateX(180deg)' - : 'rotateX(0deg)'; + rawIcon.style.transform = isVisibile ? 'rotateX(180deg)' : 'rotateX(0deg)'; }; navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); return () => { @@ -66,11 +72,9 @@ function RoomViewHeader({ roomId }) { }, [roomId]); const openRoomOptions = (e) => { - openReusableContextMenu( - 'bottom', - getEventCords(e, '.ic-btn'), - (closeMenu) => , - ); + openReusableContextMenu('bottom', getEventCords(e, '.ic-btn'), (closeMenu) => ( + + )); }; return ( @@ -90,18 +94,34 @@ function RoomViewHeader({ roomId }) { > - {twemojify(roomName)} + + {twemojify(roomName)} + - {mx.isRoomEncrypted(roomId) === false && toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} />} - - toggleRoomSettings(tabText.MEMBERS)} tooltip="Members" src={UserIC} /> + {mx.isRoomEncrypted(roomId) === false && ( + toggleRoomSettings(tabText.SEARCH)} + tooltip="Search" + src={SearchIC} + /> + )} { + setPeopleDrawer((t) => !t); + }} + tooltip="People" + src={UserIC} /> + toggleRoomSettings(tabText.MEMBERS)} + tooltip="Members" + src={UserIC} + /> + ); } diff --git a/src/app/state/hooks/settings.ts b/src/app/state/hooks/settings.ts index 3f4dab60..43b56553 100644 --- a/src/app/state/hooks/settings.ts +++ b/src/app/state/hooks/settings.ts @@ -10,9 +10,9 @@ export const useSetSetting = ( ) => { const setterAtom = useMemo( () => - atom(null, (get, set, value) => { + atom Settings[K])>(null, (get, set, value) => { const s = { ...get(settingsAtom) }; - s[key] = value; + s[key] = typeof value === 'function' ? value(s[key]) : value; set(settingsAtom, s); }), [settingsAtom, key] @@ -24,11 +24,10 @@ export const useSetSetting = ( export const useSetting = ( settingsAtom: WritableAtom, key: K -): [Settings[K], SetAtom] => { +): [Settings[K], SetAtom Settings[K]), void>] => { const selector = useMemo(() => (s: Settings) => s[key], [key]); const setting = useAtomValue(selectAtom(settingsAtom, selector)); const setter = useSetSetting(settingsAtom, key); - return [setting, setter]; }; From b19e24838364aff27aa90fcdc6a704968363085a Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 23 Jun 2023 09:46:04 +1000 Subject: [PATCH 467/824] Fix member panel filter layout (#1307) * fix member panel filter layout * make member role text lowercase --- src/app/organisms/room/MembersDrawer.css.ts | 2 +- src/app/organisms/room/MembersDrawer.tsx | 98 ++++++++++----------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/app/organisms/room/MembersDrawer.css.ts b/src/app/organisms/room/MembersDrawer.css.ts index 2718e92d..6d347bf1 100644 --- a/src/app/organisms/room/MembersDrawer.css.ts +++ b/src/app/organisms/room/MembersDrawer.css.ts @@ -41,7 +41,7 @@ export const DrawerScrollTop = style({ }); export const DrawerGroup = style({ - padding: `0 ${config.space.S100} 0 ${config.space.S300}`, + paddingLeft: config.space.S200, }); export const MembersGroup = style({ diff --git a/src/app/organisms/room/MembersDrawer.tsx b/src/app/organisms/room/MembersDrawer.tsx index d50c3666..680a4e9d 100644 --- a/src/app/organisms/room/MembersDrawer.tsx +++ b/src/app/organisms/room/MembersDrawer.tsx @@ -75,7 +75,7 @@ const useMembershipFilterMenu = (): MembershipFilter[] => { name: 'Joined', filterFn: MembershipFilters.filterJoined, - color: 'Surface', + color: 'Background', }, { name: 'Invited', @@ -131,11 +131,11 @@ const useSortFilterMenu = (): SortFilter[] => filterFn: SortFilters.filterDescending, }, { - name: 'Newest First', + name: 'New First', filterFn: SortFilters.filterNewestFirst, }, { - name: 'Oldest First', + name: 'Old First', filterFn: SortFilters.filterOldest, }, ], @@ -275,10 +275,9 @@ export function MembersDrawer({ room }: MembersDrawerProps) { - - - Filter - + + + {(open, setOpen) => ( { setFilter((f) => ({ ...f, membershipFilter: menuItem })); @@ -322,9 +322,9 @@ export function MembersDrawer({ room }: MembersDrawerProps) { ref={anchorRef} onClick={() => setOpen(!open)} variant={filter.membershipFilter.color} - radii="400" - outlined - after={} + size="400" + radii="300" + before={} > {filter.membershipFilter.name} @@ -337,7 +337,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { setOpen(!open)} - variant="Surface" - radii="400" - outlined - after={} + variant="Background" + size="400" + radii="300" + after={} > - {`Order: ${filter.sortFilter.name}`} + {filter.sortFilter.name} )} )} - - - Search - } - after={ - result && ( - 0 ? 'Success' : 'Critical'} - size="400" - radii="Pill" - onClick={() => { - if (searchInputRef.current) searchInputRef.current.value = ''; - resetSearch(); - }} - after={} - > - {`${result.items.length || 'No'} ${ - result.items.length === 1 ? 'Result' : 'Results' - }`} - - ) - } - /> + + } + after={ + result && ( + 0 ? 'Success' : 'Critical'} + size="400" + radii="Pill" + aria-pressed + onClick={() => { + if (searchInputRef.current) { + searchInputRef.current.value = ''; + searchInputRef.current.focus(); + } + resetSearch(); + }} + after={} + > + {`${result.items.length || 'No'} ${ + result.items.length === 1 ? 'Result' : 'Results' + }`} + + ) + } + /> + {!onTop && ( @@ -458,7 +458,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { ref={virtualizer.measureElement} key={`${room.roomId}-${vItem.index}`} className={classNames(css.MembersGroupLabel, css.DrawerVirtualItem)} - size="O400" + size="L400" > {tagOrMember.name} From b6283b3469707321430ba2d9820c9aaa07bf8049 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 25 Jun 2023 08:40:48 +0530 Subject: [PATCH 468/824] Update member drawer icons (#1312) * update folds * update member drawer icons --- package-lock.json | 8 ++++---- package.json | 2 +- src/app/organisms/room/MembersDrawer.css.ts | 2 +- src/app/organisms/room/MembersDrawer.tsx | 18 +++++++++++------- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61eebbf9..d5867ae1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.2.1", + "folds": "1.3.0", "formik": "2.2.9", "html-react-parser": "3.0.4", "immer": "9.0.16", @@ -3271,9 +3271,9 @@ } }, "node_modules/folds": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/folds/-/folds-1.2.1.tgz", - "integrity": "sha512-BCV5oFCndiGFp1HyeSnbDKmTSbu1yfAtAIF6znPvLthuI/QG4516bBUr6+MyNUQWx/IAkj1bdQL/cdD+jEZWCw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/folds/-/folds-1.3.0.tgz", + "integrity": "sha512-Jcv6xN9woJWaTaATDGCD9xFqUhjuSw+afvChYoUt4UsAyY351hfpkGNYzglN+gA5fvJw6N9oa6Ogjj2p84kFfA==", "peerDependencies": { "@vanilla-extract/css": "^1.9.2", "@vanilla-extract/recipes": "^0.3.0", diff --git a/package.json b/package.json index beaae095..5eb3fa98 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.2.1", + "folds": "1.3.0", "formik": "2.2.9", "html-react-parser": "3.0.4", "immer": "9.0.16", diff --git a/src/app/organisms/room/MembersDrawer.css.ts b/src/app/organisms/room/MembersDrawer.css.ts index 6d347bf1..a1f4153e 100644 --- a/src/app/organisms/room/MembersDrawer.css.ts +++ b/src/app/organisms/room/MembersDrawer.css.ts @@ -19,7 +19,7 @@ export const MemberDrawerContentBase = style({ }); export const MemberDrawerContent = style({ - padding: `${config.space.S300} 0`, + padding: `${config.space.S200} 0`, }); const ScrollBtnAnime = keyframes({ diff --git a/src/app/organisms/room/MembersDrawer.tsx b/src/app/organisms/room/MembersDrawer.tsx index 680a4e9d..5712c66f 100644 --- a/src/app/organisms/room/MembersDrawer.tsx +++ b/src/app/organisms/room/MembersDrawer.tsx @@ -131,11 +131,11 @@ const useSortFilterMenu = (): SortFilter[] => filterFn: SortFilters.filterDescending, }, { - name: 'New First', + name: 'Newest', filterFn: SortFilters.filterNewestFirst, }, { - name: 'Old First', + name: 'Oldest', filterFn: SortFilters.filterOldest, }, ], @@ -254,6 +254,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { Invite Member @@ -275,8 +276,8 @@ export function MembersDrawer({ room }: MembersDrawerProps) { - - + + {(open, setOpen) => ( @@ -284,6 +285,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { open={open} position="Bottom" align="Start" + offset={4} content={ } + before={} > {filter.membershipFilter.name} @@ -338,6 +340,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { open={open} position="Bottom" align="End" + offset={4} content={ } + after={} > {filter.sortFilter.name} @@ -383,7 +386,6 @@ export function MembersDrawer({ room }: MembersDrawerProps) { )} - } after={ result && ( From f14d70ea3508a8467c0a27b9d61c8ab6661054ab Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 28 Jun 2023 17:27:28 +0530 Subject: [PATCH 469/824] fix msg event permission check (#1315) --- src/app/components/emoji-board/EmojiBoard.css.tsx | 2 +- src/app/hooks/usePowerLevels.ts | 2 +- src/app/organisms/room/RoomView.jsx | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/components/emoji-board/EmojiBoard.css.tsx b/src/app/components/emoji-board/EmojiBoard.css.tsx index adeb2500..ba4ca4e0 100644 --- a/src/app/components/emoji-board/EmojiBoard.css.tsx +++ b/src/app/components/emoji-board/EmojiBoard.css.tsx @@ -7,7 +7,7 @@ export const Base = style({ height: toRem(450), backgroundColor: color.Surface.Container, color: color.Surface.OnContainer, - border: `${config.borderWidth.B300} solid ${color.SurfaceVariant.ContainerLine}`, + border: `${config.borderWidth.B300} solid ${color.Surface.ContainerLine}`, borderRadius: config.radii.R400, boxShadow: config.shadow.E200, overflow: 'hidden', diff --git a/src/app/hooks/usePowerLevels.ts b/src/app/hooks/usePowerLevels.ts index 8f999d48..3ce75a2f 100644 --- a/src/app/hooks/usePowerLevels.ts +++ b/src/app/hooks/usePowerLevels.ts @@ -47,7 +47,7 @@ export function usePowerLevels(room: Room) { const canSendEvent = useCallback( (eventType: string | undefined, powerLevel: number) => { const { events, events_default: eventsDefault } = powerLevels; - if (events && eventType && typeof events[eventType] === 'string') { + if (events && eventType && typeof events[eventType] === 'number') { return powerLevel >= events[eventType]; } return powerLevel >= (eventsDefault ?? DefaultPowerLevels.eventsDefault); diff --git a/src/app/organisms/room/RoomView.jsx b/src/app/organisms/room/RoomView.jsx index 591fccea..9b3ae76f 100644 --- a/src/app/organisms/room/RoomView.jsx +++ b/src/app/organisms/room/RoomView.jsx @@ -2,6 +2,7 @@ import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './RoomView.scss'; import { Text, config } from 'folds'; +import { EventType } from 'matrix-js-sdk'; import EventEmitter from 'events'; @@ -32,7 +33,9 @@ function RoomView({ room, roomTimeline, eventId }) { const tombstoneEvent = useStateEvent(room, StateEvent.RoomTombstone); const { getPowerLevel, canSendEvent } = usePowerLevels(room); const myUserId = mx.getUserId(); - const canMessage = myUserId ? canSendEvent(undefined, getPowerLevel(myUserId)) : false; + const canMessage = myUserId + ? canSendEvent(EventType.RoomMessage, getPowerLevel(myUserId)) + : false; useEffect(() => { const settingsToggle = (isVisible) => { From 1a37fd0ca463d00d70273ca2b2f32bc7b4d936de Mon Sep 17 00:00:00 2001 From: greentore <117551249+greentore@users.noreply.github.com> Date: Sun, 23 Jul 2023 10:11:36 +0200 Subject: [PATCH 470/824] Use sticker body for searching (#1347) --- src/app/components/emoji-board/EmojiBoard.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 4005234a..76c6f05d 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -598,7 +598,13 @@ export const NativeEmojiGroups = memo( ) ); -const getSearchListItemStr = (item: ExtendedPackImage | IEmoji) => `:${item.shortcode}:`; +const getSearchListItemStr = (item: ExtendedPackImage | IEmoji) => { + const shortcode = `:${item.shortcode}:`; + if ('body' in item) { + return [shortcode, item.body ?? '']; + } + return shortcode; +}; const SEARCH_OPTIONS: UseAsyncSearchOptions = { limit: 26, matchOptions: { From 053b80126239cc51679d7ece5b912af5fb68ddb8 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 23 Jul 2023 18:12:09 +1000 Subject: [PATCH 471/824] Fix editor custom html output (#1348) * replace paragraph with line breaks * stop sending plain msg as custom html * removes console log * fix false negative for sanitized customHtml * fix customHtmlEqualsPlainText doc --- src/app/components/editor/output.ts | 18 ++++++++++++++++-- src/app/organisms/room/RoomInput.tsx | 10 +++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 38c54499..5d0443fa 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -17,7 +17,7 @@ const textToCustomHtml = (node: FormattedText): string => { const elementToCustomHtml = (node: CustomElement, children: string): string => { switch (node.type) { case BlockType.Paragraph: - return `

    ${children}

    `; + return `${children}
    `; case BlockType.Heading: return `${children}`; case BlockType.CodeLine: @@ -25,7 +25,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { case BlockType.CodeBlock: return `
    ${children}
    `; case BlockType.QuoteLine: - return `

    ${children}

    `; + return `${children}
    `; case BlockType.BlockQuote: return `
    ${children}
    `; case BlockType.ListItem: @@ -93,3 +93,17 @@ export const toPlainText = (node: Descendant | Descendant[]): string => { const children = node.children.map((n) => toPlainText(n)).join(''); return elementToPlainText(node, children); }; + +/** + * Check if customHtml is equals to plainText + * by replacing `
    ` with `/n` in customHtml + * and sanitizing plainText before comparison + * because text are sanitized in customHtml + * @param customHtml string + * @param plain string + * @returns boolean + */ +export const customHtmlEqualsPlainText = (customHtml: string, plain: string): boolean => + customHtml.replace(//g, '\n') === sanitizeText(plain); + +export const trimCustomHtml = (customHtml: string) => customHtml.replace(/$/g, ''); diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index e869e16d..a50c8004 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -51,6 +51,8 @@ import { createEmoticonElement, moveCursor, resetEditorHistory, + customHtmlEqualsPlainText, + trimCustomHtml, } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; @@ -251,7 +253,7 @@ export const RoomInput = forwardRef( uploadBoardHandlers.current?.handleSend(); const plainText = toPlainText(editor.children).trim(); - const customHtml = toMatrixCustomHTML(editor.children); + const customHtml = trimCustomHtml(toMatrixCustomHTML(editor.children)); if (plainText === '') return; @@ -271,9 +273,11 @@ export const RoomInput = forwardRef( const content: IContent = { msgtype: MsgType.Text, body, - format: 'org.matrix.custom.html', - formatted_body: formattedBody, }; + if (replyDraft || !customHtmlEqualsPlainText(formattedBody, body)) { + content.format = 'org.matrix.custom.html'; + content.formatted_body = formattedBody; + } if (replyDraft) { content['m.relates_to'] = { 'm.in_reply_to': { From 3c60976efa3ae0d4ab3e93a114cb00401b60e92b Mon Sep 17 00:00:00 2001 From: greentore <117551249+greentore@users.noreply.github.com> Date: Mon, 24 Jul 2023 06:40:43 +0200 Subject: [PATCH 472/824] Passive private receipt support (#1108) Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- src/client/state/Notifications.js | 22 ++++++++++++---------- src/client/state/cons.js | 4 ++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index db4610a3..13dd3e17 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -383,17 +383,19 @@ class Notifications extends EventEmitter { }); this.matrixClient.on('Room.receipt', (mEvent, room) => { - if (mEvent.getType() === 'm.receipt') { - if (room.isSpaceRoom()) return; - const content = mEvent.getContent(); - const readedEventId = Object.keys(content)[0]; - const readerUserId = Object.keys(content[readedEventId]['m.read'])[0]; - if (readerUserId !== this.matrixClient.getUserId()) return; + if (mEvent.getType() !== 'm.receipt' || room.isSpaceRoom()) return; + const content = mEvent.getContent(); + const userId = this.matrixClient.getUserId(); - this.deleteNoti(room.roomId); - - this._deletePopupRoomNotis(room.roomId); - } + Object.keys(content).forEach((eventId) => { + Object.entries(content[eventId]).forEach(([receiptType, receipt]) => { + if (!cons.supportReceiptTypes.includes(receiptType)) return; + if (Object.keys(receipt || {}).includes(userId)) { + this.deleteNoti(room.roomId); + this._deletePopupRoomNotis(room.roomId); + } + }); + }); }); this.matrixClient.on('Room.myMembership', (room, membership) => { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 8d9fda54..873c4e33 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -19,6 +19,10 @@ const cons = { 'm.room.member', 'm.sticker', ], + supportReceiptTypes: [ + 'm.read', + 'm.read.private', + ], notifs: { DEFAULT: 'default', ALL_MESSAGES: 'all_messages', From 1adee07127f184dd024d235467732471f4a4f296 Mon Sep 17 00:00:00 2001 From: ts <124226059+uniformization@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:55:10 -0700 Subject: [PATCH 473/824] Fix Profile Viewer text (#1357) If you only had a single session open, the Profile Viewer would've said "View 1 sessions" instead of "View 1 session." --- src/app/organisms/profile-viewer/ProfileViewer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index fec9189a..b6ce426e 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -137,7 +137,7 @@ function SessionInfo({ userId }) { onClick={() => setIsVisible(!isVisible)} iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC} > - {`View ${devices?.length > 0 ? `${devices.length} ` : ''}sessions`} + {`View ${devices?.length > 0 ? `${devices.length} ${devices.length == 1 ? 'session' : 'sessions'}` : 'sessions'}`} {renderSessionChips()}
    From 34b2901566bb49bdeab4cd6d3fb9dc7ee845279f Mon Sep 17 00:00:00 2001 From: greentore <117551249+greentore@users.noreply.github.com> Date: Thu, 3 Aug 2023 06:23:28 +0200 Subject: [PATCH 474/824] Prevent `manifest.json` from being inlined (#1359) * Disable asset inlining * Prevent `manifest.json` from being inlined * Update backtick to single quote in vite.config.js --------- Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- index.html | 2 +- vite.config.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 36c5740a..6bc955c1 100644 --- a/index.html +++ b/index.html @@ -27,7 +27,7 @@ - + diff --git a/vite.config.js b/vite.config.js index 6a443166..f09aa71e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -21,10 +21,14 @@ const copyFiles = { src: 'config.json', dest: '', }, + { + src: 'public/manifest.json', + dest: '', + }, { src: 'public/res/android', dest: 'public/', - } + }, ], } From 47f6c44c17dcf2c03e3ce0cbd8fd352069560556 Mon Sep 17 00:00:00 2001 From: Emi Date: Fri, 1 Sep 2023 00:49:34 -0400 Subject: [PATCH 475/824] Fix permission detection for updating emojis (#1125) --- src/app/molecules/room-emojis/RoomEmojis.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/molecules/room-emojis/RoomEmojis.jsx b/src/app/molecules/room-emojis/RoomEmojis.jsx index 81cee0a8..94ae6107 100644 --- a/src/app/molecules/room-emojis/RoomEmojis.jsx +++ b/src/app/molecules/room-emojis/RoomEmojis.jsx @@ -80,8 +80,7 @@ function RoomEmojis({ roomId }) { const { usablePacks, createPack, deletePack } = useRoomPacks(room); - const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; - const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); + const canChange = room.currentState.maySendStateEvent('im.ponies.room_emote', mx.getUserId()); const handlePackCreate = (e) => { e.preventDefault(); From fcd7723f73f1e89f4ea9fabd6e0c03c4c8a4ffd4 Mon Sep 17 00:00:00 2001 From: Alliegaytor <61523203+Alliegaytor@users.noreply.github.com> Date: Sun, 24 Sep 2023 14:31:02 +1000 Subject: [PATCH 476/824] Fix notifications not displaying when document is not focused (#1425) Allows notifications from the active room while app is not focused (e.g. tabbed out) --- src/client/state/Notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 13dd3e17..09fa240e 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -234,7 +234,7 @@ class Notifications extends EventEmitter { const actions = this.matrixClient.getPushActionsForEvent(mEvent); if (!actions?.notify) return; - if (navigation.selectedRoomId === room.roomId && document.visibilityState === 'visible') return; + if (navigation.selectedRoomId === room.roomId && document.hasFocus()) return; if (mEvent.isEncrypted()) { await mEvent.attemptDecryption(this.matrixClient.crypto); From 3a95d0da01c5c69d16fda6421188e1576ddae90b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:44:06 +1100 Subject: [PATCH 477/824] Refactor timeline (#1346) * fix intersection & resize observer * add binary search util * add scroll info util * add virtual paginator hook - WIP * render timeline using paginator hook * add continuous pagination to fill timeline * add doc comments in virtual paginator hook * add scroll to element func in virtual paginator * extract timeline pagination login into hook * add sliding name for timeline messages - testing * scroll with live event * change message rending style * make message timestamp smaller * remove unused imports * add random number between util * add compact message component * add sanitize html types * fix sending alias in room mention * get room member display name util * add get room with canonical alias util * add sanitize html util * render custom html with new styles * fix linkifying link text * add reaction component * display message reactions in timeline * Change mention color * show edited message * add event sent by function factory * add functions to get emoji shortcode * add component for reaction msg * add tooltip for who has reacted * add message layouts & placeholder * fix reaction size * fix dark theme colors * add code highlight with prismjs * add options to configure spacing in msgs * render message reply * fix trim reply from body regex * fix crash when loading reply * fix reply hover style * decrypt event on timeline paginate * update custom html code style * remove console logs * fix virtual paginator scroll to func * fix virtual paginator scroll to types * add stop scroll for in view item options * fix virtual paginator out of range scroll to index * scroll to and highlight reply on click * fix reply hover style * make message avatar clickable * fix scrollTo issue in virtual paginator * load reply from fetch * import virtual paginator restore scroll * load timeline for specific event * Fix back pagination recalibration * fix reply min height * revert code block colors to secondary * stop sanitizing text in code block * add decrypt file util * add image media component * update folds * fix code block font style * add msg event type * add scale dimension util * strict msg layout type * add image renderer component * add message content fallback components * add message matrix event renderer components * render matrix event using hooks * add attachment component * add attachment content types * handle error when rendering image in timeline * add video component * render video * include blurhash in thumbnails * generate thumbnails for image message * fix reactToDom spoiler opts * add hooks for HTMLMediaElement * render audio file in timeline * add msg image content component * fix image content props * add video content component * render new image/video component in timeline * remove console.log * convert seconds to milliseconds in video info * add load thumbnail prop to video content component * add file saver types * add file header component * add file content component * render file in timeline * add media control component * render audio message in room timeline * remove moved components * safely load message reply * add media loading hook * update media control layout * add loading indication in audio component * fill audio play icon when playing audio * fix media expanding * add image viewer - WIP * add pan and zoom control to image viewer * add text based file viewer * add pdf viewer * add error handling in pdf viewer * add download btn to pdf viewer * fix file button spinner fill * fix file opens on re-render * add range slider in audio content player * render location in timeline * update folds * display membership event in timeline * make reactions toggle * render sticker messages in timeline * render room name, topic, avatar change and event * fix typos * update render state event type style * add room intro in start of timeline * add power levels context * fix wrong param passing in RoomView * fix sending typing notification in wrong room Slate onChange callback was not updating with react re-renders. * send typing status on key up * add typing indicator component * add typing member atom * display typing status in member drawer * add room view typing member component * display typing members in room view * remove old roomTimeline uses * add event readers hook * add latest event hook * display following members in room view * fetch event instead of event context for reply * fix typo in virtual paginator hook * add scroll to latest btn in timeline * change scroll to latest chip variant * destructure paginator object to improve perf * restore forward dir scroll in virtual paginator * run scroll to bottom in layout effect * display unread message indicator in timeline * make component for room timeline float * add timeline divider component * add day divider and format message time * apply message spacing to dividers * format date in room intro * send read receipt on message arrive * add event readers component * add reply, read receipt, source delete opt * bug fixes * update timeline on delete & show reason * fix empty reaction container style * show msg selection effect on msg option open * add report message options * add options to send quick reactions * add emoji board in message options * add reaction viewer * fix styles * show view reaction in msg options menu * fix spacing between two msg by same person * add option menu in other rendered event * handle m.room.encrypted messages * fix italic reply text overflow cut * handle encrypted sticker messages * remove console log * prevent message context menu with alt key pressed * make mentions clickable in messages * add options to show and hidden events in timeline * add option to disable media autoload * remove old emojiboard opener * add options to use system emoji * refresh timeline on reset * fix stuck typing member in member drawer --- .eslintrc.js | 3 + package-lock.json | 648 ++++++- package.json | 13 +- .../components/Pdf-viewer/PdfViewer.css.ts | 37 + src/app/components/Pdf-viewer/PdfViewer.tsx | 257 +++ src/app/components/Pdf-viewer/index.ts | 1 + src/app/components/editor/Editor.tsx | 5 +- src/app/components/editor/Elements.tsx | 12 +- .../autocomplete/RoomMentionAutocomplete.tsx | 7 +- src/app/components/emoji-board/EmojiBoard.tsx | 4 +- .../event-readers/EventReaders.css.ts | 21 + .../components/event-readers/EventReaders.tsx | 110 ++ src/app/components/event-readers/index.ts | 1 + .../image-viewer/ImageViewer.css.ts | 40 + .../components/image-viewer/ImageViewer.tsx | 95 + src/app/components/image-viewer/index.ts | 1 + src/app/components/media/Image.tsx | 9 + src/app/components/media/MediaControls.tsx | 27 + src/app/components/media/Video.tsx | 10 + src/app/components/media/index.ts | 3 + src/app/components/media/media.css.ts | 20 + .../message/MessageContentFallback.tsx | 66 + src/app/components/message/Reaction.css.ts | 75 + src/app/components/message/Reaction.tsx | 113 ++ src/app/components/message/Reply.css.ts | 25 + src/app/components/message/Reply.tsx | 100 + src/app/components/message/Time.tsx | 27 + .../message/attachment/Attachment.css.ts | 42 + .../message/attachment/Attachment.tsx | 44 + .../components/message/attachment/index.ts | 1 + src/app/components/message/index.ts | 7 + src/app/components/message/layout/Base.tsx | 25 + src/app/components/message/layout/Bubble.tsx | 18 + src/app/components/message/layout/Compact.tsx | 18 + src/app/components/message/layout/Modern.tsx | 18 + src/app/components/message/layout/index.ts | 4 + .../components/message/layout/layout.css.ts | 155 ++ .../placeholder/CompactPlaceholder.tsx | 22 + .../placeholder/DefaultPlaceholder.tsx | 25 + .../placeholder/LinePlaceholder.css.ts | 12 + .../message/placeholder/LinePlaceholder.tsx | 8 + .../components/message/placeholder/index.ts | 3 + src/app/components/room-intro/RoomIntro.tsx | 114 ++ src/app/components/room-intro/index.ts | 1 + .../components/text-viewer/TextViewer.css.ts | 37 + src/app/components/text-viewer/TextViewer.tsx | 69 + src/app/components/text-viewer/index.ts | 1 + .../typing-indicator/TypingIndicator.css.ts | 49 + .../typing-indicator/TypingIndicator.tsx | 21 + src/app/components/typing-indicator/index.ts | 1 + src/app/hooks/media/index.ts | 6 + src/app/hooks/media/useMediaLoading.ts | 51 + src/app/hooks/media/useMediaPlay.ts | 46 + .../hooks/media/useMediaPlayTimeCallback.ts | 24 + src/app/hooks/media/useMediaPlaybackRate.ts | 40 + src/app/hooks/media/useMediaSeek.ts | 51 + src/app/hooks/media/useMediaVolume.ts | 60 + src/app/hooks/useIntersectionObserver.ts | 2 + src/app/hooks/useMatrixEventRenderer.ts | 80 + src/app/hooks/useMemberEventParser.tsx | 218 +++ src/app/hooks/usePan.ts | 62 + src/app/hooks/usePowerLevels.ts | 43 +- src/app/hooks/useRelations.ts | 25 + src/app/hooks/useResizeObserver.ts | 2 + src/app/hooks/useRoomEventReaders.ts | 35 + src/app/hooks/useRoomLatestEvent.ts | 29 + src/app/hooks/useRoomMsgContentRenderer.ts | 68 + src/app/hooks/useVirtualPaginator.ts | 405 ++++ src/app/hooks/useZoom.ts | 26 + src/app/organisms/room/MembersDrawer.tsx | 33 +- src/app/organisms/room/Room.jsx | 79 - src/app/organisms/room/Room.tsx | 46 + src/app/organisms/room/RoomInput.tsx | 31 +- src/app/organisms/room/RoomTimeline.css.ts | 30 + src/app/organisms/room/RoomTimeline.tsx | 1689 +++++++++++++++++ src/app/organisms/room/RoomView.jsx | 39 +- .../organisms/room/RoomViewFollowing.css.ts | 31 + src/app/organisms/room/RoomViewFollowing.tsx | 141 ++ src/app/organisms/room/RoomViewTyping.css.ts | 24 + src/app/organisms/room/RoomViewTyping.tsx | 102 + .../organisms/room/message/AudioContent.tsx | 192 ++ .../room/message/EncryptedContent.tsx | 22 + .../organisms/room/message/EventContent.tsx | 37 + .../organisms/room/message/FileContent.tsx | 250 +++ src/app/organisms/room/message/FileHeader.tsx | 22 + .../organisms/room/message/ImageContent.tsx | 170 ++ src/app/organisms/room/message/Message.tsx | 993 ++++++++++ src/app/organisms/room/message/Reactions.tsx | 133 ++ .../organisms/room/message/StickerContent.tsx | 41 + .../organisms/room/message/VideoContent.tsx | 176 ++ .../organisms/room/message/fileRenderer.tsx | 45 + src/app/organisms/room/message/index.ts | 10 + src/app/organisms/room/message/styles.css.ts | 72 + src/app/organisms/room/message/util.ts | 23 + src/app/organisms/room/msgContent.ts | 30 +- .../reaction-viewer/ReactionViewer.css.ts | 31 + .../room/reaction-viewer/ReactionViewer.tsx | 155 ++ .../organisms/room/reaction-viewer/index.ts | 1 + src/app/organisms/settings/Settings.jsx | 84 +- src/app/plugins/emoji.ts | 14 +- src/app/plugins/pdfjs-dist.ts | 47 + src/app/plugins/react-custom-html-parser.tsx | 274 +++ src/app/plugins/react-prism/ReactPrism.css | 97 + src/app/plugins/react-prism/ReactPrism.tsx | 35 + src/app/state/settings.ts | 17 +- src/app/state/typingMembers.ts | 70 + .../CustomHtml.css.ts} | 86 +- src/app/templates/client/Client.jsx | 21 +- src/app/templates/client/ClientContent.jsx | 49 + src/app/utils/blurHash.ts | 8 +- src/app/utils/common.ts | 47 + src/app/utils/dom.ts | 59 +- src/app/utils/matrix.ts | 50 +- src/app/utils/mimeTypes.ts | 65 +- src/app/utils/room.ts | 34 + src/app/utils/sanitize.ts | 142 ++ src/app/utils/time.ts | 35 + src/client/state/settings.js | 3 + src/ext.d.ts | 5 + src/index.scss | 16 +- src/types/matrix/common.ts | 60 +- src/types/matrix/room.ts | 27 + tsconfig.json | 1 + vite.config.js | 4 + 124 files changed, 9438 insertions(+), 258 deletions(-) create mode 100644 src/app/components/Pdf-viewer/PdfViewer.css.ts create mode 100644 src/app/components/Pdf-viewer/PdfViewer.tsx create mode 100644 src/app/components/Pdf-viewer/index.ts create mode 100644 src/app/components/event-readers/EventReaders.css.ts create mode 100644 src/app/components/event-readers/EventReaders.tsx create mode 100644 src/app/components/event-readers/index.ts create mode 100644 src/app/components/image-viewer/ImageViewer.css.ts create mode 100644 src/app/components/image-viewer/ImageViewer.tsx create mode 100644 src/app/components/image-viewer/index.ts create mode 100644 src/app/components/media/Image.tsx create mode 100644 src/app/components/media/MediaControls.tsx create mode 100644 src/app/components/media/Video.tsx create mode 100644 src/app/components/media/index.ts create mode 100644 src/app/components/media/media.css.ts create mode 100644 src/app/components/message/MessageContentFallback.tsx create mode 100644 src/app/components/message/Reaction.css.ts create mode 100644 src/app/components/message/Reaction.tsx create mode 100644 src/app/components/message/Reply.css.ts create mode 100644 src/app/components/message/Reply.tsx create mode 100644 src/app/components/message/Time.tsx create mode 100644 src/app/components/message/attachment/Attachment.css.ts create mode 100644 src/app/components/message/attachment/Attachment.tsx create mode 100644 src/app/components/message/attachment/index.ts create mode 100644 src/app/components/message/index.ts create mode 100644 src/app/components/message/layout/Base.tsx create mode 100644 src/app/components/message/layout/Bubble.tsx create mode 100644 src/app/components/message/layout/Compact.tsx create mode 100644 src/app/components/message/layout/Modern.tsx create mode 100644 src/app/components/message/layout/index.ts create mode 100644 src/app/components/message/layout/layout.css.ts create mode 100644 src/app/components/message/placeholder/CompactPlaceholder.tsx create mode 100644 src/app/components/message/placeholder/DefaultPlaceholder.tsx create mode 100644 src/app/components/message/placeholder/LinePlaceholder.css.ts create mode 100644 src/app/components/message/placeholder/LinePlaceholder.tsx create mode 100644 src/app/components/message/placeholder/index.ts create mode 100644 src/app/components/room-intro/RoomIntro.tsx create mode 100644 src/app/components/room-intro/index.ts create mode 100644 src/app/components/text-viewer/TextViewer.css.ts create mode 100644 src/app/components/text-viewer/TextViewer.tsx create mode 100644 src/app/components/text-viewer/index.ts create mode 100644 src/app/components/typing-indicator/TypingIndicator.css.ts create mode 100644 src/app/components/typing-indicator/TypingIndicator.tsx create mode 100644 src/app/components/typing-indicator/index.ts create mode 100644 src/app/hooks/media/index.ts create mode 100644 src/app/hooks/media/useMediaLoading.ts create mode 100644 src/app/hooks/media/useMediaPlay.ts create mode 100644 src/app/hooks/media/useMediaPlayTimeCallback.ts create mode 100644 src/app/hooks/media/useMediaPlaybackRate.ts create mode 100644 src/app/hooks/media/useMediaSeek.ts create mode 100644 src/app/hooks/media/useMediaVolume.ts create mode 100644 src/app/hooks/useMatrixEventRenderer.ts create mode 100644 src/app/hooks/useMemberEventParser.tsx create mode 100644 src/app/hooks/usePan.ts create mode 100644 src/app/hooks/useRelations.ts create mode 100644 src/app/hooks/useRoomEventReaders.ts create mode 100644 src/app/hooks/useRoomLatestEvent.ts create mode 100644 src/app/hooks/useRoomMsgContentRenderer.ts create mode 100644 src/app/hooks/useVirtualPaginator.ts create mode 100644 src/app/hooks/useZoom.ts delete mode 100644 src/app/organisms/room/Room.jsx create mode 100644 src/app/organisms/room/Room.tsx create mode 100644 src/app/organisms/room/RoomTimeline.css.ts create mode 100644 src/app/organisms/room/RoomTimeline.tsx create mode 100644 src/app/organisms/room/RoomViewFollowing.css.ts create mode 100644 src/app/organisms/room/RoomViewFollowing.tsx create mode 100644 src/app/organisms/room/RoomViewTyping.css.ts create mode 100644 src/app/organisms/room/RoomViewTyping.tsx create mode 100644 src/app/organisms/room/message/AudioContent.tsx create mode 100644 src/app/organisms/room/message/EncryptedContent.tsx create mode 100644 src/app/organisms/room/message/EventContent.tsx create mode 100644 src/app/organisms/room/message/FileContent.tsx create mode 100644 src/app/organisms/room/message/FileHeader.tsx create mode 100644 src/app/organisms/room/message/ImageContent.tsx create mode 100644 src/app/organisms/room/message/Message.tsx create mode 100644 src/app/organisms/room/message/Reactions.tsx create mode 100644 src/app/organisms/room/message/StickerContent.tsx create mode 100644 src/app/organisms/room/message/VideoContent.tsx create mode 100644 src/app/organisms/room/message/fileRenderer.tsx create mode 100644 src/app/organisms/room/message/index.ts create mode 100644 src/app/organisms/room/message/styles.css.ts create mode 100644 src/app/organisms/room/message/util.ts create mode 100644 src/app/organisms/room/reaction-viewer/ReactionViewer.css.ts create mode 100644 src/app/organisms/room/reaction-viewer/ReactionViewer.tsx create mode 100644 src/app/organisms/room/reaction-viewer/index.ts create mode 100644 src/app/plugins/pdfjs-dist.ts create mode 100644 src/app/plugins/react-custom-html-parser.tsx create mode 100644 src/app/plugins/react-prism/ReactPrism.css create mode 100644 src/app/plugins/react-prism/ReactPrism.tsx create mode 100644 src/app/state/typingMembers.ts rename src/app/{components/editor/Elements.css.ts => styles/CustomHtml.css.ts} (59%) create mode 100644 src/app/templates/client/ClientContent.jsx create mode 100644 src/app/utils/time.ts diff --git a/.eslintrc.js b/.eslintrc.js index 70437418..36101fbe 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,6 +20,9 @@ module.exports = { ecmaVersion: 'latest', sourceType: 'module', }, + "globals": { + JSX: "readonly" + }, plugins: [ 'react', '@typescript-eslint' diff --git a/package-lock.json b/package-lock.json index d5867ae1..6f00efe8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,22 +23,26 @@ "browser-encrypt-attachment": "0.3.0", "classnames": "2.3.2", "dateformat": "5.0.3", + "dayjs": "1.11.10", "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.3.0", + "folds": "1.5.0", "formik": "2.2.9", - "html-react-parser": "3.0.4", + "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "1.12.0", "katex": "0.16.4", "linkify-html": "4.0.2", + "linkify-react": "4.1.1", "linkifyjs": "4.0.2", "matrix-js-sdk": "24.1.0", "millify": "6.1.0", + "pdfjs-dist": "3.10.111", + "prismjs": "1.29.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -46,8 +50,10 @@ "react-dnd": "15.1.2", "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", + "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", + "react-range": "1.8.14", "sanitize-html": "2.8.0", "slate": "0.90.0", "slate-history": "0.93.0", @@ -60,9 +66,12 @@ "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rollup/plugin-inject": "5.0.3", "@rollup/plugin-wasm": "6.1.1", + "@types/file-saver": "2.0.5", "@types/node": "18.11.18", + "@types/prismjs": "1.26.0", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", + "@types/sanitize-html": "2.9.0", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", @@ -963,6 +972,41 @@ "react-dom": "16.14.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@matrix-org/matrix-sdk-crypto-js": { "version": "0.1.0-alpha.5", "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.5.tgz", @@ -1155,6 +1199,12 @@ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, + "node_modules/@types/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "dev": true + }, "node_modules/@types/is-hotkey": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.7.tgz", @@ -1183,6 +1233,12 @@ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -1212,6 +1268,15 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, + "node_modules/@types/sanitize-html": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.9.0.tgz", + "integrity": "sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg==", + "dev": true, + "dependencies": { + "htmlparser2": "^8.0.0" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -1644,6 +1709,12 @@ "vite": "^4.0.0" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -1665,6 +1736,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ahocorasick": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ahocorasick/-/ahocorasick-1.0.2.tgz", @@ -1723,6 +1806,25 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1862,7 +1964,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "node_modules/base-x": { "version": "4.0.0", @@ -1907,7 +2009,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2026,6 +2128,21 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2078,6 +2195,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -2109,6 +2235,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -2123,7 +2258,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "devOptional": true }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -2131,6 +2266,12 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -2218,6 +2359,11 @@ "node": ">=12.20" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2234,6 +2380,18 @@ } } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2269,6 +2427,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2354,13 +2527,13 @@ } }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -2399,9 +2572,9 @@ } }, "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -3215,21 +3388,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/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/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -3271,9 +3429,9 @@ } }, "node_modules/folds": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/folds/-/folds-1.3.0.tgz", - "integrity": "sha512-Jcv6xN9woJWaTaATDGCD9xFqUhjuSw+afvChYoUt4UsAyY351hfpkGNYzglN+gA5fvJw6N9oa6Ogjj2p84kFfA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/folds/-/folds-1.5.0.tgz", + "integrity": "sha512-1QNHzD57OxFZT5SOe0nWcrKQvWmfMRv1f5sTF8xhGtwx9rajjv36T9SwCcj9Fh58PbERqOdBiwvpdhu+BQTVjg==", "peerDependencies": { "@vanilla-extract/css": "^1.9.2", "@vanilla-extract/recipes": "^0.3.0", @@ -3326,11 +3484,35 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.2", @@ -3379,6 +3561,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3429,7 +3631,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3576,6 +3778,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -3585,23 +3793,41 @@ } }, "node_modules/html-dom-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.1.2.tgz", - "integrity": "sha512-mLTtl3pVn3HnqZSZzW3xVs/mJAKrG1yIw3wlp+9bdoZHHLaBRvELdpfShiPVLyjPypq1Fugv2KMDoGHW4lVXnw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-4.0.0.tgz", + "integrity": "sha512-TUa3wIwi80f5NF8CVWzkopBVqVAtlawUzJoLwVLHns0XSJGynss4jiY0mTWpiDOsuyw+afP+ujjMgRh9CoZcXw==", "dependencies": { "domhandler": "5.0.3", - "htmlparser2": "8.0.1" + "htmlparser2": "9.0.0" + } + }, + "node_modules/html-dom-parser/node_modules/htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/html-react-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.4.tgz", - "integrity": "sha512-va68PSmC7uA6PbOEc9yuw5Mu3OHPXmFKUpkLGvUPdTuNrZ0CJZk1s/8X/FaHjswK/6uZghu2U02tJjussT8+uw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.2.0.tgz", + "integrity": "sha512-gzU55AS+FI6qD7XaKe5BLuLFM2Xw0/LodfMWZlxV9uOHe7LCD5Lukx/EgYuBI3c0kLu0XlgFXnSzO0qUUn3Vrg==", "dependencies": { "domhandler": "5.0.3", - "html-dom-parser": "3.1.2", + "html-dom-parser": "4.0.0", "react-property": "2.0.0", - "style-to-js": "1.1.1" + "style-to-js": "1.1.3" }, "peerDependencies": { "react": "0.14 || 15 || 16 || 17 || 18" @@ -3625,6 +3851,19 @@ "entities": "^4.3.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3698,7 +3937,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3708,7 +3947,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "devOptional": true }, "node_modules/inline-style-parser": { "version": "0.1.1", @@ -4192,6 +4431,15 @@ "linkifyjs": "^4.0.0" } }, + "node_modules/linkify-react": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.1.tgz", + "integrity": "sha512-2K9Y1cUdvq40dFWqCJ//X+WP19nlzIVITFGI93RjLnA0M7KbnxQ/ffC3AZIZaEIrLangF9Hjt3i0GQ9/anEG5A==", + "peerDependencies": { + "linkifyjs": "^4.0.0", + "react": ">= 15.0.0" + } + }, "node_modules/linkifyjs": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", @@ -4254,7 +4502,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4274,6 +4522,21 @@ "node": ">=12" } }, + "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==", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/matrix-events-sdk": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", @@ -4351,6 +4614,18 @@ "millify": "bin/millify" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", @@ -4364,7 +4639,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4381,11 +4656,63 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "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==" }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -4439,6 +4766,21 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4448,6 +4790,18 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4557,7 +4911,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -4653,7 +5007,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -4682,6 +5036,27 @@ "node": ">=8" } }, + "node_modules/path2d-polyfill": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", + "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfjs-dist": { + "version": "3.10.111", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.10.111.tgz", + "integrity": "sha512-+SXXGN/3YTNQSK5Ae7EyqQuR+4IAsNunJq/Us5ByOkRJ45qBXXOwkiWi3RIDU+CyF+ak5eSWXl2FQW2PKBrsRA==", + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "canvas": "^2.11.2", + "path2d-polyfill": "^2.0.1" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4778,6 +5153,14 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -4922,6 +5305,17 @@ "react": "17.0.2" } }, + "node_modules/react-error-boundary": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.10.tgz", + "integrity": "sha512-pvVKdi77j2OoPHo+p3rorgE43OjDWiqFkaqkJz8sJKK6uf/u8xtzuaVfj5qJ2JnDLIgF1De3zY5AJDijp+LVPA==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", @@ -4972,6 +5366,15 @@ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, + "node_modules/react-range": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/react-range/-/react-range-1.8.14.tgz", + "integrity": "sha512-v2nyD5106rHf9dwHzq+WRlhCes83h1wJRHIMFjbZsYYsO6LF4mG/mR3cH7Cf+dkeHq65DItuqIbLn/3jjYjsHg==", + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -4981,6 +5384,20 @@ "node": ">=0.10.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5090,6 +5507,21 @@ "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==", + "devOptional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "3.25.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", @@ -5129,6 +5561,26 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -5225,6 +5677,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5265,6 +5723,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5329,6 +5824,15 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5427,17 +5931,17 @@ } }, "node_modules/style-to-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz", - "integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz", + "integrity": "sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==", "dependencies": { - "style-to-object": "0.3.0" + "style-to-object": "0.4.1" } }, "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", "dependencies": { "inline-style-parser": "0.1.1" } @@ -5470,6 +5974,23 @@ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.0.1.tgz", "integrity": "sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==" }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5696,6 +6217,12 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "optional": true + }, "node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -6247,6 +6774,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6306,7 +6842,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "devOptional": true }, "node_modules/y18n": { "version": "5.0.8", @@ -6320,7 +6856,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "devOptional": true }, "node_modules/yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 5eb3fa98..83850a80 100644 --- a/package.json +++ b/package.json @@ -33,22 +33,26 @@ "browser-encrypt-attachment": "0.3.0", "classnames": "2.3.2", "dateformat": "5.0.3", + "dayjs": "1.11.10", "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.3.0", + "folds": "1.5.0", "formik": "2.2.9", - "html-react-parser": "3.0.4", + "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "1.12.0", "katex": "0.16.4", "linkify-html": "4.0.2", + "linkify-react": "4.1.1", "linkifyjs": "4.0.2", "matrix-js-sdk": "24.1.0", "millify": "6.1.0", + "pdfjs-dist": "3.10.111", + "prismjs": "1.29.0", "prop-types": "15.8.1", "react": "17.0.2", "react-autosize-textarea": "7.1.0", @@ -56,8 +60,10 @@ "react-dnd": "15.1.2", "react-dnd-html5-backend": "15.1.3", "react-dom": "17.0.2", + "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", + "react-range": "1.8.14", "sanitize-html": "2.8.0", "slate": "0.90.0", "slate-history": "0.93.0", @@ -70,9 +76,12 @@ "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rollup/plugin-inject": "5.0.3", "@rollup/plugin-wasm": "6.1.1", + "@types/file-saver": "2.0.5", "@types/node": "18.11.18", + "@types/prismjs": "1.26.0", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", + "@types/sanitize-html": "2.9.0", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", diff --git a/src/app/components/Pdf-viewer/PdfViewer.css.ts b/src/app/components/Pdf-viewer/PdfViewer.css.ts new file mode 100644 index 00000000..46551098 --- /dev/null +++ b/src/app/components/Pdf-viewer/PdfViewer.css.ts @@ -0,0 +1,37 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, color, config } from 'folds'; + +export const PdfViewer = style([ + DefaultReset, + { + height: '100%', + }, +]); + +export const PdfViewerHeader = style([ + DefaultReset, + { + paddingLeft: config.space.S200, + paddingRight: config.space.S200, + borderBottomWidth: config.borderWidth.B300, + flexShrink: 0, + gap: config.space.S200, + }, +]); +export const PdfViewerFooter = style([ + PdfViewerHeader, + { + borderTopWidth: config.borderWidth.B300, + borderBottomWidth: 0, + }, +]); + +export const PdfViewerContent = style([ + DefaultReset, + { + margin: 'auto', + display: 'inline-block', + backgroundColor: color.Surface.Container, + color: color.Surface.OnContainer, + }, +]); diff --git a/src/app/components/Pdf-viewer/PdfViewer.tsx b/src/app/components/Pdf-viewer/PdfViewer.tsx new file mode 100644 index 00000000..c440cce9 --- /dev/null +++ b/src/app/components/Pdf-viewer/PdfViewer.tsx @@ -0,0 +1,257 @@ +/* eslint-disable no-param-reassign */ +/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ +import React, { FormEventHandler, useEffect, useRef, useState } from 'react'; +import classNames from 'classnames'; +import { + Box, + Button, + Chip, + Header, + Icon, + IconButton, + Icons, + Input, + Menu, + PopOut, + Scroll, + Spinner, + Text, + as, + config, +} from 'folds'; +import FocusTrap from 'focus-trap-react'; +import FileSaver from 'file-saver'; +import * as css from './PdfViewer.css'; +import { AsyncStatus } from '../../hooks/useAsyncCallback'; +import { useZoom } from '../../hooks/useZoom'; +import { createPage, usePdfDocumentLoader, usePdfJSLoader } from '../../plugins/pdfjs-dist'; + +export type PdfViewerProps = { + name: string; + src: string; + requestClose: () => void; +}; + +export const PdfViewer = as<'div', PdfViewerProps>( + ({ className, name, src, requestClose, ...props }, ref) => { + const containerRef = useRef(null); + const scrollRef = useRef(null); + const { zoom, zoomIn, zoomOut, setZoom } = useZoom(0.2); + + const [pdfJSState, loadPdfJS] = usePdfJSLoader(); + const [docState, loadPdfDocument] = usePdfDocumentLoader( + pdfJSState.status === AsyncStatus.Success ? pdfJSState.data : undefined, + src + ); + const isLoading = + pdfJSState.status === AsyncStatus.Loading || docState.status === AsyncStatus.Loading; + const isError = + pdfJSState.status === AsyncStatus.Error || docState.status === AsyncStatus.Error; + const [pageNo, setPageNo] = useState(1); + const [openJump, setOpenJump] = useState(false); + + useEffect(() => { + loadPdfJS(); + }, [loadPdfJS]); + useEffect(() => { + if (pdfJSState.status === AsyncStatus.Success) { + loadPdfDocument(); + } + }, [pdfJSState, loadPdfDocument]); + + useEffect(() => { + if (docState.status === AsyncStatus.Success) { + const doc = docState.data; + if (pageNo < 0 || pageNo > doc.numPages) return; + createPage(doc, pageNo, { scale: zoom }).then((canvas) => { + const container = containerRef.current; + if (!container) return; + container.textContent = ''; + container.append(canvas); + scrollRef.current?.scrollTo({ + top: 0, + }); + }); + } + }, [docState, pageNo, zoom]); + + const handleDownload = () => { + FileSaver.saveAs(src, name); + }; + + const handleJumpSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + if (docState.status !== AsyncStatus.Success) return; + const jumpInput = evt.currentTarget.jumpInput as HTMLInputElement; + if (!jumpInput) return; + const jumpTo = parseInt(jumpInput.value, 10); + setPageNo(Math.max(1, Math.min(docState.data.numPages, jumpTo))); + setOpenJump(false); + }; + + const handlePrevPage = () => { + setPageNo((n) => Math.max(n - 1, 1)); + }; + + const handleNextPage = () => { + if (docState.status !== AsyncStatus.Success) return; + setPageNo((n) => Math.min(n + 1, docState.data.numPages)); + }; + + return ( + +
    + + + + + + {name} + + + + + + + setZoom(zoom === 1 ? 2 : 1)}> + {Math.round(zoom * 100)}% + + 1 ? 'Success' : 'SurfaceVariant'} + outlined={zoom > 1} + size="300" + radii="Pill" + onClick={zoomIn} + aria-label="Zoom In" + > + + + } + > + Download + + +
    + + {isLoading && } + {isError && ( + <> + Failed to load PDF + + + )} + {docState.status === AsyncStatus.Success && ( + + +
    + + + )} + + {docState.status === AsyncStatus.Success && ( +
    + } + onClick={handlePrevPage} + aria-disabled={pageNo <= 1} + > + Previous + + + setOpenJump(false), + clickOutsideDeactivates: true, + }} + > + + + + + + + + } + > + {(anchorRef) => ( + setOpenJump(!openJump)} + ref={anchorRef} + variant="SurfaceVariant" + radii="300" + aria-pressed={openJump} + > + {`${pageNo}/${docState.data.numPages}`} + + )} + + + } + onClick={handleNextPage} + aria-disabled={pageNo >= docState.data.numPages} + > + Next + +
    + )} + + ); + } +); diff --git a/src/app/components/Pdf-viewer/index.ts b/src/app/components/Pdf-viewer/index.ts new file mode 100644 index 00000000..5fc0566f --- /dev/null +++ b/src/app/components/Pdf-viewer/index.ts @@ -0,0 +1 @@ +export * from './PdfViewer'; diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index f4241e0e..e5377f2f 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -54,7 +54,7 @@ export const useEditor = (): Editor => { return editor; }; -export type EditorChangeHandler = ((value: Descendant[]) => void) | undefined; +export type EditorChangeHandler = (value: Descendant[]) => void; type CustomEditorProps = { top?: ReactNode; bottom?: ReactNode; @@ -64,6 +64,7 @@ type CustomEditorProps = { editor: Editor; placeholder?: string; onKeyDown?: KeyboardEventHandler; + onKeyUp?: KeyboardEventHandler; onChange?: EditorChangeHandler; onPaste?: ClipboardEventHandler; }; @@ -78,6 +79,7 @@ export const CustomEditor = forwardRef( editor, placeholder, onKeyDown, + onKeyUp, onChange, onPaste, }, @@ -141,6 +143,7 @@ export const CustomEditor = forwardRef( renderElement={renderElement} renderLeaf={renderLeaf} onKeyDown={handleKeydown} + onKeyUp={onKeyUp} onPaste={onPaste} /> diff --git a/src/app/components/editor/Elements.tsx b/src/app/components/editor/Elements.tsx index 59893e53..2df80993 100644 --- a/src/app/components/editor/Elements.tsx +++ b/src/app/components/editor/Elements.tsx @@ -2,7 +2,7 @@ import { Scroll, Text } from 'folds'; import React from 'react'; import { RenderElementProps, RenderLeafProps, useFocused, useSelected } from 'slate-react'; -import * as css from './Elements.css'; +import * as css from '../../styles/CustomHtml.css'; import { EmoticonElement, LinkElement, MentionElement } from './slate'; import { useMatrixClient } from '../../hooks/useMatrixClient'; @@ -145,7 +145,13 @@ export function RenderElement({ attributes, element, children }: RenderElementPr case BlockType.CodeBlock: return ( - +
    {children}
    @@ -242,7 +248,7 @@ export function RenderLeaf({ attributes, leaf, children }: RenderLeafProps) { ); if (leaf.spoiler) child = ( - + {child} diff --git a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx index 6bea1952..baa217ca 100644 --- a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx @@ -122,8 +122,9 @@ export function RoomMentionAutocomplete({ return; } const rId = autoCompleteRoomIds[0]; - const name = mx.getRoom(rId)?.name ?? rId; - handleAutocomplete(rId, name); + const r = mx.getRoom(rId); + const name = r?.name ?? rId; + handleAutocomplete(r?.getCanonicalAlias() ?? rId, name); }); }); @@ -147,7 +148,7 @@ export function RoomMentionAutocomplete({ onKeyDown={(evt: ReactKeyboardEvent) => onTabPress(evt, () => handleAutocomplete(rId, room.name)) } - onClick={() => handleAutocomplete(rId, room.name)} + onClick={() => handleAutocomplete(room.getCanonicalAlias() ?? rId, room.name)} after={ {room.getCanonicalAlias() ?? ''} diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 76c6f05d..a7309834 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -42,7 +42,7 @@ import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRecentEmoji } from '../../hooks/useRecentEmoji'; import { ExtendedPackImage, ImagePack, PackUsage } from '../../plugins/custom-emoji'; import { isUserId } from '../../utils/matrix'; -import { editableActiveElement, inVisibleScrollArea, targetFromEvent } from '../../utils/dom'; +import { editableActiveElement, isIntersectingScrollView, targetFromEvent } from '../../utils/dom'; import { useAsyncSearch, UseAsyncSearchOptions } from '../../hooks/useAsyncSearch'; import { useDebounce } from '../../hooks/useDebounce'; import { useThrottle } from '../../hooks/useThrottle'; @@ -675,7 +675,7 @@ export function EmojiBoard({ const targetEl = contentScrollRef.current; if (!targetEl) return; const groupEls = [...targetEl.querySelectorAll('div[data-group-id]')] as HTMLElement[]; - const groupEl = groupEls.find((el) => inVisibleScrollArea(targetEl, el)); + const groupEl = groupEls.find((el) => isIntersectingScrollView(targetEl, el)); const groupId = groupEl?.getAttribute('data-group-id') ?? undefined; setActiveGroupId(groupId); }, [setActiveGroupId]); diff --git a/src/app/components/event-readers/EventReaders.css.ts b/src/app/components/event-readers/EventReaders.css.ts new file mode 100644 index 00000000..36f47b56 --- /dev/null +++ b/src/app/components/event-readers/EventReaders.css.ts @@ -0,0 +1,21 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, config } from 'folds'; + +export const EventReaders = style([ + DefaultReset, + { + height: '100%', + }, +]); + +export const Header = style({ + paddingLeft: config.space.S400, + paddingRight: config.space.S300, + + flexShrink: 0, +}); + +export const Content = style({ + paddingLeft: config.space.S200, + paddingBottom: config.space.S400, +}); diff --git a/src/app/components/event-readers/EventReaders.tsx b/src/app/components/event-readers/EventReaders.tsx new file mode 100644 index 00000000..c05efc50 --- /dev/null +++ b/src/app/components/event-readers/EventReaders.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import classNames from 'classnames'; +import { + Avatar, + AvatarFallback, + AvatarImage, + Box, + Header, + Icon, + IconButton, + Icons, + MenuItem, + Scroll, + Text, + as, + config, +} from 'folds'; +import { Room, RoomMember } from 'matrix-js-sdk'; +import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; +import { getMemberDisplayName } from '../../utils/room'; +import { getMxIdLocalPart } from '../../utils/matrix'; +import * as css from './EventReaders.css'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import colorMXID from '../../../util/colorMXID'; +import { openProfileViewer } from '../../../client/action/navigation'; + +export type EventReadersProps = { + room: Room; + eventId: string; + requestClose: () => void; +}; +export const EventReaders = as<'div', EventReadersProps>( + ({ className, room, eventId, requestClose, ...props }, ref) => { + const mx = useMatrixClient(); + const latestEventReaders = useRoomEventReaders(room, eventId); + const followingMembers = latestEventReaders + .map((readerId) => room.getMember(readerId)) + .filter((member) => member) as RoomMember[]; + + const getName = (member: RoomMember) => + getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) ?? member.userId; + + return ( + +
    + + Seen by + + + + +
    + + + + {followingMembers.map((member) => { + const name = getName(member); + const avatarUrl = member.getAvatarUrl( + mx.baseUrl, + 100, + 100, + 'crop', + undefined, + false + ); + + return ( + { + requestClose(); + openProfileViewer(member.userId, room.roomId); + }} + before={ + + {avatarUrl ? ( + + ) : ( + + {name[0]} + + )} + + } + > + + {name} + + + ); + })} + + + +
    + ); + } +); diff --git a/src/app/components/event-readers/index.ts b/src/app/components/event-readers/index.ts new file mode 100644 index 00000000..8a37548b --- /dev/null +++ b/src/app/components/event-readers/index.ts @@ -0,0 +1 @@ +export * from './EventReaders'; diff --git a/src/app/components/image-viewer/ImageViewer.css.ts b/src/app/components/image-viewer/ImageViewer.css.ts new file mode 100644 index 00000000..fc2f5088 --- /dev/null +++ b/src/app/components/image-viewer/ImageViewer.css.ts @@ -0,0 +1,40 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, color, config } from 'folds'; + +export const ImageViewer = style([ + DefaultReset, + { + height: '100%', + }, +]); + +export const ImageViewerHeader = style([ + DefaultReset, + { + paddingLeft: config.space.S200, + paddingRight: config.space.S200, + borderBottomWidth: config.borderWidth.B300, + flexShrink: 0, + gap: config.space.S200, + }, +]); + +export const ImageViewerContent = style([ + DefaultReset, + { + backgroundColor: color.Background.Container, + color: color.Background.OnContainer, + overflow: 'hidden', + }, +]); + +export const ImageViewerImg = style([ + DefaultReset, + { + objectFit: 'contain', + width: '100%', + height: '100%', + backgroundColor: color.Surface.Container, + transition: 'transform 100ms linear', + }, +]); diff --git a/src/app/components/image-viewer/ImageViewer.tsx b/src/app/components/image-viewer/ImageViewer.tsx new file mode 100644 index 00000000..4fd06b7a --- /dev/null +++ b/src/app/components/image-viewer/ImageViewer.tsx @@ -0,0 +1,95 @@ +/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ +import React from 'react'; +import FileSaver from 'file-saver'; +import classNames from 'classnames'; +import { Box, Chip, Header, Icon, IconButton, Icons, Text, as } from 'folds'; +import * as css from './ImageViewer.css'; +import { useZoom } from '../../hooks/useZoom'; +import { usePan } from '../../hooks/usePan'; + +export type ImageViewerProps = { + alt: string; + src: string; + requestClose: () => void; +}; + +export const ImageViewer = as<'div', ImageViewerProps>( + ({ className, alt, src, requestClose, ...props }, ref) => { + const { zoom, zoomIn, zoomOut, setZoom } = useZoom(0.2); + const { pan, cursor, onMouseDown } = usePan(zoom !== 1); + + const handleDownload = () => { + FileSaver.saveAs(src, alt); + }; + + return ( + +
    + + + + + + {alt} + + + + + + + setZoom(zoom === 1 ? 2 : 1)}> + {Math.round(zoom * 100)}% + + 1 ? 'Success' : 'SurfaceVariant'} + outlined={zoom > 1} + size="300" + radii="Pill" + onClick={zoomIn} + aria-label="Zoom In" + > + + + } + > + Download + + +
    + + {alt} + +
    + ); + } +); diff --git a/src/app/components/image-viewer/index.ts b/src/app/components/image-viewer/index.ts new file mode 100644 index 00000000..69943f2f --- /dev/null +++ b/src/app/components/image-viewer/index.ts @@ -0,0 +1 @@ +export * from './ImageViewer'; diff --git a/src/app/components/media/Image.tsx b/src/app/components/media/Image.tsx new file mode 100644 index 00000000..dda21a53 --- /dev/null +++ b/src/app/components/media/Image.tsx @@ -0,0 +1,9 @@ +import React, { ImgHTMLAttributes, forwardRef } from 'react'; +import classNames from 'classnames'; +import * as css from './media.css'; + +export const Image = forwardRef>( + ({ className, alt, ...props }, ref) => ( + {alt} + ) +); diff --git a/src/app/components/media/MediaControls.tsx b/src/app/components/media/MediaControls.tsx new file mode 100644 index 00000000..95a344ab --- /dev/null +++ b/src/app/components/media/MediaControls.tsx @@ -0,0 +1,27 @@ +import React, { ReactNode } from 'react'; +import { Box, as } from 'folds'; + +export type MediaControlProps = { + before?: ReactNode; + after?: ReactNode; + leftControl?: ReactNode; + rightControl?: ReactNode; +}; +export const MediaControl = as<'div', MediaControlProps>( + ({ before, after, leftControl, rightControl, children, ...props }, ref) => ( + + {before && {before}} + + + {leftControl} + + + + {rightControl} + + + {after && {after}} + {children} + + ) +); diff --git a/src/app/components/media/Video.tsx b/src/app/components/media/Video.tsx new file mode 100644 index 00000000..ab13c5bd --- /dev/null +++ b/src/app/components/media/Video.tsx @@ -0,0 +1,10 @@ +import React, { VideoHTMLAttributes, forwardRef } from 'react'; +import classNames from 'classnames'; +import * as css from './media.css'; + +export const Video = forwardRef>( + ({ className, ...props }, ref) => ( + // eslint-disable-next-line jsx-a11y/media-has-caption +
    - +
    - +
    ); diff --git a/src/app/templates/client/ClientContent.jsx b/src/app/templates/client/ClientContent.jsx new file mode 100644 index 00000000..ada7008e --- /dev/null +++ b/src/app/templates/client/ClientContent.jsx @@ -0,0 +1,49 @@ +import React, { useState, useEffect } from 'react'; + +import initMatrix from '../../../client/initMatrix'; +import cons from '../../../client/state/cons'; +import navigation from '../../../client/state/navigation'; +import { openNavigation } from '../../../client/action/navigation'; + +import Welcome from '../../organisms/welcome/Welcome'; +import { RoomBaseView } from '../../organisms/room/Room'; + +export function ClientContent() { + const [roomInfo, setRoomInfo] = useState({ + room: null, + eventId: null, + }); + + const mx = initMatrix.matrixClient; + + useEffect(() => { + const handleRoomSelected = (rId, pRoomId, eId) => { + roomInfo.roomTimeline?.removeInternalListeners(); + const r = mx.getRoom(rId); + if (r) { + setRoomInfo({ + room: r, + eventId: eId ?? null, + }); + } else { + setRoomInfo({ + room: null, + eventId: null, + }); + } + }; + + navigation.on(cons.events.navigation.ROOM_SELECTED, handleRoomSelected); + return () => { + navigation.removeListener(cons.events.navigation.ROOM_SELECTED, handleRoomSelected); + }; + }, [roomInfo, mx]); + + const { room, eventId } = roomInfo; + if (!room) { + setTimeout(() => openNavigation()); + return ; + } + + return ; +} diff --git a/src/app/utils/blurHash.ts b/src/app/utils/blurHash.ts index 0de5a922..3fe1ade0 100644 --- a/src/app/utils/blurHash.ts +++ b/src/app/utils/blurHash.ts @@ -1,15 +1,15 @@ import { encode } from 'blurhash'; -export const MATRIX_BLUR_HASH_PROPERTY_NAME = 'xyz.amorgan.blurhash'; - export const encodeBlurHash = ( img: HTMLImageElement | HTMLVideoElement, width?: number, height?: number ): string | undefined => { + const imgWidth = img instanceof HTMLVideoElement ? img.videoWidth : img.width; + const imgHeight = img instanceof HTMLVideoElement ? img.videoHeight : img.height; const canvas = document.createElement('canvas'); - canvas.width = width || img.width; - canvas.height = height || img.height; + canvas.width = width || imgWidth; + canvas.height = height || imgHeight; const context = canvas.getContext('2d'); if (!context) return undefined; diff --git a/src/app/utils/common.ts b/src/app/utils/common.ts index d3804ae8..e007f222 100644 --- a/src/app/utils/common.ts +++ b/src/app/utils/common.ts @@ -11,6 +11,19 @@ export const bytesToSize = (bytes: number): string => { return `${(bytes / 1000 ** sizeIndex).toFixed(1)} ${sizes[sizeIndex]}`; }; +export const millisecondsToMinutesAndSeconds = (milliseconds: number): string => { + const seconds = Math.floor(milliseconds / 1000); + const mm = Math.floor(seconds / 60); + const ss = Math.round(seconds % 60); + return `${mm}:${ss < 10 ? '0' : ''}${ss}`; +}; + +export const secondsToMinutesAndSeconds = (seconds: number): string => { + const mm = Math.floor(seconds / 60); + const ss = Math.round(seconds % 60); + return `${mm}:${ss < 10 ? '0' : ''}${ss}`; +}; + export const getFileTypeIcon = (icons: Record, fileType: string): IconSrc => { const type = fileType.toLowerCase(); if (type.startsWith('audio')) { @@ -30,3 +43,37 @@ export const fulfilledPromiseSettledResult = (prs: PromiseSettledResult[]) if (pr.status === 'fulfilled') values.push(pr.value); return values; }, []); + +export const binarySearch = (items: T[], match: (item: T) => -1 | 0 | 1): T | undefined => { + const search = (start: number, end: number): T | undefined => { + if (start > end) return undefined; + + const mid = Math.floor((start + end) / 2); + + const result = match(items[mid]); + if (result === 0) return items[mid]; + + if (result === 1) return search(start, mid - 1); + return search(mid + 1, end); + }; + + return search(0, items.length - 1); +}; + +export const randomNumberBetween = (min: number, max: number) => + Math.floor(Math.random() * (max - min + 1)) + min; + +export const scaleYDimension = (x: number, scaledX: number, y: number): number => { + const scaleFactor = scaledX / x; + return scaleFactor * y; +}; + +export const parseGeoUri = (location: string) => { + const [, data] = location.split(':'); + const [cords] = data.split(';'); + const [latitude, longitude] = cords.split(','); + return { + latitude, + longitude, + }; +}; diff --git a/src/app/utils/dom.ts b/src/app/utils/dom.ts index d717adf2..a8dc4be2 100644 --- a/src/app/utils/dom.ts +++ b/src/app/utils/dom.ts @@ -7,7 +7,7 @@ export const editableActiveElement = (): boolean => !!document.activeElement && /^(input)|(textarea)$/.test(document.activeElement.nodeName.toLowerCase()); -export const inVisibleScrollArea = ( +export const isIntersectingScrollView = ( scrollElement: HTMLElement, childElement: HTMLElement ): boolean => { @@ -18,10 +18,25 @@ export const inVisibleScrollArea = ( const childBottom = childTop + childElement.clientHeight; if (childTop >= scrollTop && childTop < scrollBottom) return true; - if (childTop < scrollTop && childBottom > scrollTop) return true; + if (childBottom > scrollTop && childBottom <= scrollBottom) return true; + if (childTop < scrollTop && childBottom > scrollBottom) return true; return false; }; +export const isInScrollView = (scrollElement: HTMLElement, childElement: HTMLElement): boolean => { + const scrollTop = scrollElement.offsetTop + scrollElement.scrollTop; + const scrollBottom = scrollTop + scrollElement.offsetHeight; + return ( + childElement.offsetTop >= scrollTop && + childElement.offsetTop + childElement.offsetHeight <= scrollBottom + ); +}; + +export const canFitInScrollView = ( + scrollElement: HTMLElement, + childElement: HTMLElement +): boolean => childElement.offsetHeight < scrollElement.offsetHeight; + export type FilesOrFile = T extends true ? File[] : File; export const selectFile = ( @@ -131,3 +146,43 @@ export const getThumbnail = ( resolve(thumbnail ?? undefined); }, thumbnailMimeType ?? 'image/jpeg'); }); + +export type ScrollInfo = { + offsetTop: number; + top: number; + height: number; + viewHeight: number; + scrollable: boolean; +}; +export const getScrollInfo = (target: HTMLElement): ScrollInfo => ({ + offsetTop: Math.round(target.offsetTop), + top: Math.round(target.scrollTop), + height: Math.round(target.scrollHeight), + viewHeight: Math.round(target.offsetHeight), + scrollable: target.scrollHeight > target.offsetHeight, +}); + +export const scrollToBottom = (scrollEl: HTMLElement, behavior?: 'auto' | 'instant' | 'smooth') => { + scrollEl.scrollTo({ + top: Math.round(scrollEl.scrollHeight - scrollEl.offsetHeight), + behavior, + }); +}; + +export const copyToClipboard = (text: string) => { + if (navigator.clipboard) { + navigator.clipboard.writeText(text); + } else { + const host = document.body; + const copyInput = document.createElement('input'); + copyInput.style.position = 'fixed'; + copyInput.style.opacity = '0'; + copyInput.value = text; + host.append(copyInput); + + copyInput.select(); + copyInput.setSelectionRange(0, 99999); + document.execCommand('Copy'); + copyInput.remove(); + } +}; diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 7f2fc0f2..91bd80f3 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -1,5 +1,16 @@ -import { EncryptedAttachmentInfo, encryptAttachment } from 'browser-encrypt-attachment'; -import { MatrixClient, MatrixError, UploadProgress, UploadResponse } from 'matrix-js-sdk'; +import { + EncryptedAttachmentInfo, + decryptAttachment, + encryptAttachment, +} from 'browser-encrypt-attachment'; +import { + MatrixClient, + MatrixError, + MatrixEvent, + Room, + UploadProgress, + UploadResponse, +} from 'matrix-js-sdk'; import { IImageInfo, IThumbnailContent, IVideoInfo } from '../../types/matrix/common'; export const matchMxId = (id: string): RegExpMatchArray | null => @@ -13,6 +24,13 @@ export const getMxIdLocalPart = (userId: string): string | undefined => matchMxI export const isUserId = (id: string): boolean => validMxId(id) && id.startsWith('@'); +export const isRoomId = (id: string): boolean => validMxId(id) && id.startsWith('!'); + +export const isRoomAlias = (id: string): boolean => validMxId(id) && id.startsWith('#'); + +export const getRoomWithCanonicalAlias = (mx: MatrixClient, alias: string): Room | undefined => + mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias); + export const getImageInfo = (img: HTMLImageElement, fileOrBlob: File | Blob): IImageInfo => { const info: IImageInfo = {}; info.w = img.width; @@ -24,7 +42,7 @@ export const getImageInfo = (img: HTMLImageElement, fileOrBlob: File | Blob): II export const getVideoInfo = (video: HTMLVideoElement, fileOrBlob: File | Blob): IVideoInfo => { const info: IVideoInfo = {}; - info.duration = Number.isNaN(video.duration) ? undefined : video.duration; + info.duration = Number.isNaN(video.duration) ? undefined : Math.floor(video.duration * 1000); info.w = video.videoWidth; info.h = video.videoHeight; info.mimetype = fileOrBlob.type; @@ -79,6 +97,16 @@ export const encryptFile = async ( }; }; +export const decryptFile = async ( + dataBuffer: ArrayBuffer, + type: string, + encInfo: EncryptedAttachmentInfo +): Promise => { + const dataArray = await decryptAttachment(dataBuffer, encInfo); + const blob = new Blob([dataArray], { type }); + return blob; +}; + export type TUploadContent = File | Blob; export type ContentUploadOptions = { @@ -116,3 +144,19 @@ export const uploadContent = async ( onError(new MatrixError({ error, errcode })); } }; + +export const matrixEventByRecency = (m1: MatrixEvent, m2: MatrixEvent) => m2.getTs() - m1.getTs(); + +export const factoryEventSentBy = (senderId: string) => (ev: MatrixEvent) => + ev.getSender() === senderId; + +export const eventWithShortcode = (ev: MatrixEvent) => + typeof ev.getContent().shortcode === 'string'; + +export const trimReplyFromBody = (body: string): string => { + if (body.match(/^> <.+>/) === null) return body; + + const trimmedBody = body.slice(body.indexOf('\n\n') + 2); + + return trimmedBody || body; +}; diff --git a/src/app/utils/mimeTypes.ts b/src/app/utils/mimeTypes.ts index c432bdc3..c883ddb9 100644 --- a/src/app/utils/mimeTypes.ts +++ b/src/app/utils/mimeTypes.ts @@ -1,17 +1,15 @@ -// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts -export const ALLOWED_BLOB_MIMETYPES = [ +export const IMAGE_MIME_TYPES = [ 'image/jpeg', 'image/gif', 'image/png', 'image/apng', 'image/webp', 'image/avif', +]; - 'video/mp4', - 'video/webm', - 'video/ogg', - 'video/quicktime', +export const VIDEO_MIME_TYPES = ['video/mp4', 'video/webm', 'video/ogg', 'video/quicktime']; +export const AUDIO_MIME_TYPES = [ 'audio/mp4', 'audio/webm', 'audio/aac', @@ -25,11 +23,55 @@ export const ALLOWED_BLOB_MIMETYPES = [ 'audio/x-flac', ]; +export const APPLICATION_MIME_TYPES = [ + 'application/pdf', + 'application/json', + 'application/x-sh', + 'application/ecmascript', + 'application/javascript', + 'application/xhtml+xml', + 'application/xml', +]; + +export const TEXT_MIME_TYPE = [ + 'text/plain', + 'text/html', + 'text/css', + 'text/javascript', + 'text/x-c', + 'text/csv', + 'text/tab-separated-values', + 'text/yaml', + 'text/x-java-source,java', + 'text/markdown', +]; + +export const READABLE_TEXT_MIME_TYPES = [ + 'application/json', + 'application/x-sh', + 'application/ecmascript', + 'application/javascript', + 'application/xhtml+xml', + 'application/xml', + + ...TEXT_MIME_TYPE, +]; + +export const ALLOWED_BLOB_MIME_TYPES = [ + ...IMAGE_MIME_TYPES, + ...VIDEO_MIME_TYPES, + ...AUDIO_MIME_TYPES, + ...APPLICATION_MIME_TYPES, + ...TEXT_MIME_TYPE, +]; + +export const FALLBACK_MIMETYPE = 'application/octet-stream'; + export const getBlobSafeMimeType = (mimeType: string) => { - if (typeof mimeType !== 'string') return 'application/octet-stream'; + if (typeof mimeType !== 'string') return FALLBACK_MIMETYPE; const [type] = mimeType.split(';'); - if (!ALLOWED_BLOB_MIMETYPES.includes(type)) { - return 'application/octet-stream'; + if (!ALLOWED_BLOB_MIME_TYPES.includes(type)) { + return FALLBACK_MIMETYPE; } // Required for Chromium browsers if (type === 'video/quicktime') { @@ -45,3 +87,8 @@ export const safeFile = (f: File) => { } return f; }; + +export const mimeTypeToExt = (mimeType: string): string => { + const extStart = mimeType.lastIndexOf('/') + 1; + return mimeType.slice(extStart); +}; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index daf95600..f8637833 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -1,6 +1,7 @@ import { IconName, IconSrc } from 'folds'; import { + EventTimeline, IPushRule, IPushRules, JoinRule, @@ -9,6 +10,7 @@ import { NotificationCountType, Room, } from 'matrix-js-sdk'; +import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend'; import { AccountDataEvent } from '../../types/matrix/accountData'; import { NotificationType, @@ -263,3 +265,35 @@ export const parseReplyFormattedBody = ( return `
    ${replyToLink}${userLink}
    ${formattedBody}
    `; }; + +export const getMemberDisplayName = (room: Room, userId: string): string | undefined => { + const member = room.getMember(userId); + const name = member?.rawDisplayName; + if (name === userId) return undefined; + return name; +}; + +export const getMemberAvatarMxc = (room: Room, userId: string): string | undefined => { + const member = room.getMember(userId); + return member?.getMxcAvatarUrl(); +}; + +export const decryptAllTimelineEvent = async (mx: MatrixClient, timeline: EventTimeline) => { + const crypto = mx.getCrypto(); + if (!crypto) return; + const decryptionPromises = timeline + .getEvents() + .filter((event) => event.isEncrypted()) + .reverse() + .map((event) => event.attemptDecryption(crypto as CryptoBackend, { isRetry: true })); + await Promise.allSettled(decryptionPromises); +}; + +export const getReactionContent = (eventId: string, key: string, shortcode?: string) => ({ + 'm.relates_to': { + event_id: eventId, + key, + rel_type: 'm.annotation', + }, + shortcode, +}); diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts index 555089de..6a03ca7d 100644 --- a/src/app/utils/sanitize.ts +++ b/src/app/utils/sanitize.ts @@ -1,3 +1,145 @@ +import sanitizeHtml, { Transformer } from 'sanitize-html'; + +const MAX_TAG_NESTING = 100; + +const permittedHtmlTags = [ + 'font', + 'del', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'p', + 'a', + 'ul', + 'ol', + 'sup', + 'sub', + 'li', + 'b', + 'i', + 'u', + 'strong', + 'em', + 'strike', + 's', + 'code', + 'hr', + 'br', + 'div', + 'table', + 'thead', + 'tbody', + 'tr', + 'th', + 'td', + 'caption', + 'pre', + 'span', + 'img', + 'details', + 'summary', +]; + +const urlSchemes = ['https', 'http', 'ftp', 'mailto', 'magnet']; + +const permittedTagToAttributes = { + font: ['style', 'data-mx-bg-color', 'data-mx-color', 'color'], + span: [ + 'style', + 'data-mx-bg-color', + 'data-mx-color', + 'data-mx-spoiler', + 'data-mx-maths', + 'data-mx-pill', + 'data-mx-ping', + ], + div: ['data-mx-maths'], + a: ['name', 'target', 'href', 'rel'], + img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], + ol: ['start'], + code: ['class'], +}; + +const transformFontTag: Transformer = (tagName, attribs) => ({ + tagName, + attribs: { + ...attribs, + style: `background-color: ${attribs['data-mx-bg-color']}; color: ${attribs['data-mx-color']}`, + }, +}); + +const transformSpanTag: Transformer = (tagName, attribs) => ({ + tagName, + attribs: { + ...attribs, + style: `background-color: ${attribs['data-mx-bg-color']}; color: ${attribs['data-mx-color']}`, + }, +}); + +const transformATag: Transformer = (tagName, attribs) => ({ + tagName, + attribs: { + ...attribs, + rel: 'noopener', + target: '_blank', + }, +}); + +const transformImgTag: Transformer = (tagName, attribs) => { + const { src } = attribs; + if (src.startsWith('mxc://') === false) { + return { + tagName: 'a', + attribs: { + href: src, + rel: 'noopener', + target: '_blank', + }, + text: attribs.alt || src, + }; + } + return { + tagName, + attribs: { + ...attribs, + }, + }; +}; + +export const sanitizeCustomHtml = (customHtml: string): string => + sanitizeHtml(customHtml, { + allowedTags: permittedHtmlTags, + allowedAttributes: permittedTagToAttributes, + disallowedTagsMode: 'discard', + allowedSchemes: urlSchemes, + allowedSchemesByTag: { + a: urlSchemes, + }, + allowedSchemesAppliedToAttributes: ['href'], + allowProtocolRelative: false, + allowedClasses: { + code: ['language-*'], + }, + allowedStyles: { + '*': { + color: [/^#(?:[0-9a-fA-F]{3}){1,2}$/], + 'background-color': [/^#(?:[0-9a-fA-F]{3}){1,2}$/], + }, + }, + transformTags: { + font: transformFontTag, + span: transformSpanTag, + a: transformATag, + img: transformImgTag, + }, + nonTextTags: ['style', 'script', 'textarea', 'option', 'noscript', 'mx-reply'], + nestingLimit: MAX_TAG_NESTING, + }); + export const sanitizeText = (body: string) => { const tagsToReplace: Record = { '&': '&', diff --git a/src/app/utils/time.ts b/src/app/utils/time.ts new file mode 100644 index 00000000..3ee6720c --- /dev/null +++ b/src/app/utils/time.ts @@ -0,0 +1,35 @@ +import dayjs from 'dayjs'; +import isToday from 'dayjs/plugin/isToday'; +import isYesterday from 'dayjs/plugin/isYesterday'; + +dayjs.extend(isToday); +dayjs.extend(isYesterday); + +export const today = (ts: number): boolean => dayjs(ts).isToday(); + +export const yesterday = (ts: number): boolean => dayjs(ts).isYesterday(); + +export const timeHourMinute = (ts: number): string => dayjs(ts).format('hh:mm A'); + +export const timeDayMonYear = (ts: number): string => dayjs(ts).format('D MMM YYYY'); + +export const timeDayMonthYear = (ts: number): string => dayjs(ts).format('D MMMM YYYY'); + +export const inSameDay = (ts1: number, ts2: number): boolean => { + const dt1 = new Date(ts1); + const dt2 = new Date(ts2); + return ( + dt2.getFullYear() === dt1.getFullYear() && + dt2.getMonth() === dt1.getMonth() && + dt2.getDate() === dt1.getDate() + ); +}; + +export const minuteDifference = (ts1: number, ts2: number): number => { + const dt1 = new Date(ts1); + const dt2 = new Date(ts2); + + let diff = (dt2.getTime() - dt1.getTime()) / 1000; + diff /= 60; + return Math.abs(Math.round(diff)); +}; diff --git a/src/client/state/settings.js b/src/client/state/settings.js index af2e279a..cc1193ce 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -59,6 +59,8 @@ class Settings extends EventEmitter { this.themes.forEach((themeName, index) => { if (themeName !== '') document.body.classList.remove(themeName); document.body.classList.remove(this.themeClasses[index]); + document.body.classList.remove('prism-light') + document.body.classList.remove('prism-dark') }); } @@ -69,6 +71,7 @@ class Settings extends EventEmitter { if (this.themes[themeIndex] === undefined) return if (this.themes[themeIndex]) document.body.classList.add(this.themes[themeIndex]); document.body.classList.add(this.themeClasses[themeIndex]); + document.body.classList.add(themeIndex < 2 ? 'prism-light' : 'prism-dark'); } setTheme(themeIndex) { diff --git a/src/ext.d.ts b/src/ext.d.ts index 55f59327..5593b6e7 100644 --- a/src/ext.d.ts +++ b/src/ext.d.ts @@ -20,4 +20,9 @@ declare module 'browser-encrypt-attachment' { } export function encryptAttachment(dataBuffer: ArrayBuffer): Promise; + + export function decryptAttachment( + dataBuffer: ArrayBuffer, + info: EncryptedAttachmentInfo + ): Promise; } diff --git a/src/index.scss b/src/index.scss index 93443fe9..04125a1c 100644 --- a/src/index.scss +++ b/src/index.scss @@ -210,14 +210,14 @@ .dark-theme, .butter-theme { /* background color | --bg-[background type]: value */ - --bg-surface: hsl(208, 8%, 20%); - --bg-surface-transparent: hsla(208, 8%, 20%, 0); - --bg-surface-low: hsl(208, 8%, 16%); - --bg-surface-low-transparent: hsla(208, 8%, 16%, 0); - --bg-surface-extra-low: hsl(208, 8%, 14%); - --bg-surface-extra-low-transparent: hsla(208, 8%, 14%, 0); - --bg-surface-hover: rgba(255, 255, 255, 3%); - --bg-surface-active: rgba(255, 255, 255, 5%); + --bg-surface: #1f2326; + --bg-surface-transparent: #1f232600; + --bg-surface-low: #15171a; + --bg-surface-low-transparent: #15171a00; + --bg-surface-extra-low: #15171a; + --bg-surface-extra-low-transparent: #15171a00; + --bg-surface-hover: #1f2326; + --bg-surface-active: #2a2e33; --bg-surface-border: rgba(0, 0, 0, 20%); --bg-primary: rgb(42, 98, 166); diff --git a/src/types/matrix/common.ts b/src/types/matrix/common.ts index 94a46a90..cc20d453 100644 --- a/src/types/matrix/common.ts +++ b/src/types/matrix/common.ts @@ -1,16 +1,35 @@ import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { MsgType } from 'matrix-js-sdk'; + +export const MATRIX_BLUR_HASH_PROPERTY_NAME = 'xyz.amorgan.blurhash'; export type IImageInfo = { w?: number; h?: number; mimetype?: string; size?: number; + [MATRIX_BLUR_HASH_PROPERTY_NAME]?: string; }; -export type IVideoInfo = IImageInfo & { +export type IVideoInfo = { + w?: number; + h?: number; + mimetype?: string; + size?: number; duration?: number; }; +export type IAudioInfo = { + mimetype?: string; + size?: number; + duration?: number; +}; + +export type IFileInfo = { + mimetype?: string; + size?: number; +}; + export type IEncryptedFile = EncryptedAttachmentInfo & { url: string; }; @@ -20,3 +39,42 @@ export type IThumbnailContent = { thumbnail_file?: IEncryptedFile; thumbnail_url?: string; }; + +export type IImageContent = { + msgtype: MsgType.Image; + body?: string; + url?: string; + info?: IImageInfo & IThumbnailContent; + file?: IEncryptedFile; +}; + +export type IVideoContent = { + msgtype: MsgType.Video; + body?: string; + url?: string; + info?: IVideoInfo & IThumbnailContent; + file?: IEncryptedFile; +}; + +export type IAudioContent = { + msgtype: MsgType.Audio; + body?: string; + url?: string; + info?: IAudioInfo; + file?: IEncryptedFile; +}; + +export type IFileContent = { + msgtype: MsgType.File; + body?: string; + url?: string; + info?: IFileInfo & IThumbnailContent; + file?: IEncryptedFile; +}; + +export type ILocationContent = { + msgtype: MsgType.Location; + body?: string; + geo_uri?: string; + info?: IThumbnailContent; +}; diff --git a/src/types/matrix/room.ts b/src/types/matrix/room.ts index 93e87615..33419ce5 100644 --- a/src/types/matrix/room.ts +++ b/src/types/matrix/room.ts @@ -6,6 +6,14 @@ export enum Membership { Ban = 'ban', } +export type IMemberContent = { + avatar_url?: string; + displayname?: string; + membership?: Membership; + reason?: string; + is_direct?: boolean; +}; + export enum StateEvent { RoomCanonicalAlias = 'm.room.canonical_alias', RoomCreate = 'm.room.create', @@ -29,6 +37,14 @@ export enum StateEvent { PoniesRoomEmotes = 'im.ponies.room_emotes', } +export enum MessageEvent { + RoomMessage = 'm.room.message', + RoomMessageEncrypted = 'm.room.encrypted', + Sticker = 'm.sticker', + RoomRedaction = 'm.room.redaction', + Reaction = 'm.reaction', +} + export enum RoomType { Space = 'm.space', } @@ -40,6 +56,17 @@ export enum NotificationType { Mute = 'mute', } +export type IRoomCreateContent = { + creator?: string; + ['m.federate']?: boolean; + room_version: string; + type?: string; + predecessor?: { + event_id: string; + room_id: string; + }; +}; + export type RoomToParents = Map>; export type RoomToUnread = Map< string, diff --git a/tsconfig.json b/tsconfig.json index 02eb1843..d2f1e8a1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "sourceMap": true, "jsx": "react", "target": "ES2016", + "module": "ES2020", "allowJs": true, "strict": true, "esModuleInterop": true, diff --git a/vite.config.js b/vite.config.js index f09aa71e..83573398 100644 --- a/vite.config.js +++ b/vite.config.js @@ -13,6 +13,10 @@ const copyFiles = { src: 'node_modules/@matrix-org/olm/olm.wasm', dest: '', }, + { + src: 'node_modules/pdfjs-dist/build/pdf.worker.min.js', + dest: '', + }, { src: '_redirects', dest: '', From f9b895b32c0b42b56966db4e2529a5e219d0eb99 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 15:48:48 +1300 Subject: [PATCH 478/824] Prompt to send command as message (#1435) --- src/app/organisms/room/RoomViewInput.jsx | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index c43eb601..3fb780a4 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -206,28 +206,36 @@ function RoomViewInput({ if (replyTo !== null) setReplyTo(null); }; - const processCommand = (cmdBody) => { + /** Return true if a command was executed. */ + const processCommand = async (cmdBody) => { const spaceIndex = cmdBody.indexOf(' '); const cmdName = cmdBody.slice(1, spaceIndex > -1 ? spaceIndex : undefined); const cmdData = spaceIndex > -1 ? cmdBody.slice(spaceIndex + 1) : ''; if (!commands[cmdName]) { - confirmDialog('Invalid Command', `"${cmdName}" is not a valid command.`, 'Alright'); - return; + const sendAsMessage = await confirmDialog('Invalid Command', `"${cmdName}" is not a valid command. Did you mean to send this as a message?`, 'Send as message'); + if (sendAsMessage) { + sendBody(cmdBody); + return true; + } + return false; } if (['me', 'shrug', 'plain'].includes(cmdName)) { commands[cmdName].exe(roomId, cmdData, sendBody); - return; + return true; } commands[cmdName].exe(roomId, cmdData); + return true; }; const sendMessage = async () => { requestAnimationFrame(() => deactivateCmdAndEmit()); const msgBody = textAreaRef.current.value.trim(); if (msgBody.startsWith('/')) { - processCommand(msgBody.trim()); - textAreaRef.current.value = ''; - textAreaRef.current.style.height = 'unset'; + const executed = await processCommand(msgBody.trim()); + if (executed) { + textAreaRef.current.value = ''; + textAreaRef.current.style.height = 'unset'; + } return; } if (msgBody === '' && attachment === null) return; From 1bdb7f4e3ab71445fb740454f064bc20797dd658 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 7 Oct 2023 18:19:01 +1100 Subject: [PATCH 479/824] Timeline-refactor-fixes (#1438) * fix type * fix missing member from reaction * stop context menu event propagation in msg modal * prevent encode blur hash from freezing app * replace roboto font with inter and fix weight * add recent emoji when selecting emoji * fix room latest evt hook * add option to drop typing status --- package-lock.json | 6 -- package.json | 1 - src/app/components/emoji-board/EmojiBoard.tsx | 6 +- src/app/hooks/useRoomLatestEvent.ts | 29 ---------- src/app/hooks/useRoomLatestRenderedEvent.ts | 57 +++++++++++++++++++ src/app/organisms/room/RoomTimeline.tsx | 2 +- src/app/organisms/room/RoomViewFollowing.tsx | 4 +- src/app/organisms/room/RoomViewTyping.css.ts | 3 + src/app/organisms/room/RoomViewTyping.tsx | 22 ++++++- .../organisms/room/message/FileContent.tsx | 4 +- .../organisms/room/message/ImageContent.tsx | 2 +- src/app/organisms/room/msgContent.ts | 9 ++- .../room/reaction-viewer/ReactionViewer.tsx | 11 ++-- src/client/state/settings.js | 4 ++ src/config.css.ts | 26 +++++++++ src/font.js | 5 -- src/index.jsx | 1 - src/index.scss | 10 ++-- 18 files changed, 138 insertions(+), 64 deletions(-) delete mode 100644 src/app/hooks/useRoomLatestEvent.ts create mode 100644 src/app/hooks/useRoomLatestRenderedEvent.ts create mode 100644 src/config.css.ts delete mode 100644 src/font.js diff --git a/package-lock.json b/package-lock.json index 6f00efe8..6213a1df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", - "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tanstack/react-virtual": "3.0.0-beta.54", @@ -875,11 +874,6 @@ "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", "integrity": "sha512-JDC9AocdPLuGsASkvWw9hS5gtHE7K9dOwL98XLrk5yjYqxy4uVnScG58NUvFMJDVJRl/7c8Wnap6PEs+7Zvj1Q==" }, - "node_modules/@fontsource/roboto": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", - "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", diff --git a/package.json b/package.json index 83850a80..8ee5cc54 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", - "@fontsource/roboto": "4.5.8", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tanstack/react-virtual": "3.0.0-beta.54", diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index a7309834..81730e3d 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -46,6 +46,7 @@ import { editableActiveElement, isIntersectingScrollView, targetFromEvent } from import { useAsyncSearch, UseAsyncSearchOptions } from '../../hooks/useAsyncSearch'; import { useDebounce } from '../../hooks/useDebounce'; import { useThrottle } from '../../hooks/useThrottle'; +import { addRecentEmoji } from '../../plugins/recent-emoji'; const RECENT_GROUP_ID = 'recent_group'; const SEARCH_GROUP_ID = 'search_group'; @@ -697,7 +698,10 @@ export function EmojiBoard({ if (!emojiInfo) return; if (emojiInfo.type === EmojiType.Emoji) { onEmojiSelect?.(emojiInfo.data, emojiInfo.shortcode); - if (!evt.altKey && !evt.shiftKey) requestClose(); + if (!evt.altKey && !evt.shiftKey) { + addRecentEmoji(mx, emojiInfo.data); + requestClose(); + } } if (emojiInfo.type === EmojiType.CustomEmoji) { onCustomEmojiSelect?.(emojiInfo.data, emojiInfo.shortcode); diff --git a/src/app/hooks/useRoomLatestEvent.ts b/src/app/hooks/useRoomLatestEvent.ts deleted file mode 100644 index 337438ce..00000000 --- a/src/app/hooks/useRoomLatestEvent.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { MatrixEvent, Room, RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; -import { useEffect, useState } from 'react'; - -export const useRoomLatestEvent = (room: Room) => { - const [latestEvent, setLatestEvent] = useState(); - - useEffect(() => { - const getLatestEvent = (): MatrixEvent | undefined => { - const liveEvents = room.getLiveTimeline().getEvents(); - for (let i = liveEvents.length - 1; i >= 0; i -= 1) { - const evt = liveEvents[i]; - if (evt) return evt; - } - return undefined; - }; - - const handleTimelineEvent: RoomEventHandlerMap[RoomEvent.Timeline] = () => { - setLatestEvent(getLatestEvent()); - }; - setLatestEvent(getLatestEvent()); - - room.on(RoomEvent.Timeline, handleTimelineEvent); - return () => { - room.removeListener(RoomEvent.Timeline, handleTimelineEvent); - }; - }, [room]); - - return latestEvent; -}; diff --git a/src/app/hooks/useRoomLatestRenderedEvent.ts b/src/app/hooks/useRoomLatestRenderedEvent.ts new file mode 100644 index 00000000..295d1030 --- /dev/null +++ b/src/app/hooks/useRoomLatestRenderedEvent.ts @@ -0,0 +1,57 @@ +/* eslint-disable no-continue */ +import { MatrixEvent, Room, RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; +import { useEffect, useState } from 'react'; +import { settingsAtom } from '../state/settings'; +import { useSetting } from '../state/hooks/settings'; +import { MessageEvent, StateEvent } from '../../types/matrix/room'; + +export const useRoomLatestRenderedEvent = (room: Room) => { + const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); + const [hideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); + const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); + const [latestEvent, setLatestEvent] = useState(); + + useEffect(() => { + const getLatestEvent = (): MatrixEvent | undefined => { + const liveEvents = room.getLiveTimeline().getEvents(); + for (let i = liveEvents.length - 1; i >= 0; i -= 1) { + const evt = liveEvents[i]; + + if (!evt) continue; + if (evt.isRelation()) continue; + if (evt.getType() === StateEvent.RoomMember) { + const membershipChanged = evt.getContent().membership !== evt.getPrevContent().membership; + if (membershipChanged && hideMembershipEvents) continue; + if (!membershipChanged && hideNickAvatarEvents) continue; + return evt; + } + + if ( + evt.getType() === MessageEvent.RoomMessage || + evt.getType() === MessageEvent.RoomMessageEncrypted || + evt.getType() === MessageEvent.Sticker || + evt.getType() === StateEvent.RoomName || + evt.getType() === StateEvent.RoomTopic || + evt.getType() === StateEvent.RoomAvatar + ) { + return evt; + } + + if (showHiddenEvents) return evt; + } + return undefined; + }; + + const handleTimelineEvent: RoomEventHandlerMap[RoomEvent.Timeline] = () => { + setLatestEvent(getLatestEvent()); + }; + setLatestEvent(getLatestEvent()); + + room.on(RoomEvent.Timeline, handleTimelineEvent); + return () => { + room.removeListener(RoomEvent.Timeline, handleTimelineEvent); + }; + }, [room, hideMembershipEvents, hideNickAvatarEvents, showHiddenEvents]); + + return latestEvent; +}; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 03f72a37..b3902d8b 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -167,7 +167,7 @@ export const getFirstLinkedTimeline = ( export const getLinkedTimelines = (timeline: EventTimeline): EventTimeline[] => { const firstTimeline = getFirstLinkedTimeline(timeline, Direction.Backward); - const timelines = []; + const timelines: EventTimeline[] = []; for ( let nextTimeline: EventTimeline | null = firstTimeline; diff --git a/src/app/organisms/room/RoomViewFollowing.tsx b/src/app/organisms/room/RoomViewFollowing.tsx index cd62c429..a49f70d9 100644 --- a/src/app/organisms/room/RoomViewFollowing.tsx +++ b/src/app/organisms/room/RoomViewFollowing.tsx @@ -19,7 +19,7 @@ import { getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; import * as css from './RoomViewFollowing.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; -import { useRoomLatestEvent } from '../../hooks/useRoomLatestEvent'; +import { useRoomLatestRenderedEvent } from '../../hooks/useRoomLatestRenderedEvent'; import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; import { EventReaders } from '../../components/event-readers'; @@ -30,7 +30,7 @@ export const RoomViewFollowing = as<'div', RoomViewFollowingProps>( ({ className, room, ...props }, ref) => { const mx = useMatrixClient(); const [open, setOpen] = useState(false); - const latestEvent = useRoomLatestEvent(room); + const latestEvent = useRoomLatestRenderedEvent(room); const latestEventReaders = useRoomEventReaders(room, latestEvent?.getId()); const followingMembers = latestEventReaders .map((readerId) => room.getMember(readerId)) diff --git a/src/app/organisms/room/RoomViewTyping.css.ts b/src/app/organisms/room/RoomViewTyping.css.ts index ef07316f..9def1aee 100644 --- a/src/app/organisms/room/RoomViewTyping.css.ts +++ b/src/app/organisms/room/RoomViewTyping.css.ts @@ -22,3 +22,6 @@ export const RoomViewTyping = style([ animation: `${SlideUpAnime} 100ms ease-in-out`, }, ]); +export const TypingText = style({ + flexGrow: 1, +}); diff --git a/src/app/organisms/room/RoomViewTyping.tsx b/src/app/organisms/room/RoomViewTyping.tsx index c7c15ea5..c393f3ae 100644 --- a/src/app/organisms/room/RoomViewTyping.tsx +++ b/src/app/organisms/room/RoomViewTyping.tsx @@ -1,8 +1,8 @@ import React, { useMemo } from 'react'; -import { Box, Text, as } from 'folds'; +import { Box, Icon, IconButton, Icons, Text, as } from 'folds'; import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; -import { useAtomValue } from 'jotai'; +import { useAtomValue, useSetAtom } from 'jotai'; import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../../state/typingMembers'; import { TypingIndicator } from '../../components/typing-indicator'; import { getMemberDisplayName } from '../../utils/room'; @@ -15,6 +15,7 @@ export type RoomViewTypingProps = { }; export const RoomViewTyping = as<'div', RoomViewTypingProps>( ({ className, room, ...props }, ref) => { + const setTypingMembers = useSetAtom(roomIdToTypingMembersAtom); const mx = useMatrixClient(); const typingMembers = useAtomValue( useMemo(() => selectRoomTypingMembersAtom(room.roomId, roomIdToTypingMembersAtom), [room]) @@ -29,6 +30,18 @@ export const RoomViewTyping = as<'div', RoomViewTypingProps>( return null; } + const handleDropAll = () => { + // some homeserver does not timeout typing status + // we have given option so user can drop their typing status + typingMembers.forEach((member) => + setTypingMembers({ + type: 'DELETE', + roomId: room.roomId, + member, + }) + ); + }; + return ( ( ref={ref} > - + {typingNames.length === 1 && ( <> {typingNames[0]} @@ -96,6 +109,9 @@ export const RoomViewTyping = as<'div', RoomViewTypingProps>( )} + + + ); } diff --git a/src/app/organisms/room/message/FileContent.tsx b/src/app/organisms/room/message/FileContent.tsx index 8484d849..c6bd45d4 100644 --- a/src/app/organisms/room/message/FileContent.tsx +++ b/src/app/organisms/room/message/FileContent.tsx @@ -94,7 +94,7 @@ function ReadTextFile({ body, mimeType, url, encInfo }: Omit - + evt.stopPropagation()}> - + evt.stopPropagation()}> ( clickOutsideDeactivates: true, }} > - + evt.stopPropagation()}> ( const senderId = mEvent.getSender(); if (!senderId) return null; const member = room.getMember(senderId); - if (!member) return null; - const name = getName(member); + const name = (member ? getName(member) : getMxIdLocalPart(senderId)) ?? senderId; - const avatarUrl = member.getAvatarUrl( + const avatarUrl = member?.getAvatarUrl( mx.baseUrl, 100, 100, @@ -113,12 +112,12 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( return ( { requestClose(); - openProfileViewer(member.userId, room.roomId); + openProfileViewer(senderId, room.roomId); }} before={ @@ -127,7 +126,7 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( ) : ( diff --git a/src/client/state/settings.js b/src/client/state/settings.js index cc1193ce..d39b2ca1 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -4,6 +4,7 @@ import appDispatcher from '../dispatcher'; import cons from './cons'; import { darkTheme, butterTheme, silverTheme } from '../../colors.css'; +import { onLightFontWeight, onDarkFontWeight } from '../../config.css'; function getSettings() { const settings = localStorage.getItem('settings'); @@ -23,6 +24,7 @@ class Settings extends EventEmitter { super(); this.themeClasses = [lightTheme, silverTheme, darkTheme, butterTheme]; + this.fontWeightClasses = [onLightFontWeight, onLightFontWeight, onDarkFontWeight, onDarkFontWeight] this.themes = ['', 'silver-theme', 'dark-theme', 'butter-theme']; this.themeIndex = this.getThemeIndex(); @@ -59,6 +61,7 @@ class Settings extends EventEmitter { this.themes.forEach((themeName, index) => { if (themeName !== '') document.body.classList.remove(themeName); document.body.classList.remove(this.themeClasses[index]); + document.body.classList.remove(this.fontWeightClasses[index]); document.body.classList.remove('prism-light') document.body.classList.remove('prism-dark') }); @@ -71,6 +74,7 @@ class Settings extends EventEmitter { if (this.themes[themeIndex] === undefined) return if (this.themes[themeIndex]) document.body.classList.add(this.themes[themeIndex]); document.body.classList.add(this.themeClasses[themeIndex]); + document.body.classList.add(this.fontWeightClasses[themeIndex]); document.body.classList.add(themeIndex < 2 ? 'prism-light' : 'prism-dark'); } diff --git a/src/config.css.ts b/src/config.css.ts new file mode 100644 index 00000000..df04b909 --- /dev/null +++ b/src/config.css.ts @@ -0,0 +1,26 @@ +import { createTheme } from '@vanilla-extract/css'; +import { config } from 'folds'; + +export const onLightFontWeight = createTheme(config.fontWeight, { + W100: '100', + W200: '200', + W300: '300', + W400: '420', + W500: '500', + W600: '600', + W700: '700', + W800: '800', + W900: '900', +}); + +export const onDarkFontWeight = createTheme(config.fontWeight, { + W100: '100', + W200: '200', + W300: '300', + W400: '350', + W500: '450', + W600: '550', + W700: '650', + W800: '750', + W900: '850', +}); diff --git a/src/font.js b/src/font.js deleted file mode 100644 index 94b1f478..00000000 --- a/src/font.js +++ /dev/null @@ -1,5 +0,0 @@ -import '@fontsource/roboto/300.css'; -import '@fontsource/roboto/400.css'; -import '@fontsource/roboto/500.css'; -import '@fontsource/roboto/700.css'; -import '@fontsource/inter/variable.css'; diff --git a/src/index.jsx b/src/index.jsx index e7256e25..a8a76570 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -8,7 +8,6 @@ import { configClass, varsClass } from 'folds'; enableMapSet(); -import './font'; import './index.scss'; import settings from './client/state/settings'; diff --git a/src/index.scss b/src/index.scss index 04125a1c..90ce60a8 100644 --- a/src/index.scss +++ b/src/index.scss @@ -158,7 +158,7 @@ /* font-weight */ --fw-light: 300; - --fw-normal: 400; + --fw-normal: 420; --fw-medium: 500; --fw-bold: 700; @@ -193,8 +193,8 @@ --fluid-slide-up: cubic-bezier(0.13, 0.56, 0.25, 0.99); --font-emoji: 'Twemoji'; - --font-primary: 'Roboto', var(--font-emoji), sans-serif; - --font-secondary: 'Roboto', var(--font-emoji), sans-serif; + --font-primary: 'InterVariable', var(--font-emoji), sans-serif; + --font-secondary: 'InterVariable', var(--font-emoji), sans-serif; } .silver-theme { @@ -291,8 +291,10 @@ /* override normal font weight for dark mode */ --fw-normal: 350; + --fw-medium: 450; + --fw-bold: 550; - --font-secondary: 'InterVariable', 'Roboto', var(--font-emoji), sans-serif; + --font-secondary: 'InterVariable', var(--font-emoji), sans-serif; } .butter-theme { From 13573f4b3f562d785a498af162a181267150133e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 7 Oct 2023 20:21:35 +1100 Subject: [PATCH 480/824] Fix space mention (#1439) * open space on space mention click * fix styles * fix message options sticks * revert last changes --- src/app/organisms/room/RoomTimeline.tsx | 10 ++++++++-- src/app/organisms/room/RoomViewTyping.css.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index b3902d8b..c41bfbb8 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -86,7 +86,12 @@ import { } from '../../utils/room'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; -import { openJoinAlias, openProfileViewer, selectRoom } from '../../../client/action/navigation'; +import { + openJoinAlias, + openProfileViewer, + selectRoom, + selectSpace, +} from '../../../client/action/navigation'; import { useForceUpdate } from '../../hooks/useForceUpdate'; import { parseGeoUri, scaleYDimension } from '../../utils/common'; import { useMatrixEventRenderer } from '../../hooks/useMatrixEventRenderer'; @@ -536,7 +541,8 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli return; } if (isRoomId(mentionId) && mx.getRoom(mentionId)) { - selectRoom(mentionId); + if (mx.getRoom(mentionId)?.isSpaceRoom()) selectSpace(mentionId); + else selectRoom(mentionId); return; } openJoinAlias(mentionId); diff --git a/src/app/organisms/room/RoomViewTyping.css.ts b/src/app/organisms/room/RoomViewTyping.css.ts index 9def1aee..5c90a178 100644 --- a/src/app/organisms/room/RoomViewTyping.css.ts +++ b/src/app/organisms/room/RoomViewTyping.css.ts @@ -13,7 +13,7 @@ const SlideUpAnime = keyframes({ export const RoomViewTyping = style([ DefaultReset, { - padding: `${config.space.S100} ${config.space.S500}`, + padding: `0 ${config.space.S500}`, width: '100%', backgroundColor: color.Surface.Container, color: color.Surface.OnContainer, From bffd27ae5b6a99ea13823cbe7181e38dc9d44b45 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 Oct 2023 00:09:43 +1100 Subject: [PATCH 481/824] Fix-jump-latest-senstivity (#1440) * fix jump to latest sensitivity * select mention space as tab --- src/app/hooks/useVirtualPaginator.ts | 2 +- src/app/organisms/room/RoomTimeline.tsx | 33 ++++++++++++++----------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/app/hooks/useVirtualPaginator.ts b/src/app/hooks/useVirtualPaginator.ts index 550e11c0..9ffc7f91 100644 --- a/src/app/hooks/useVirtualPaginator.ts +++ b/src/app/hooks/useVirtualPaginator.ts @@ -319,7 +319,7 @@ export const useVirtualPaginator = ( const intersectionObserver = useIntersectionObserver( handlePaginatorElIntersection, - useMemo( + useCallback( () => ({ root: getScrollElement(), }), diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index c41bfbb8..96555f3d 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -90,7 +90,7 @@ import { openJoinAlias, openProfileViewer, selectRoom, - selectSpace, + selectTab, } from '../../../client/action/navigation'; import { useForceUpdate } from '../../hooks/useForceUpdate'; import { parseGeoUri, scaleYDimension } from '../../utils/common'; @@ -115,7 +115,6 @@ import { useMemberEventParser } from '../../hooks/useMemberEventParser'; import * as customHtmlCss from '../../styles/CustomHtml.css'; import { RoomIntro } from '../../components/room-intro'; import { - OnIntersectionCallback, getIntersectionObserverEntry, useIntersectionObserver, } from '../../hooks/useIntersectionObserver'; @@ -541,7 +540,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli return; } if (isRoomId(mentionId) && mx.getRoom(mentionId)) { - if (mx.getRoom(mentionId)?.isSpaceRoom()) selectSpace(mentionId); + if (mx.getRoom(mentionId)?.isSpaceRoom()) selectTab(mentionId); else selectRoom(mentionId); return; } @@ -674,18 +673,24 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli useCallback(() => roomInputRef.current, [roomInputRef]) ); - const handleAtBottomIntersection: OnIntersectionCallback = useCallback((entries) => { - const target = atBottomAnchorRef.current; - if (!target) return; - const targetEntry = getIntersectionObserverEntry(target, entries); - - setAtBottom(targetEntry?.isIntersecting === true); - }, []); + const debounceSetAtBottom = useDebounce( + useCallback((entry: IntersectionObserverEntry) => { + if (!entry.isIntersecting) setAtBottom(false); + }, []), + { wait: 1000 } + ); useIntersectionObserver( - useDebounce(handleAtBottomIntersection, { - wait: 200, - }), - useMemo( + useCallback( + (entries) => { + const target = atBottomAnchorRef.current; + if (!target) return; + const targetEntry = getIntersectionObserverEntry(target, entries); + if (targetEntry) debounceSetAtBottom(targetEntry); + if (targetEntry?.isIntersecting) setAtBottom(true); + }, + [debounceSetAtBottom] + ), + useCallback( () => ({ root: getScrollElement(), rootMargin: '100px', From 60b5b5d312e9e82bdd5480424686f78cfd02d293 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 Oct 2023 16:35:16 +1100 Subject: [PATCH 482/824] consider membership change with reason change (#1441) --- src/app/hooks/useMemberEventParser.tsx | 3 ++- src/app/hooks/useRoomLatestRenderedEvent.ts | 3 ++- src/app/organisms/room/RoomTimeline.tsx | 4 ++-- src/app/utils/room.ts | 4 ++++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/app/hooks/useMemberEventParser.tsx b/src/app/hooks/useMemberEventParser.tsx index ecb6f66b..367e76d9 100644 --- a/src/app/hooks/useMemberEventParser.tsx +++ b/src/app/hooks/useMemberEventParser.tsx @@ -3,6 +3,7 @@ import { IconSrc, Icons } from 'folds'; import { MatrixEvent } from 'matrix-js-sdk'; import { IMemberContent, Membership } from '../../types/matrix/room'; import { getMxIdLocalPart } from '../utils/matrix'; +import { isMembershipChanged } from '../utils/room'; export type ParsedResult = { icon: IconSrc; @@ -27,7 +28,7 @@ export const useMemberEventParser = (): MemberEventParser => { const senderName = getMxIdLocalPart(senderId); const userName = content.displayname || getMxIdLocalPart(userId); - if (content.membership !== prevContent.membership) { + if (isMembershipChanged(mEvent)) { if (content.membership === Membership.Invite) { if (prevContent.membership === Membership.Knock) { return { diff --git a/src/app/hooks/useRoomLatestRenderedEvent.ts b/src/app/hooks/useRoomLatestRenderedEvent.ts index 295d1030..428e7b52 100644 --- a/src/app/hooks/useRoomLatestRenderedEvent.ts +++ b/src/app/hooks/useRoomLatestRenderedEvent.ts @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { settingsAtom } from '../state/settings'; import { useSetting } from '../state/hooks/settings'; import { MessageEvent, StateEvent } from '../../types/matrix/room'; +import { isMembershipChanged } from '../utils/room'; export const useRoomLatestRenderedEvent = (room: Room) => { const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); @@ -20,7 +21,7 @@ export const useRoomLatestRenderedEvent = (room: Room) => { if (!evt) continue; if (evt.isRelation()) continue; if (evt.getType() === StateEvent.RoomMember) { - const membershipChanged = evt.getContent().membership !== evt.getPrevContent().membership; + const membershipChanged = isMembershipChanged(evt); if (membershipChanged && hideMembershipEvents) continue; if (!membershipChanged && hideNickAvatarEvents) continue; return evt; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 96555f3d..03744c33 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -83,6 +83,7 @@ import { decryptAllTimelineEvent, getMemberDisplayName, getReactionContent, + isMembershipChanged, } from '../../utils/room'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; @@ -1311,8 +1312,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli ); }, renderRoomMember: (mEventId, mEvent, item) => { - const membershipChanged = - mEvent.getContent().membership !== mEvent.getPrevContent().membership; + const membershipChanged = isMembershipChanged(mEvent); if (membershipChanged && hideMembershipEvents) return null; if (!membershipChanged && hideNickAvatarEvents) return null; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index f8637833..af9505d4 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -278,6 +278,10 @@ export const getMemberAvatarMxc = (room: Room, userId: string): string | undefin return member?.getMxcAvatarUrl(); }; +export const isMembershipChanged = (mEvent: MatrixEvent): boolean => + mEvent.getContent().membership !== mEvent.getPrevContent().membership || + mEvent.getContent().reason !== mEvent.getPrevContent().reason; + export const decryptAllTimelineEvent = async (mx: MatrixClient, timeline: EventTimeline) => { const crypto = mx.getCrypto(); if (!crypto) return; From 5940cf24a0ed86149202496bba4a23ad923134f2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 9 Oct 2023 22:26:54 +1100 Subject: [PATCH 483/824] Inline markdown in editor (#1442) * add inline markdown in editor * send markdown re-generative data in tags * enable vscode format on save * fix match italic and diff order * prevent formatting in code block * make code md rule highest * improve inline markdown parsing * add comment * improve code logic --- src/app/components/editor/output.ts | 43 ++++-- src/app/organisms/room/RoomInput.tsx | 10 +- src/app/organisms/settings/Settings.jsx | 11 +- src/app/utils/markdown.ts | 191 ++++++++++++++++++++++++ 4 files changed, 237 insertions(+), 18 deletions(-) create mode 100644 src/app/utils/markdown.ts diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 5d0443fa..92c86dd8 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -2,15 +2,28 @@ import { Descendant, Text } from 'slate'; import { sanitizeText } from '../../utils/sanitize'; import { BlockType } from './Elements'; import { CustomElement, FormattedText } from './slate'; +import { parseInlineMD } from '../../utils/markdown'; -const textToCustomHtml = (node: FormattedText): string => { +export type OutputOptions = { + allowTextFormatting?: boolean; + allowMarkdown?: boolean; +}; + +const textToCustomHtml = (node: FormattedText, opts: OutputOptions): string => { let string = sanitizeText(node.text); - if (node.bold) string = `${string}`; - if (node.italic) string = `${string}`; - if (node.underline) string = `${string}`; - if (node.strikeThrough) string = `${string}`; - if (node.code) string = `${string}`; - if (node.spoiler) string = `${string}`; + if (opts.allowTextFormatting) { + if (node.bold) string = `${string}`; + if (node.italic) string = `${string}`; + if (node.underline) string = `${string}`; + if (node.strikeThrough) string = `${string}`; + if (node.code) string = `${string}`; + if (node.spoiler) string = `${string}`; + } + + if (opts.allowMarkdown && string === sanitizeText(node.text)) { + string = parseInlineMD(string); + } + return string; }; @@ -47,11 +60,19 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { } }; -export const toMatrixCustomHTML = (node: Descendant | Descendant[]): string => { - if (Array.isArray(node)) return node.map((n) => toMatrixCustomHTML(n)).join(''); - if (Text.isText(node)) return textToCustomHtml(node); +export const toMatrixCustomHTML = ( + node: Descendant | Descendant[], + opts: OutputOptions +): string => { + const parseNode = (n: Descendant) => { + const isCodeLine = 'type' in n && n.type === BlockType.CodeLine; + if (isCodeLine) return toMatrixCustomHTML(n, {}); + return toMatrixCustomHTML(n, opts); + }; + if (Array.isArray(node)) return node.map(parseNode).join(''); + if (Text.isText(node)) return textToCustomHtml(node, opts); - const children = node.children.map((n) => toMatrixCustomHTML(n)).join(''); + const children = node.children.map(parseNode).join(''); return elementToCustomHtml(node, children); }; diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index efef03a2..7564d5f4 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -108,6 +108,7 @@ export const RoomInput = forwardRef( ({ editor, roomViewRef, roomId }, ref) => { const mx = useMatrixClient(); const room = mx.getRoom(roomId); + const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(roomId)); const [replyDraft, setReplyDraft] = useAtom(roomIdToReplyDraftAtomFamily(roomId)); @@ -251,7 +252,12 @@ export const RoomInput = forwardRef( uploadBoardHandlers.current?.handleSend(); const plainText = toPlainText(editor.children).trim(); - const customHtml = trimCustomHtml(toMatrixCustomHTML(editor.children)); + const customHtml = trimCustomHtml( + toMatrixCustomHTML(editor.children, { + allowTextFormatting: true, + allowMarkdown: isMarkdown, + }) + ); if (plainText === '') return; @@ -288,7 +294,7 @@ export const RoomInput = forwardRef( resetEditorHistory(editor); setReplyDraft(); sendTypingStatus(false); - }, [mx, roomId, editor, replyDraft, sendTypingStatus, setReplyDraft]); + }, [mx, roomId, editor, replyDraft, sendTypingStatus, setReplyDraft, isMarkdown]); const handleKeyDown: KeyboardEventHandler = useCallback( (evt) => { diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index fef15867..bd9ce044 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -6,7 +6,7 @@ import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; import navigation from '../../../client/state/navigation'; import { - toggleSystemTheme, toggleMarkdown, + toggleSystemTheme, toggleNotifications, toggleNotificationSounds, } from '../../../client/action/settings'; import { usePermission } from '../../hooks/usePermission'; @@ -52,6 +52,7 @@ function AppearanceSection() { const [messageLayout, setMessageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing, setMessageSpacing] = useSetting(settingsAtom, 'messageSpacing'); const [useSystemEmoji, setUseSystemEmoji] = useSetting(settingsAtom, 'useSystemEmoji'); + const [isMarkdown, setIsMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const [hideMembershipEvents, setHideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); const [mediaAutoLoad, setMediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); @@ -138,14 +139,14 @@ function AppearanceSection() { } /> { toggleMarkdown(); updateState({}); }} + isActive={isMarkdown} + onToggle={() => setIsMarkdown(!isMarkdown) } /> )} - content={Format messages with markdown syntax before sending.} + content={Format messages with inline markdown syntax before sending.} /> string; +export type MatchResult = RegExpMatchArray | RegExpExecArray; +export type RuleMatch = (text: string) => MatchResult | null; +export type MatchConverter = (parse: PlainMDParser, match: MatchResult) => string; + +export type MDRule = { + match: RuleMatch; + html: MatchConverter; +}; + +export type MatchReplacer = ( + parse: PlainMDParser, + text: string, + match: MatchResult, + content: string +) => string; + +export type RuleRunner = (parse: PlainMDParser, text: string, rule: MDRule) => string | undefined; +export type RulesRunner = ( + parse: PlainMDParser, + text: string, + rules: MDRule[] +) => string | undefined; + +const MIN_ANY = '(.+?)'; + +const BOLD_MD_1 = '**'; +const BOLD_PREFIX_1 = '\\*{2}'; +const BOLD_NEG_LA_1 = '(?!\\*)'; +const BOLD_REG_1 = new RegExp(`${BOLD_PREFIX_1}${MIN_ANY}${BOLD_PREFIX_1}${BOLD_NEG_LA_1}`); +const BoldRule: MDRule = { + match: (text) => text.match(BOLD_REG_1), + html: (parse, match) => { + const [, g1] = match; + const child = parse(g1); + return `${child}`; + }, +}; + +const ITALIC_MD_1 = '*'; +const ITALIC_PREFIX_1 = '\\*'; +const ITALIC_NEG_LA_1 = '(?!\\*)'; +const ITALIC_REG_1 = new RegExp(`${ITALIC_PREFIX_1}${MIN_ANY}${ITALIC_PREFIX_1}${ITALIC_NEG_LA_1}`); +const ItalicRule1: MDRule = { + match: (text) => text.match(ITALIC_REG_1), + html: (parse, match) => { + const [, g1] = match; + return `${parse(g1)}`; + }, +}; + +const ITALIC_MD_2 = '_'; +const ITALIC_PREFIX_2 = '_'; +const ITALIC_NEG_LA_2 = '(?!_)'; +const ITALIC_REG_2 = new RegExp(`${ITALIC_PREFIX_2}${MIN_ANY}${ITALIC_PREFIX_2}${ITALIC_NEG_LA_2}`); +const ItalicRule2: MDRule = { + match: (text) => text.match(ITALIC_REG_2), + html: (parse, match) => { + const [, g1] = match; + return `${parse(g1)}`; + }, +}; + +const UNDERLINE_MD_1 = '__'; +const UNDERLINE_PREFIX_1 = '_{2}'; +const UNDERLINE_NEG_LA_1 = '(?!_)'; +const UNDERLINE_REG_1 = new RegExp( + `${UNDERLINE_PREFIX_1}${MIN_ANY}${UNDERLINE_PREFIX_1}${UNDERLINE_NEG_LA_1}` +); +const UnderlineRule: MDRule = { + match: (text) => text.match(UNDERLINE_REG_1), + html: (parse, match) => { + const [, g1] = match; + return `${parse(g1)}`; + }, +}; + +const STRIKE_MD_1 = '~~'; +const STRIKE_PREFIX_1 = '~{2}'; +const STRIKE_NEG_LA_1 = '(?!~)'; +const STRIKE_REG_1 = new RegExp(`${STRIKE_PREFIX_1}${MIN_ANY}${STRIKE_PREFIX_1}${STRIKE_NEG_LA_1}`); +const StrikeRule: MDRule = { + match: (text) => text.match(STRIKE_REG_1), + html: (parse, match) => { + const [, g1] = match; + return `${parse(g1)}`; + }, +}; + +const CODE_MD_1 = '`'; +const CODE_PREFIX_1 = '`'; +const CODE_NEG_LA_1 = '(?!`)'; +const CODE_REG_1 = new RegExp(`${CODE_PREFIX_1}${MIN_ANY}${CODE_PREFIX_1}${CODE_NEG_LA_1}`); +const CodeRule: MDRule = { + match: (text) => text.match(CODE_REG_1), + html: (parse, match) => { + const [, g1] = match; + return `${g1}`; + }, +}; + +const SPOILER_MD_1 = '||'; +const SPOILER_PREFIX_1 = '\\|{2}'; +const SPOILER_NEG_LA_1 = '(?!\\|)'; +const SPOILER_REG_1 = new RegExp( + `${SPOILER_PREFIX_1}${MIN_ANY}${SPOILER_PREFIX_1}${SPOILER_NEG_LA_1}` +); +const SpoilerRule: MDRule = { + match: (text) => text.match(SPOILER_REG_1), + html: (parse, match) => { + const [, g1] = match; + return `${parse(g1)}`; + }, +}; + +const LINK_ALT = `\\[${MIN_ANY}\\]`; +const LINK_URL = `\\((https?:\\/\\/.+?)\\)`; +const LINK_REG_1 = new RegExp(`${LINK_ALT}${LINK_URL}`); +const LinkRule: MDRule = { + match: (text) => text.match(LINK_REG_1), + html: (parse, match) => { + const [, g1, g2] = match; + return `${parse(g1)}`; + }, +}; + +const beforeMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => + text.slice(0, match.index); +const afterMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => + text.slice((match.index ?? 0) + match[0].length); + +const replaceMatch: MatchReplacer = (parse, text, match, content) => + `${parse(beforeMatch(text, match))}${content}${parse(afterMatch(text, match))}`; + +const runRule: RuleRunner = (parse, text, rule) => { + const matchResult = rule.match(text); + if (matchResult) { + const content = rule.html(parse, matchResult); + return replaceMatch(parse, text, matchResult, content); + } + return undefined; +}; + +/** + * Runs multiple rules at the same time to better handle nested rules. + * Rules will be run in the order they appear. + */ +const runRules: RulesRunner = (parse, text, rules) => { + const matchResults = rules.map((rule) => rule.match(text)); + + let targetRule: MDRule | undefined; + let targetResult: MatchResult | undefined; + + for (let i = 0; i < matchResults.length; i += 1) { + const currentResult = matchResults[i]; + if (currentResult && typeof currentResult.index === 'number') { + if ( + !targetResult || + (typeof targetResult?.index === 'number' && currentResult.index < targetResult.index) + ) { + targetResult = currentResult; + targetRule = rules[i]; + } + } + } + + if (targetRule && targetResult) { + const content = targetRule.html(parse, targetResult); + return replaceMatch(parse, text, targetResult, content); + } + return undefined; +}; + +const LeveledRules = [ + BoldRule, + ItalicRule1, + UnderlineRule, + ItalicRule2, + StrikeRule, + SpoilerRule, + LinkRule, +]; + +export const parseInlineMD = (text: string): string => { + let result: string | undefined; + if (!result) result = runRule(parseInlineMD, text, CodeRule); + + if (!result) result = runRules(parseInlineMD, text, LeveledRules); + + return result ?? text; +}; From d0f2a865bc57e7d41cce99acb2ad47b226983e8b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 10 Oct 2023 17:07:03 +1100 Subject: [PATCH 484/824] make file, image viewer wide (#1444) --- src/app/organisms/room/message/FileContent.tsx | 13 +++++++++++-- src/app/organisms/room/message/ImageContent.tsx | 6 +++++- src/app/organisms/room/message/styles.css.ts | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/app/organisms/room/message/FileContent.tsx b/src/app/organisms/room/message/FileContent.tsx index c6bd45d4..303c4534 100644 --- a/src/app/organisms/room/message/FileContent.tsx +++ b/src/app/organisms/room/message/FileContent.tsx @@ -25,6 +25,7 @@ import { bytesToSize } from '../../../utils/common'; import { TextViewer } from '../../../components/text-viewer'; import { READABLE_TEXT_MIME_TYPES } from '../../../utils/mimeTypes'; import { PdfViewer } from '../../../components/Pdf-viewer'; +import * as css from './styles.css'; export type FileContentProps = { body: string; @@ -94,7 +95,11 @@ function ReadTextFile({ body, mimeType, url, encInfo }: Omit - evt.stopPropagation()}> + evt.stopPropagation()} + > - evt.stopPropagation()}> + evt.stopPropagation()} + > ( clickOutsideDeactivates: true, }} > - evt.stopPropagation()}> + evt.stopPropagation()} + > Date: Tue, 10 Oct 2023 17:07:15 +1100 Subject: [PATCH 485/824] show missing member in read receipt (#1445) --- .../components/event-readers/EventReaders.tsx | 30 +++++++------------ src/app/organisms/room/RoomViewFollowing.tsx | 14 ++++----- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/app/components/event-readers/EventReaders.tsx b/src/app/components/event-readers/EventReaders.tsx index c05efc50..a5a2646f 100644 --- a/src/app/components/event-readers/EventReaders.tsx +++ b/src/app/components/event-readers/EventReaders.tsx @@ -15,7 +15,7 @@ import { as, config, } from 'folds'; -import { Room, RoomMember } from 'matrix-js-sdk'; +import { Room } from 'matrix-js-sdk'; import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; import { getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; @@ -33,12 +33,9 @@ export const EventReaders = as<'div', EventReadersProps>( ({ className, room, eventId, requestClose, ...props }, ref) => { const mx = useMatrixClient(); const latestEventReaders = useRoomEventReaders(room, eventId); - const followingMembers = latestEventReaders - .map((readerId) => room.getMember(readerId)) - .filter((member) => member) as RoomMember[]; - const getName = (member: RoomMember) => - getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) ?? member.userId; + const getName = (userId: string) => + getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId; return ( ( - {followingMembers.map((member) => { - const name = getName(member); - const avatarUrl = member.getAvatarUrl( - mx.baseUrl, - 100, - 100, - 'crop', - undefined, - false - ); + {latestEventReaders.map((readerId) => { + const name = getName(readerId); + const avatarUrl = room + .getMember(readerId) + ?.getAvatarUrl(mx.baseUrl, 100, 100, 'crop', undefined, false); return ( { requestClose(); - openProfileViewer(member.userId, room.roomId); + openProfileViewer(readerId, room.roomId); }} before={ @@ -85,7 +77,7 @@ export const EventReaders = as<'div', EventReadersProps>( ) : ( diff --git a/src/app/organisms/room/RoomViewFollowing.tsx b/src/app/organisms/room/RoomViewFollowing.tsx index a49f70d9..2f7a583e 100644 --- a/src/app/organisms/room/RoomViewFollowing.tsx +++ b/src/app/organisms/room/RoomViewFollowing.tsx @@ -11,7 +11,7 @@ import { as, config, } from 'folds'; -import { Room, RoomMember } from 'matrix-js-sdk'; +import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; import FocusTrap from 'focus-trap-react'; @@ -32,13 +32,11 @@ export const RoomViewFollowing = as<'div', RoomViewFollowingProps>( const [open, setOpen] = useState(false); const latestEvent = useRoomLatestRenderedEvent(room); const latestEventReaders = useRoomEventReaders(room, latestEvent?.getId()); - const followingMembers = latestEventReaders - .map((readerId) => room.getMember(readerId)) - .filter((member) => member && member.userId !== mx.getUserId()) as RoomMember[]; - - const names = followingMembers.map( - (member) => getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) - ); + const names = latestEventReaders + .filter((readerId) => readerId !== mx.getUserId()) + .map( + (readerId) => getMemberDisplayName(room, readerId) ?? getMxIdLocalPart(readerId) ?? readerId + ); const eventId = latestEvent?.getId(); From 152576e85d46dd9d47296dc2e61491fe24bc735e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 10 Oct 2023 17:07:28 +1100 Subject: [PATCH 486/824] Render file as readable with ext (#1446) --- src/app/components/text-viewer/TextViewer.tsx | 10 ++--- .../organisms/room/message/FileContent.tsx | 16 ++++++-- src/app/organisms/room/message/Message.tsx | 2 +- src/app/utils/mimeTypes.ts | 41 +++++++++++++++++++ 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/app/components/text-viewer/TextViewer.tsx b/src/app/components/text-viewer/TextViewer.tsx index 37642dbf..7829fb35 100644 --- a/src/app/components/text-viewer/TextViewer.tsx +++ b/src/app/components/text-viewer/TextViewer.tsx @@ -4,7 +4,6 @@ import classNames from 'classnames'; import { Box, Chip, Header, Icon, IconButton, Icons, Scroll, Text, as } from 'folds'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from './TextViewer.css'; -import { mimeTypeToExt } from '../../utils/mimeTypes'; import { copyToClipboard } from '../../utils/dom'; const ReactPrism = lazy(() => import('../../plugins/react-prism/ReactPrism')); @@ -12,12 +11,12 @@ const ReactPrism = lazy(() => import('../../plugins/react-prism/ReactPrism')); export type TextViewerProps = { name: string; text: string; - mimeType: string; + langName: string; requestClose: () => void; }; export const TextViewer = as<'div', TextViewerProps>( - ({ className, name, text, mimeType, requestClose, ...props }, ref) => { + ({ className, name, text, langName, requestClose, ...props }, ref) => { const handleCopy = () => { copyToClipboard(text); }; @@ -51,10 +50,7 @@ export const TextViewer = as<'div', TextViewerProps>( alignItems="Center" > - + {text}}> {text}}> {(codeRef) => {text}} diff --git a/src/app/organisms/room/message/FileContent.tsx b/src/app/organisms/room/message/FileContent.tsx index 303c4534..9c659667 100644 --- a/src/app/organisms/room/message/FileContent.tsx +++ b/src/app/organisms/room/message/FileContent.tsx @@ -23,7 +23,12 @@ import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { getFileSrcUrl, getSrcFile } from './util'; import { bytesToSize } from '../../../utils/common'; import { TextViewer } from '../../../components/text-viewer'; -import { READABLE_TEXT_MIME_TYPES } from '../../../utils/mimeTypes'; +import { + READABLE_EXT_TO_MIME_TYPE, + READABLE_TEXT_MIME_TYPES, + getFileNameExt, + mimeTypeToExt, +} from '../../../utils/mimeTypes'; import { PdfViewer } from '../../../components/Pdf-viewer'; import * as css from './styles.css'; @@ -103,7 +108,11 @@ function ReadTextFile({ body, mimeType, url, encInfo }: Omit setTextViewer(false)} /> @@ -247,7 +256,8 @@ function DownloadFile({ body, mimeType, url, info, encInfo }: FileContentProps) export const FileContent = as<'div', FileContentProps>( ({ body, mimeType, url, info, encInfo, ...props }, ref) => ( - {READABLE_TEXT_MIME_TYPES.includes(mimeType) && ( + {(READABLE_TEXT_MIME_TYPES.includes(mimeType) || + READABLE_EXT_TO_MIME_TYPE[getFileNameExt(body)]) && ( )} {mimeType === 'application/pdf' && ( diff --git a/src/app/organisms/room/message/Message.tsx b/src/app/organisms/room/message/Message.tsx index 8f25861e..13e43260 100644 --- a/src/app/organisms/room/message/Message.tsx +++ b/src/app/organisms/room/message/Message.tsx @@ -246,7 +246,7 @@ export const MessageSourceCodeItem = as< diff --git a/src/app/utils/mimeTypes.ts b/src/app/utils/mimeTypes.ts index c883ddb9..2a923677 100644 --- a/src/app/utils/mimeTypes.ts +++ b/src/app/utils/mimeTypes.ts @@ -57,6 +57,43 @@ export const READABLE_TEXT_MIME_TYPES = [ ...TEXT_MIME_TYPE, ]; +export const READABLE_EXT_TO_MIME_TYPE: Record = { + go: 'text/go', + rs: 'text/rust', + py: 'text/python', + swift: 'text/swift', + c: 'text/c', + cpp: 'text/cpp', + java: 'text/java', + kt: 'text/kotlin', + lua: 'text/lua', + php: 'text/php', + ts: 'text/typescript', + js: 'text/javascript', + jsx: 'text/jsx', + tsx: 'text/tsx', + html: 'text/html', + xhtml: 'text/xhtml', + xht: 'text/xhtml', + css: 'text/css', + scss: 'text/scss', + sass: 'text/sass', + json: 'text/json', + md: 'text/markdown', + yaml: 'text/yaml', + yni: 'text/yni', + xml: 'text/xml', + txt: 'text/plain', + text: 'text/plain', + conf: 'text/conf', + cfg: 'text/conf', + cnf: 'text/conf', + log: 'text/log', + me: 'text/me', + cvs: 'text/cvs', + tvs: 'text/tvs', +}; + export const ALLOWED_BLOB_MIME_TYPES = [ ...IMAGE_MIME_TYPES, ...VIDEO_MIME_TYPES, @@ -92,3 +129,7 @@ export const mimeTypeToExt = (mimeType: string): string => { const extStart = mimeType.lastIndexOf('/') + 1; return mimeType.slice(extStart); }; +export const getFileNameExt = (fileName: string): string => { + const extStart = fileName.lastIndexOf('.') + 1; + return fileName.slice(extStart); +}; From f5bcc9b851dc7799c56449d4bd90bbe7c68733a7 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 14 Oct 2023 16:08:43 +1100 Subject: [PATCH 487/824] Edit option (#1447) * add func to parse html to editor input * add plain to html input function * re-construct markdown * fix missing return * fix falsy condition * fix reading href instead of src of emoji * add message editor - WIP * fix plain to editor input func * add save edit message functionality * show edited event source code * focus message input on after editing message * use del tag for strike-through instead of s * prevent autocomplete from re-opening after esc * scroll out of view msg editor in view * handle up arrow edit * handle scroll to message editor without effect * revert prev commit: effect run after editor render * ignore relation event from editable * allow data-md tag for del and em in sanitize html * prevent edit without changes * ignore previous reply when replying to msg * fix up arrow edit not working sometime --- package-lock.json | 2 + package.json | 2 + src/app/components/editor/Editor.tsx | 5 +- src/app/components/editor/common.ts | 9 + src/app/components/editor/index.ts | 1 + src/app/components/editor/input.ts | 327 ++++++++++++++++++ src/app/components/editor/output.ts | 8 +- src/app/components/editor/slate.d.ts | 19 +- src/app/organisms/room/RoomInput.tsx | 53 ++- src/app/organisms/room/RoomTimeline.tsx | 134 ++++--- src/app/organisms/room/message/Message.tsx | 104 +++++- .../organisms/room/message/MessageEditor.tsx | 295 ++++++++++++++++ src/app/organisms/room/message/Reactions.tsx | 9 +- src/app/utils/dom.ts | 6 +- src/app/utils/markdown.ts | 2 +- src/app/utils/matrix.ts | 9 + src/app/utils/room.ts | 69 ++++ src/app/utils/sanitize.ts | 11 +- 18 files changed, 957 insertions(+), 108 deletions(-) create mode 100644 src/app/components/editor/input.ts create mode 100644 src/app/organisms/room/message/MessageEditor.tsx diff --git a/package-lock.json b/package-lock.json index 6213a1df..70c90a9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "classnames": "2.3.2", "dateformat": "5.0.3", "dayjs": "1.11.10", + "domhandler": "5.0.3", "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", @@ -30,6 +31,7 @@ "focus-trap-react": "10.0.2", "folds": "1.5.0", "formik": "2.2.9", + "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", diff --git a/package.json b/package.json index 8ee5cc54..7467126e 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "classnames": "2.3.2", "dateformat": "5.0.3", "dayjs": "1.11.10", + "domhandler": "5.0.3", "emojibase": "6.1.0", "emojibase-data": "7.0.1", "file-saver": "2.0.5", @@ -40,6 +41,7 @@ "focus-trap-react": "10.0.2", "folds": "1.5.0", "formik": "2.2.9", + "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index e5377f2f..62b41345 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -50,12 +50,13 @@ const withVoid = (editor: Editor): Editor => { }; export const useEditor = (): Editor => { - const [editor] = useState(withInline(withVoid(withReact(withHistory(createEditor()))))); + const [editor] = useState(() => withInline(withVoid(withReact(withHistory(createEditor()))))); return editor; }; export type EditorChangeHandler = (value: Descendant[]) => void; type CustomEditorProps = { + editableName?: string; top?: ReactNode; bottom?: ReactNode; before?: ReactNode; @@ -71,6 +72,7 @@ type CustomEditorProps = { export const CustomEditor = forwardRef( ( { + editableName, top, bottom, before, @@ -137,6 +139,7 @@ export const CustomEditor = forwardRef( hideTrack > { }); return worldStartPoint && Editor.range(editor, worldStartPoint, cursorPoint); }; + +export const isEmptyEditor = (editor: Editor): boolean => { + const firstChildren = editor.children[0]; + if (firstChildren && Element.isElement(firstChildren)) { + const isEmpty = editor.children.length === 1 && Editor.isEmpty(editor, firstChildren); + return isEmpty; + } + return false; +}; diff --git a/src/app/components/editor/index.ts b/src/app/components/editor/index.ts index 76ccf562..7c63ce61 100644 --- a/src/app/components/editor/index.ts +++ b/src/app/components/editor/index.ts @@ -5,3 +5,4 @@ export * from './Elements'; export * from './keyboard'; export * from './output'; export * from './Toolbar'; +export * from './input'; diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts new file mode 100644 index 00000000..39db0e1b --- /dev/null +++ b/src/app/components/editor/input.ts @@ -0,0 +1,327 @@ +/* eslint-disable no-param-reassign */ +import { Descendant, Text } from 'slate'; +import parse from 'html-dom-parser'; +import { ChildNode, Element, isText, isTag } from 'domhandler'; + +import { sanitizeCustomHtml } from '../../utils/sanitize'; +import { BlockType, MarkType } from './Elements'; +import { + BlockQuoteElement, + CodeBlockElement, + CodeLineElement, + EmoticonElement, + HeadingElement, + HeadingLevel, + InlineElement, + ListItemElement, + MentionElement, + OrderedListElement, + ParagraphElement, + QuoteLineElement, + UnorderedListElement, +} from './slate'; +import { parseMatrixToUrl } from '../../utils/matrix'; +import { createEmoticonElement, createMentionElement } from './common'; + +const markNodeToType: Record = { + b: MarkType.Bold, + strong: MarkType.Bold, + i: MarkType.Italic, + em: MarkType.Italic, + u: MarkType.Underline, + s: MarkType.StrikeThrough, + del: MarkType.StrikeThrough, + code: MarkType.Code, + span: MarkType.Spoiler, +}; + +const elementToTextMark = (node: Element): MarkType | undefined => { + const markType = markNodeToType[node.name]; + if (!markType) return undefined; + + if (markType === MarkType.Spoiler && node.attribs['data-mx-spoiler'] === undefined) { + return undefined; + } + if ( + markType === MarkType.Code && + node.parent && + 'name' in node.parent && + node.parent.name === 'pre' + ) { + return undefined; + } + return markType; +}; + +const parseNodeText = (node: ChildNode): string => { + if (isText(node)) { + return node.data; + } + if (isTag(node)) { + return node.children.map((child) => parseNodeText(child)).join(''); + } + return ''; +}; + +const elementToInlineNode = (node: Element): MentionElement | EmoticonElement | undefined => { + if (node.name === 'img' && node.attribs['data-mx-emoticon'] !== undefined) { + const { src, alt } = node.attribs; + if (!src) return undefined; + return createEmoticonElement(src, alt || 'Unknown Emoji'); + } + if (node.name === 'a') { + const { href } = node.attribs; + if (typeof href !== 'string') return undefined; + const [mxId] = parseMatrixToUrl(href); + if (mxId) { + return createMentionElement(mxId, mxId, false); + } + } + return undefined; +}; + +const parseInlineNodes = (node: ChildNode): InlineElement[] => { + if (isText(node)) { + return [{ text: node.data }]; + } + if (isTag(node)) { + const markType = elementToTextMark(node); + if (markType) { + const children = node.children.flatMap(parseInlineNodes); + if (node.attribs['data-md'] !== undefined) { + children.unshift({ text: node.attribs['data-md'] }); + children.push({ text: node.attribs['data-md'] }); + } else { + children.forEach((child) => { + if (Text.isText(child)) { + child[markType] = true; + } + }); + } + return children; + } + + const inlineNode = elementToInlineNode(node); + if (inlineNode) return [inlineNode]; + + if (node.name === 'a') { + const children = node.childNodes.flatMap(parseInlineNodes); + children.unshift({ text: '[' }); + children.push({ text: `](${node.attribs.href})` }); + return children; + } + + return node.childNodes.flatMap(parseInlineNodes); + } + + return []; +}; + +const parseBlockquoteNode = (node: Element): BlockQuoteElement => { + const children: QuoteLineElement[] = []; + let lineHolder: InlineElement[] = []; + + const appendLine = () => { + if (lineHolder.length === 0) return; + + children.push({ + type: BlockType.QuoteLine, + children: lineHolder, + }); + lineHolder = []; + }; + + node.children.forEach((child) => { + if (isText(child)) { + lineHolder.push({ text: child.data }); + return; + } + if (isTag(child)) { + if (child.name === 'br') { + appendLine(); + return; + } + + if (child.name === 'p') { + appendLine(); + children.push({ + type: BlockType.QuoteLine, + children: child.children.flatMap((c) => parseInlineNodes(c)), + }); + return; + } + + parseInlineNodes(child).forEach((inlineNode) => lineHolder.push(inlineNode)); + } + }); + appendLine(); + + return { + type: BlockType.BlockQuote, + children, + }; +}; +const parseCodeBlockNode = (node: Element): CodeBlockElement => { + const children: CodeLineElement[] = []; + + const code = parseNodeText(node).trim(); + code.split('\n').forEach((lineTxt) => + children.push({ + type: BlockType.CodeLine, + children: [ + { + text: lineTxt, + }, + ], + }) + ); + + return { + type: BlockType.CodeBlock, + children, + }; +}; +const parseListNode = (node: Element): OrderedListElement | UnorderedListElement => { + const children: ListItemElement[] = []; + let lineHolder: InlineElement[] = []; + + const appendLine = () => { + if (lineHolder.length === 0) return; + + children.push({ + type: BlockType.ListItem, + children: lineHolder, + }); + lineHolder = []; + }; + + node.children.forEach((child) => { + if (isText(child)) { + lineHolder.push({ text: child.data }); + return; + } + if (isTag(child)) { + if (child.name === 'br') { + appendLine(); + return; + } + + if (child.name === 'li') { + appendLine(); + children.push({ + type: BlockType.ListItem, + children: child.children.flatMap((c) => parseInlineNodes(c)), + }); + return; + } + + parseInlineNodes(child).forEach((inlineNode) => lineHolder.push(inlineNode)); + } + }); + appendLine(); + + return { + type: node.name === 'ol' ? BlockType.OrderedList : BlockType.UnorderedList, + children, + }; +}; +const parseHeadingNode = (node: Element): HeadingElement => { + const children = node.children.flatMap((child) => parseInlineNodes(child)); + + const headingMatch = node.name.match(/^h([123456])$/); + const [, g1AsLevel] = headingMatch ?? ['h3', '3']; + const level = parseInt(g1AsLevel, 10); + return { + type: BlockType.Heading, + level: (level <= 3 ? level : 3) as HeadingLevel, + children, + }; +}; + +export const domToEditorInput = (domNodes: ChildNode[]): Descendant[] => { + const children: Descendant[] = []; + + let lineHolder: InlineElement[] = []; + + const appendLine = () => { + if (lineHolder.length === 0) return; + + children.push({ + type: BlockType.Paragraph, + children: lineHolder, + }); + lineHolder = []; + }; + + domNodes.forEach((node) => { + if (isText(node)) { + lineHolder.push({ text: node.data }); + return; + } + if (isTag(node)) { + if (node.name === 'br') { + appendLine(); + return; + } + + if (node.name === 'p') { + appendLine(); + children.push({ + type: BlockType.Paragraph, + children: node.children.flatMap((child) => parseInlineNodes(child)), + }); + return; + } + + if (node.name === 'blockquote') { + appendLine(); + children.push(parseBlockquoteNode(node)); + return; + } + if (node.name === 'pre') { + appendLine(); + children.push(parseCodeBlockNode(node)); + return; + } + if (node.name === 'ol' || node.name === 'ul') { + appendLine(); + children.push(parseListNode(node)); + return; + } + + if (node.name.match(/^h[123456]$/)) { + appendLine(); + children.push(parseHeadingNode(node)); + return; + } + + parseInlineNodes(node).forEach((inlineNode) => lineHolder.push(inlineNode)); + } + }); + appendLine(); + + return children; +}; + +export const htmlToEditorInput = (unsafeHtml: string): Descendant[] => { + const sanitizedHtml = sanitizeCustomHtml(unsafeHtml); + + const domNodes = parse(sanitizedHtml); + const editorNodes = domToEditorInput(domNodes); + return editorNodes; +}; + +export const plainToEditorInput = (text: string): Descendant[] => { + const editorNodes: Descendant[] = text.split('\n').map((lineText) => { + const paragraphNode: ParagraphElement = { + type: BlockType.Paragraph, + children: [ + { + text: lineText, + }, + ], + }; + return paragraphNode; + }); + return editorNodes; +}; diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 92c86dd8..89a5f7c5 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -1,7 +1,8 @@ import { Descendant, Text } from 'slate'; + import { sanitizeText } from '../../utils/sanitize'; import { BlockType } from './Elements'; -import { CustomElement, FormattedText } from './slate'; +import { CustomElement } from './slate'; import { parseInlineMD } from '../../utils/markdown'; export type OutputOptions = { @@ -9,13 +10,13 @@ export type OutputOptions = { allowMarkdown?: boolean; }; -const textToCustomHtml = (node: FormattedText, opts: OutputOptions): string => { +const textToCustomHtml = (node: Text, opts: OutputOptions): string => { let string = sanitizeText(node.text); if (opts.allowTextFormatting) { if (node.bold) string = `${string}`; if (node.italic) string = `${string}`; if (node.underline) string = `${string}`; - if (node.strikeThrough) string = `${string}`; + if (node.strikeThrough) string = `${string}`; if (node.code) string = `${string}`; if (node.spoiler) string = `${string}`; } @@ -47,6 +48,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { return `
      ${children}
    `; case BlockType.UnorderedList: return `
      ${children}
    `; + case BlockType.Mention: return `${node.name}`; case BlockType.Emoticon: diff --git a/src/app/components/editor/slate.d.ts b/src/app/components/editor/slate.d.ts index 74b20708..ee046a08 100644 --- a/src/app/components/editor/slate.d.ts +++ b/src/app/components/editor/slate.d.ts @@ -23,13 +23,9 @@ export type FormattedText = Text & { export type LinkElement = { type: BlockType.Link; href: string; - children: FormattedText[]; -}; -export type SpoilerElement = { - type: 'spoiler'; - alert?: string; - children: FormattedText[]; + children: Text[]; }; + export type MentionElement = { type: BlockType.Mention; id: string; @@ -44,14 +40,16 @@ export type EmoticonElement = { children: Text[]; }; +export type InlineElement = Text | LinkElement | MentionElement | EmoticonElement; + export type ParagraphElement = { type: BlockType.Paragraph; - children: FormattedText[]; + children: InlineElement[]; }; export type HeadingElement = { type: BlockType.Heading; level: HeadingLevel; - children: FormattedText[]; + children: InlineElement[]; }; export type CodeLineElement = { type: BlockType.CodeLine; @@ -63,7 +61,7 @@ export type CodeBlockElement = { }; export type QuoteLineElement = { type: BlockType.QuoteLine; - children: FormattedText[]; + children: InlineElement[]; }; export type BlockQuoteElement = { type: BlockType.BlockQuote; @@ -71,7 +69,7 @@ export type BlockQuoteElement = { }; export type ListItemElement = { type: BlockType.ListItem; - children: FormattedText[]; + children: InlineElement[]; }; export type OrderedListElement = { type: BlockType.OrderedList; @@ -84,7 +82,6 @@ export type UnorderedListElement = { export type CustomElement = | LinkElement - // | SpoilerElement | MentionElement | EmoticonElement | ParagraphElement diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index 7564d5f4..acb45b32 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -12,7 +12,7 @@ import { useAtom } from 'jotai'; import isHotkey from 'is-hotkey'; import { EventType, IContent, MsgType, Room } from 'matrix-js-sdk'; import { ReactEditor } from 'slate-react'; -import { Transforms, Range, Editor, Element } from 'slate'; +import { Transforms, Range, Editor } from 'slate'; import { Box, Dialog, @@ -51,6 +51,7 @@ import { resetEditorHistory, customHtmlEqualsPlainText, trimCustomHtml, + isEmptyEditor, } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; @@ -95,7 +96,12 @@ import navigation from '../../../client/state/navigation'; import cons from '../../../client/state/cons'; import { MessageReply } from '../../molecules/message/Message'; import colorMXID from '../../../util/colorMXID'; -import { parseReplyBody, parseReplyFormattedBody } from '../../utils/room'; +import { + parseReplyBody, + parseReplyFormattedBody, + trimReplyFromBody, + trimReplyFromFormattedBody, +} from '../../utils/room'; import { sanitizeText } from '../../utils/sanitize'; import { useScreenSize } from '../../hooks/useScreenSize'; @@ -264,13 +270,15 @@ export const RoomInput = forwardRef( let body = plainText; let formattedBody = customHtml; if (replyDraft) { - body = parseReplyBody(replyDraft.userId, replyDraft.userId) + body; + body = parseReplyBody(replyDraft.userId, trimReplyFromBody(replyDraft.body)) + body; formattedBody = parseReplyFormattedBody( roomId, replyDraft.userId, replyDraft.eventId, - replyDraft.formattedBody ?? sanitizeText(replyDraft.body) + replyDraft.formattedBody + ? trimReplyFromFormattedBody(replyDraft.formattedBody) + : sanitizeText(replyDraft.body) ) + formattedBody; } @@ -321,19 +329,25 @@ export const RoomInput = forwardRef( [submit, editor, setReplyDraft] ); - const handleKeyUp: KeyboardEventHandler = useCallback(() => { - const firstChildren = editor.children[0]; - if (firstChildren && Element.isElement(firstChildren)) { - const isEmpty = editor.children.length === 1 && Editor.isEmpty(editor, firstChildren); - sendTypingStatus(!isEmpty); - } + const handleKeyUp: KeyboardEventHandler = useCallback( + (evt) => { + if (isHotkey('escape', evt)) { + evt.preventDefault(); + return; + } - const prevWordRange = getPrevWorldRange(editor); - const query = prevWordRange - ? getAutocompleteQuery(editor, prevWordRange, AUTOCOMPLETE_PREFIXES) - : undefined; - setAutocompleteQuery(query); - }, [editor, sendTypingStatus]); + sendTypingStatus(!isEmptyEditor(editor)); + + const prevWordRange = getPrevWorldRange(editor); + const query = prevWordRange + ? getAutocompleteQuery(editor, prevWordRange, AUTOCOMPLETE_PREFIXES) + : undefined; + setAutocompleteQuery(query); + }, + [editor, sendTypingStatus] + ); + + const handleCloseAutocomplete = useCallback(() => setAutocompleteQuery(undefined), []); const handleEmoticonSelect = (key: string, shortcode: string) => { editor.insertNode(createEmoticonElement(key, shortcode)); @@ -419,7 +433,7 @@ export const RoomInput = forwardRef( roomId={roomId} editor={editor} query={autocompleteQuery} - requestClose={() => setAutocompleteQuery(undefined)} + requestClose={handleCloseAutocomplete} /> )} {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && ( @@ -427,7 +441,7 @@ export const RoomInput = forwardRef( roomId={roomId} editor={editor} query={autocompleteQuery} - requestClose={() => setAutocompleteQuery(undefined)} + requestClose={handleCloseAutocomplete} /> )} {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && ( @@ -435,10 +449,11 @@ export const RoomInput = forwardRef( imagePackRooms={imagePackRooms} editor={editor} query={autocompleteQuery} - requestClose={() => setAutocompleteQuery(undefined)} + requestClose={handleCloseAutocomplete} /> )} ( ({ position, className, ...props }, ref) => ( @@ -226,34 +229,6 @@ export const getEventIdAbsoluteIndex = ( return baseIndex + eventIndex; }; -export const getEventReactions = (timelineSet: EventTimelineSet, eventId: string) => - timelineSet.relations.getChildEventsForEvent( - eventId, - RelationType.Annotation, - EventType.Reaction - ); - -export const getEventEdits = (timelineSet: EventTimelineSet, eventId: string, eventType: string) => - timelineSet.relations.getChildEventsForEvent(eventId, RelationType.Replace, eventType); - -export const getLatestEdit = ( - targetEvent: MatrixEvent, - editEvents: MatrixEvent[] -): MatrixEvent | undefined => { - const eventByTargetSender = (rEvent: MatrixEvent) => - rEvent.getSender() === targetEvent.getSender(); - return editEvents.sort(matrixEventByRecency).find(eventByTargetSender); -}; - -export const getEditedEvent = ( - mEventId: string, - mEvent: MatrixEvent, - timelineSet: EventTimelineSet -): MatrixEvent | undefined => { - const edits = getEventEdits(timelineSet, mEventId, mEvent.getType()); - return edits && getLatestEdit(mEvent, edits.getRelations()); -}; - export const factoryGetFileSrcUrl = (httpUrl: string, mimeType: string, encFile?: IEncryptedFile) => async (): Promise => { if (encFile) { @@ -483,6 +458,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const myPowerLevel = getPowerLevel(mx.getUserId() ?? ''); const canRedact = canDoAction('redact', myPowerLevel); const canSendReaction = canSendEvent(MessageEvent.Reaction, myPowerLevel); + const [editId, setEditId] = useState(); const imagePackRooms: Room[] = useMemo(() => { const allParentSpaces = [ @@ -572,20 +548,21 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const getScrollElement = useCallback(() => scrollRef.current, []); - const { getItems, scrollToItem, observeBackAnchor, observeFrontAnchor } = useVirtualPaginator({ - count: eventsLength, - limit: PAGINATION_LIMIT, - range: timeline.range, - onRangeChange: useCallback((r) => setTimeline((cs) => ({ ...cs, range: r })), []), - getScrollElement, - getItemElement: useCallback( - (index: number) => - (scrollRef.current?.querySelector(`[data-message-item="${index}"]`) as HTMLElement) ?? - undefined, - [] - ), - onEnd: handleTimelinePagination, - }); + const { getItems, scrollToItem, scrollToElement, observeBackAnchor, observeFrontAnchor } = + useVirtualPaginator({ + count: eventsLength, + limit: PAGINATION_LIMIT, + range: timeline.range, + onRangeChange: useCallback((r) => setTimeline((cs) => ({ ...cs, range: r })), []), + getScrollElement, + getItemElement: useCallback( + (index: number) => + (scrollRef.current?.querySelector(`[data-message-item="${index}"]`) as HTMLElement) ?? + undefined, + [] + ), + onEnd: handleTimelinePagination, + }); const loadEventTimeline = useEventTimelineLoader( mx, @@ -701,6 +678,29 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli useCallback(() => atBottomAnchorRef.current, []) ); + // Handle up arrow edit + useKeyDown( + window, + useCallback( + (evt) => { + if ( + isHotkey('arrowup', evt) && + editableActiveElement() && + document.activeElement?.getAttribute('data-editable-name') === 'RoomInput' && + isEmptyEditor(editor) + ) { + const editableEvt = getLatestEditableEvt(room.getLiveTimeline(), (mEvt) => + canEditEvent(mx, mEvt) + ); + const editableEvtId = editableEvt?.getId(); + if (!editableEvtId) return; + setEditId(editableEvtId); + } + }, + [mx, room, editor] + ) + ); + useEffect(() => { if (eventId) { setTimeline(getEmptyTimeline()); @@ -771,6 +771,22 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli } }, [room, unreadInfo, liveTimelineLinked, rangeAtEnd, atBottom]); + // scroll out of view msg editor in view. + useEffect(() => { + if (editId) { + const editMsgElement = + (scrollRef.current?.querySelector(`[data-message-id="${editId}"]`) as HTMLElement) ?? + undefined; + if (editMsgElement) { + scrollToElement(editMsgElement, { + align: 'center', + behavior: 'smooth', + stopInView: true, + }); + } + } + }, [scrollToElement, editId]); + const handleJumpToLatest = () => { setTimeline(getInitialTimeline(room)); scrollToBottomRef.current.count += 1; @@ -901,6 +917,17 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }, [mx, room] ); + const handleEdit = useCallback( + (editEvtId?: string) => { + if (editEvtId) { + setEditId(editEvtId); + return; + } + setEditId(undefined); + ReactEditor.focus(editor); + }, + [editor] + ); const renderBody = (body: string, customBody?: string) => { if (body === '') ; @@ -1153,12 +1180,14 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli void; @@ -211,21 +217,40 @@ export const MessageReadReceiptItem = as< export const MessageSourceCodeItem = as< 'button', { + room: Room; mEvent: MatrixEvent; onClose?: () => void; } ->(({ mEvent, onClose, ...props }, ref) => { +>(({ room, mEvent, onClose, ...props }, ref) => { const [open, setOpen] = useState(false); - const text = JSON.stringify( - mEvent.isEncrypted() + + const getContent = (evt: MatrixEvent) => + evt.isEncrypted() ? { - [`<== DECRYPTED_EVENT ==>`]: mEvent.getEffectiveEvent(), - [`<== ORIGINAL_EVENT ==>`]: mEvent.event, + [`<== DECRYPTED_EVENT ==>`]: evt.getEffectiveEvent(), + [`<== ORIGINAL_EVENT ==>`]: evt.event, } - : mEvent.event, - null, - 2 - ); + : evt.event; + + const getText = (): string => { + const evtId = mEvent.getId()!; + const evtTimeline = room.getTimelineForEvent(evtId); + const edits = + evtTimeline && + getEventEdits(evtTimeline.getTimelineSet(), evtId, mEvent.getType())?.getRelations(); + + if (!edits) return JSON.stringify(getContent(mEvent), null, 2); + + const content: Record = { + '<== MAIN_EVENT ==>': getContent(mEvent), + }; + + edits.forEach((editEvt, index) => { + content[`<== REPLACEMENT_EVENT_${index + 1} ==>`] = getContent(editEvt); + }); + + return JSON.stringify(content, null, 2); + }; const handleClose = () => { setOpen(false); @@ -247,7 +272,7 @@ export const MessageSourceCodeItem = as<
    @@ -537,6 +562,7 @@ export type MessageProps = { mEvent: MatrixEvent; collapse: boolean; highlight: boolean; + edit?: boolean; canDelete?: boolean; canSendReaction?: boolean; imagePackRooms?: Room[]; @@ -546,6 +572,7 @@ export type MessageProps = { onUserClick: MouseEventHandler; onUsernameClick: MouseEventHandler; onReplyClick: MouseEventHandler; + onEditId?: (eventId?: string) => void; onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void; reply?: ReactNode; reactions?: ReactNode; @@ -558,6 +585,7 @@ export const Message = as<'div', MessageProps>( mEvent, collapse, highlight, + edit, canDelete, canSendReaction, imagePackRooms, @@ -568,6 +596,7 @@ export const Message = as<'div', MessageProps>( onUsernameClick, onReplyClick, onReactionToggle, + onEditId, reply, reactions, children, @@ -644,7 +673,21 @@ export const Message = as<'div', MessageProps>( const msgContentJSX = ( {reply} - {children} + {edit && onEditId ? ( + onEditId()} + /> + ) : ( + children + )} {reactions} ); @@ -677,7 +720,7 @@ export const Message = as<'div', MessageProps>( onMouseLeave={hideOptions} ref={ref} > - {(hover || menu || emojiBoard) && ( + {!edit && (hover || menu || emojiBoard) && (
    @@ -728,6 +771,16 @@ export const Message = as<'div', MessageProps>( > + {canEditEvent(mx, mEvent) && onEditId && ( + onEditId(mEvent.getId())} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + )} ( Reply + {canEditEvent(mx, mEvent) && onEditId && ( + } + radii="300" + data-event-id={mEvent.getId()} + onClick={() => { + onEditId(mEvent.getId()); + closeMenu(); + }} + > + + Edit Message + + + )} - + {((!mEvent.isRedacted() && canDelete) || mEvent.getSender() !== mx.getUserId()) && ( @@ -941,7 +1015,7 @@ export const Event = as<'div', EventProps>( eventId={mEvent.getId() ?? ''} onClose={closeMenu} /> - + {((!mEvent.isRedacted() && canDelete && !stateEvent) || (mEvent.getSender() !== mx.getUserId() && !stateEvent)) && ( diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/organisms/room/message/MessageEditor.tsx new file mode 100644 index 00000000..90357479 --- /dev/null +++ b/src/app/organisms/room/message/MessageEditor.tsx @@ -0,0 +1,295 @@ +import React, { KeyboardEventHandler, useCallback, useEffect, useState } from 'react'; +import { Box, Chip, Icon, IconButton, Icons, Line, PopOut, Spinner, Text, as, config } from 'folds'; +import { Editor, Transforms } from 'slate'; +import { ReactEditor } from 'slate-react'; +import { IContent, MatrixEvent, RelationType, Room } from 'matrix-js-sdk'; +import isHotkey from 'is-hotkey'; +import { + AUTOCOMPLETE_PREFIXES, + AutocompletePrefix, + AutocompleteQuery, + CustomEditor, + EmoticonAutocomplete, + RoomMentionAutocomplete, + Toolbar, + UserMentionAutocomplete, + createEmoticonElement, + customHtmlEqualsPlainText, + getAutocompleteQuery, + getPrevWorldRange, + htmlToEditorInput, + moveCursor, + plainToEditorInput, + toMatrixCustomHTML, + toPlainText, + trimCustomHtml, + useEditor, +} from '../../../components/editor'; +import { useSetting } from '../../../state/hooks/settings'; +import { settingsAtom } from '../../../state/settings'; +import { UseStateProvider } from '../../../components/UseStateProvider'; +import { EmojiBoard } from '../../../components/emoji-board'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { getEditedEvent, trimReplyFromFormattedBody } from '../../../utils/room'; + +type MessageEditorProps = { + roomId: string; + room: Room; + mEvent: MatrixEvent; + imagePackRooms?: Room[]; + onCancel: () => void; +}; +export const MessageEditor = as<'div', MessageEditorProps>( + ({ room, roomId, mEvent, imagePackRooms, onCancel, ...props }, ref) => { + const mx = useMatrixClient(); + const editor = useEditor(); + const [globalToolbar] = useSetting(settingsAtom, 'editorToolbar'); + const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); + const [toolbar, setToolbar] = useState(globalToolbar); + + const [autocompleteQuery, setAutocompleteQuery] = + useState>(); + + const getPrevBodyAndFormattedBody = useCallback(() => { + const evtId = mEvent.getId()!; + const evtTimeline = room.getTimelineForEvent(evtId); + const editedEvent = + evtTimeline && getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet()); + + const { body, formatted_body: customHtml }: Record = + editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + + return [body, customHtml]; + }, [room, mEvent]); + + const [saveState, save] = useAsyncCallback( + useCallback(async () => { + const plainText = toPlainText(editor.children).trim(); + const customHtml = trimCustomHtml( + toMatrixCustomHTML(editor.children, { + allowTextFormatting: true, + allowMarkdown: isMarkdown, + }) + ); + + const [prevBody, prevCustomHtml] = getPrevBodyAndFormattedBody(); + + if (plainText === '') return undefined; + if ( + typeof prevCustomHtml === 'string' && + trimReplyFromFormattedBody(prevCustomHtml) === customHtml + ) { + return undefined; + } + if (!prevCustomHtml && typeof prevBody === 'string' && prevBody === plainText) { + return undefined; + } + + const newContent: IContent = { + msgtype: mEvent.getContent().msgtype, + body: plainText, + }; + + if (!customHtmlEqualsPlainText(customHtml, plainText)) { + newContent.format = 'org.matrix.custom.html'; + newContent.formatted_body = customHtml; + } + + const content: IContent = { + ...newContent, + body: `* ${plainText}`, + 'm.new_content': newContent, + 'm.relates_to': { + event_id: mEvent.getId(), + rel_type: RelationType.Replace, + }, + }; + + return mx.sendMessage(roomId, content); + }, [mx, editor, roomId, mEvent, isMarkdown, getPrevBodyAndFormattedBody]) + ); + + const handleSave = useCallback(() => { + if (saveState.status !== AsyncStatus.Loading) { + save(); + } + }, [saveState, save]); + + const handleKeyDown: KeyboardEventHandler = useCallback( + (evt) => { + if (isHotkey('enter', evt)) { + evt.preventDefault(); + handleSave(); + } + if (isHotkey('escape', evt)) { + evt.preventDefault(); + onCancel(); + } + }, + [onCancel, handleSave] + ); + + const handleKeyUp: KeyboardEventHandler = useCallback( + (evt) => { + if (isHotkey('escape', evt)) { + evt.preventDefault(); + return; + } + + const prevWordRange = getPrevWorldRange(editor); + const query = prevWordRange + ? getAutocompleteQuery(editor, prevWordRange, AUTOCOMPLETE_PREFIXES) + : undefined; + setAutocompleteQuery(query); + }, + [editor] + ); + + const handleCloseAutocomplete = useCallback(() => setAutocompleteQuery(undefined), []); + + const handleEmoticonSelect = (key: string, shortcode: string) => { + editor.insertNode(createEmoticonElement(key, shortcode)); + moveCursor(editor); + }; + + useEffect(() => { + const [body, customHtml] = getPrevBodyAndFormattedBody(); + + const initialValue = + typeof customHtml === 'string' + ? htmlToEditorInput(customHtml) + : plainToEditorInput(typeof body === 'string' ? body : ''); + + Transforms.select(editor, { + anchor: Editor.start(editor, []), + focus: Editor.end(editor, []), + }); + + editor.insertFragment(initialValue); + ReactEditor.focus(editor); + }, [editor, getPrevBodyAndFormattedBody]); + + useEffect(() => { + if (saveState.status === AsyncStatus.Success) { + onCancel(); + } + }, [saveState, onCancel]); + + return ( +
    + {autocompleteQuery?.prefix === AutocompletePrefix.RoomMention && ( + + )} + {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && ( + + )} + {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && ( + + )} + + + + + ) : undefined + } + > + Save + + + Cancel + + + + setToolbar(!toolbar)} + > + + + + {(emojiBoard: boolean, setEmojiBoard) => ( + { + setEmojiBoard(false); + ReactEditor.focus(editor); + }} + /> + } + > + {(anchorRef) => ( + setEmojiBoard(true)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + + )} + + )} + + + + {toolbar && ( +
    + + +
    + )} + + } + /> +
    + ); + } +); diff --git a/src/app/organisms/room/message/Reactions.tsx b/src/app/organisms/room/message/Reactions.tsx index 354820cd..bc32c1a3 100644 --- a/src/app/organisms/room/message/Reactions.tsx +++ b/src/app/organisms/room/message/Reactions.tsx @@ -12,7 +12,7 @@ import { toRem, } from 'folds'; import classNames from 'classnames'; -import { EventTimelineSet, EventType, RelationType, Room } from 'matrix-js-sdk'; +import { Room } from 'matrix-js-sdk'; import { type Relations } from 'matrix-js-sdk/lib/models/relations'; import FocusTrap from 'focus-trap-react'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; @@ -22,13 +22,6 @@ import { useRelations } from '../../../hooks/useRelations'; import * as css from './styles.css'; import { ReactionViewer } from '../reaction-viewer'; -export const getEventReactions = (timelineSet: EventTimelineSet, eventId: string) => - timelineSet.relations.getChildEventsForEvent( - eventId, - RelationType.Annotation, - EventType.Reaction - ); - export type ReactionsProps = { room: Room; mEventId: string; diff --git a/src/app/utils/dom.ts b/src/app/utils/dom.ts index a8dc4be2..f39fe623 100644 --- a/src/app/utils/dom.ts +++ b/src/app/utils/dom.ts @@ -5,7 +5,11 @@ export const targetFromEvent = (evt: Event, selector: string): Element | undefin export const editableActiveElement = (): boolean => !!document.activeElement && - /^(input)|(textarea)$/.test(document.activeElement.nodeName.toLowerCase()); + (document.activeElement.nodeName.toLowerCase() === 'input' || + document.activeElement.nodeName.toLowerCase() === 'textbox' || + document.activeElement.getAttribute('contenteditable') === 'true' || + document.activeElement.getAttribute('role') === 'input' || + document.activeElement.getAttribute('role') === 'textbox'); export const isIntersectingScrollView = ( scrollElement: HTMLElement, diff --git a/src/app/utils/markdown.ts b/src/app/utils/markdown.ts index e4294d7d..6db7a349 100644 --- a/src/app/utils/markdown.ts +++ b/src/app/utils/markdown.ts @@ -83,7 +83,7 @@ const StrikeRule: MDRule = { match: (text) => text.match(STRIKE_REG_1), html: (parse, match) => { const [, g1] = match; - return `${parse(g1)}`; + return `${parse(g1)}`; }, }; diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 91bd80f3..ba27879e 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -28,6 +28,15 @@ export const isRoomId = (id: string): boolean => validMxId(id) && id.startsWith( export const isRoomAlias = (id: string): boolean => validMxId(id) && id.startsWith('#'); +export const parseMatrixToUrl = (url: string): [string | undefined, string | undefined] => { + const href = decodeURIComponent(url); + + const match = href.match(/^https?:\/\/matrix.to\/#\/([@!$+#]\S+:[^\\?|^\s|^\\/]+)(\?(via=\S+))?/); + if (!match) return [undefined, undefined]; + const [, g1AsMxId, , g3AsVia] = match; + return [g1AsMxId, g3AsVia]; +}; + export const getRoomWithCanonicalAlias = (mx: MatrixClient, alias: string): Room | undefined => mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias); diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index af9505d4..1dabdc07 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -2,17 +2,22 @@ import { IconName, IconSrc } from 'folds'; import { EventTimeline, + EventTimelineSet, + EventType, IPushRule, IPushRules, JoinRule, MatrixClient, MatrixEvent, + MsgType, NotificationCountType, + RelationType, Room, } from 'matrix-js-sdk'; import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend'; import { AccountDataEvent } from '../../types/matrix/accountData'; import { + MessageEvent, NotificationType, RoomToParents, RoomType, @@ -249,6 +254,21 @@ export const getRoomAvatarUrl = (mx: MatrixClient, room: Room): string | undefin return room.getAvatarUrl(mx.baseUrl, 32, 32, 'crop') ?? undefined; }; +export const trimReplyFromBody = (body: string): string => { + const match = body.match(/^>\s<.+?>\s.+\n\n/); + if (!match) return body; + return body.slice(match[0].length); +}; + +export const trimReplyFromFormattedBody = (formattedBody: string): string => { + const suffix = ''; + const i = formattedBody.lastIndexOf(suffix); + if (i < 0) { + return formattedBody; + } + return formattedBody.slice(i + suffix.length); +}; + export const parseReplyBody = (userId: string, body: string) => `> <${userId}> ${body.replace(/\n/g, '\n> ')}\n\n`; @@ -301,3 +321,52 @@ export const getReactionContent = (eventId: string, key: string, shortcode?: str }, shortcode, }); + +export const getEventReactions = (timelineSet: EventTimelineSet, eventId: string) => + timelineSet.relations.getChildEventsForEvent( + eventId, + RelationType.Annotation, + EventType.Reaction + ); + +export const getEventEdits = (timelineSet: EventTimelineSet, eventId: string, eventType: string) => + timelineSet.relations.getChildEventsForEvent(eventId, RelationType.Replace, eventType); + +export const getLatestEdit = ( + targetEvent: MatrixEvent, + editEvents: MatrixEvent[] +): MatrixEvent | undefined => { + const eventByTargetSender = (rEvent: MatrixEvent) => + rEvent.getSender() === targetEvent.getSender(); + return editEvents.sort((m1, m2) => m2.getTs() - m1.getTs()).find(eventByTargetSender); +}; + +export const getEditedEvent = ( + mEventId: string, + mEvent: MatrixEvent, + timelineSet: EventTimelineSet +): MatrixEvent | undefined => { + const edits = getEventEdits(timelineSet, mEventId, mEvent.getType()); + return edits && getLatestEdit(mEvent, edits.getRelations()); +}; + +export const canEditEvent = (mx: MatrixClient, mEvent: MatrixEvent) => + mEvent.getSender() === mx.getUserId() && + !mEvent.isRelation() && + mEvent.getType() === MessageEvent.RoomMessage && + (mEvent.getContent().msgtype === MsgType.Text || + mEvent.getContent().msgtype === MsgType.Emote || + mEvent.getContent().msgtype === MsgType.Notice); + +export const getLatestEditableEvt = ( + timeline: EventTimeline, + canEdit: (mEvent: MatrixEvent) => boolean +): MatrixEvent | undefined => { + const events = timeline.getEvents(); + + for (let i = events.length - 1; i >= 0; i -= 1) { + const evt = events[i]; + if (canEdit(evt)) return evt; + } + return undefined; +}; diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts index 6a03ca7d..8e7c1283 100644 --- a/src/app/utils/sanitize.ts +++ b/src/app/utils/sanitize.ts @@ -56,12 +56,19 @@ const permittedTagToAttributes = { 'data-mx-maths', 'data-mx-pill', 'data-mx-ping', + 'data-md', ], div: ['data-mx-maths'], - a: ['name', 'target', 'href', 'rel'], + a: ['name', 'target', 'href', 'rel', 'data-md'], img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], ol: ['start'], - code: ['class'], + code: ['class', 'data-md'], + strong: ['data-md'], + i: ['data-md'], + em: ['data-md'], + u: ['data-md'], + s: ['data-md'], + del: ['data-md'], }; const transformFontTag: Transformer = (tagName, attribs) => ({ From 4d0b6b93bc1cece068fe1a081bee3ab8324800bd Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:15:08 +1100 Subject: [PATCH 488/824] Fix verification notice not to display when CS is not setup (#1451) --- src/app/organisms/settings/DeviceManage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 74738ea8..7689f0f9 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -217,7 +217,7 @@ function DeviceManage() {
    Unverified sessions - {!isMeVerified && ( + {!isMeVerified && isCSEnabled && (
    Date: Wed, 18 Oct 2023 13:15:30 +1100 Subject: [PATCH 489/824] Editor Commands (#1450) * add commands hook * add commands in editor * add command auto complete menu * add commands in room input * remove old reply code from room input * fix video component css * do not auto focus input on android or ios * fix crash on enable block after selection * fix circular deps in editor * fix autocomplete return focus move editor cursor * remove unwanted keydown from room input * fix emoji alignment in editor * test ipad user agent * refactor isAndroidOrIOS to mobileOrTablet * update slate & slate-react * downgrade slate-react to 0.98.4 0.99.0 has breaking changes with ReactEditor.focus * add sql to readable ext mimetype * fix empty editor formatting gets saved as draft * add option to use enter for newline * remove empty msg draft from atom family * prevent msg ctx menu from open on text selection --- package-lock.json | 16 +- package.json | 4 +- src/app/components/editor/Editor.css.ts | 5 +- src/app/components/editor/Editor.tsx | 13 +- src/app/components/editor/Elements.tsx | 65 +++--- src/app/components/editor/Toolbar.tsx | 4 +- .../editor/autocomplete/AutocompleteMenu.tsx | 1 + .../autocomplete/EmoticonAutocomplete.tsx | 2 +- .../autocomplete/RoomMentionAutocomplete.tsx | 2 +- .../autocomplete/UserMentionAutocomplete.tsx | 2 +- .../editor/autocomplete/autocompleteQuery.ts | 2 + src/app/components/editor/index.ts | 3 +- src/app/components/editor/input.ts | 4 +- src/app/components/editor/keyboard.ts | 4 +- src/app/components/editor/output.ts | 16 +- src/app/components/editor/slate.d.ts | 10 +- src/app/components/editor/types.ts | 24 ++ .../components/editor/{common.ts => utils.ts} | 45 +++- src/app/components/emoji-board/EmojiBoard.tsx | 3 +- src/app/components/media/Video.tsx | 2 +- src/app/components/media/media.css.ts | 2 +- src/app/components/message/Reply.tsx | 4 +- src/app/hooks/useCommands.ts | 219 ++++++++++++++++++ .../organisms/room/CommandAutocomplete.tsx | 109 +++++++++ src/app/organisms/room/RoomInput.tsx | 109 +++++---- src/app/organisms/room/RoomView.jsx | 1 + src/app/organisms/room/message/Message.tsx | 4 +- .../organisms/room/message/MessageEditor.tsx | 15 +- src/app/organisms/settings/Settings.jsx | 11 + src/app/state/settings.ts | 2 + src/app/styles/CustomHtml.css.ts | 27 ++- src/app/utils/matrix.ts | 12 +- src/app/utils/mimeTypes.ts | 1 + src/app/utils/user-agent.ts | 8 + 34 files changed, 620 insertions(+), 131 deletions(-) create mode 100644 src/app/components/editor/types.ts rename src/app/components/editor/{common.ts => utils.ts} (82%) create mode 100644 src/app/hooks/useCommands.ts create mode 100644 src/app/organisms/room/CommandAutocomplete.tsx diff --git a/package-lock.json b/package-lock.json index 70c90a9a..1ef2fd4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ "react-modal": "3.16.1", "react-range": "1.8.14", "sanitize-html": "2.8.0", - "slate": "0.90.0", + "slate": "0.94.1", "slate-history": "0.93.0", - "slate-react": "0.90.0", + "slate-react": "0.98.4", "tippy.js": "6.3.7", "twemoji": "14.0.2", "ua-parser-js": "1.0.35" @@ -5766,9 +5766,9 @@ } }, "node_modules/slate": { - "version": "0.90.0", - "resolved": "https://registry.npmjs.org/slate/-/slate-0.90.0.tgz", - "integrity": "sha512-dv8idv0JjYyHiAJcVKf5yWKPDMTDi+PSZyfjsnquEI8VB5nmTVGjeJab06lc3o69O7aN05ROwO9/OY8mU1IUPA==", + "version": "0.94.1", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.94.1.tgz", + "integrity": "sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==", "dependencies": { "immer": "^9.0.6", "is-plain-object": "^5.0.0", @@ -5787,9 +5787,9 @@ } }, "node_modules/slate-react": { - "version": "0.90.0", - "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.90.0.tgz", - "integrity": "sha512-z6pGd6jjU5VazLxlDi6zL3a6yaPBPJ+A2VyIlE/h/rvDywaLYGvk0xcrA9NrK71Dr47HK5ZN2zFEZNleh6wlPA==", + "version": "0.98.4", + "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.98.4.tgz", + "integrity": "sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==", "dependencies": { "@juggle/resize-observer": "^3.4.0", "@types/is-hotkey": "^0.1.1", diff --git a/package.json b/package.json index 7467126e..f7bce7cf 100644 --- a/package.json +++ b/package.json @@ -66,9 +66,9 @@ "react-modal": "3.16.1", "react-range": "1.8.14", "sanitize-html": "2.8.0", - "slate": "0.90.0", + "slate": "0.94.1", "slate-history": "0.93.0", - "slate-react": "0.90.0", + "slate-react": "0.98.4", "tippy.js": "6.3.7", "twemoji": "14.0.2", "ua-parser-js": "1.0.35" diff --git a/src/app/components/editor/Editor.css.ts b/src/app/components/editor/Editor.css.ts index 9ec8cfaf..edce743f 100644 --- a/src/app/components/editor/Editor.css.ts +++ b/src/app/components/editor/Editor.css.ts @@ -26,7 +26,7 @@ export const EditorTextarea = style([ { flexGrow: 1, height: '100%', - padding: `${toRem(13)} 0`, + padding: `${toRem(13)} ${toRem(1)}`, selectors: { [`${EditorTextareaScroll}:first-child &`]: { paddingLeft: toRem(13), @@ -34,6 +34,9 @@ export const EditorTextarea = style([ [`${EditorTextareaScroll}:last-child &`]: { paddingRight: toRem(13), }, + '&:focus': { + outline: 'none', + }, }, }, ]); diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index 62b41345..044d0837 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -18,7 +18,8 @@ import { RenderPlaceholderProps, } from 'slate-react'; import { withHistory } from 'slate-history'; -import { BlockType, RenderElement, RenderLeaf } from './Elements'; +import { BlockType } from './types'; +import { RenderElement, RenderLeaf } from './Elements'; import { CustomElement } from './slate'; import * as css from './Editor.css'; import { toggleKeyboardShortcut } from './keyboard'; @@ -34,8 +35,9 @@ const withInline = (editor: Editor): Editor => { const { isInline } = editor; editor.isInline = (element) => - [BlockType.Mention, BlockType.Emoticon, BlockType.Link].includes(element.type) || - isInline(element); + [BlockType.Mention, BlockType.Emoticon, BlockType.Link, BlockType.Command].includes( + element.type + ) || isInline(element); return editor; }; @@ -44,7 +46,8 @@ const withVoid = (editor: Editor): Editor => { const { isVoid } = editor; editor.isVoid = (element) => - [BlockType.Mention, BlockType.Emoticon].includes(element.type) || isVoid(element); + [BlockType.Mention, BlockType.Emoticon, BlockType.Command].includes(element.type) || + isVoid(element); return editor; }; @@ -122,7 +125,7 @@ export const CustomEditor = forwardRef( return (
    - + {top} {before && ( diff --git a/src/app/components/editor/Elements.tsx b/src/app/components/editor/Elements.tsx index 2df80993..c4767ab9 100644 --- a/src/app/components/editor/Elements.tsx +++ b/src/app/components/editor/Elements.tsx @@ -1,34 +1,18 @@ import { Scroll, Text } from 'folds'; import React from 'react'; -import { RenderElementProps, RenderLeafProps, useFocused, useSelected } from 'slate-react'; +import { + RenderElementProps, + RenderLeafProps, + useFocused, + useSelected, + useSlate, +} from 'slate-react'; import * as css from '../../styles/CustomHtml.css'; -import { EmoticonElement, LinkElement, MentionElement } from './slate'; +import { CommandElement, EmoticonElement, LinkElement, MentionElement } from './slate'; import { useMatrixClient } from '../../hooks/useMatrixClient'; - -export enum MarkType { - Bold = 'bold', - Italic = 'italic', - Underline = 'underline', - StrikeThrough = 'strikeThrough', - Code = 'code', - Spoiler = 'spoiler', -} - -export enum BlockType { - Paragraph = 'paragraph', - Heading = 'heading', - CodeLine = 'code-line', - CodeBlock = 'code-block', - QuoteLine = 'quote-line', - BlockQuote = 'block-quote', - ListItem = 'list-item', - OrderedList = 'ordered-list', - UnorderedList = 'unordered-list', - Mention = 'mention', - Emoticon = 'emoticon', - Link = 'link', -} +import { getBeginCommand } from './utils'; +import { BlockType } from './types'; // Put this at the start and end of an inline component to work around this Chromium bug: // https://bugs.chromium.org/p/chromium/issues/detail?id=1249405 @@ -62,6 +46,29 @@ function RenderMentionElement({ ); } +function RenderCommandElement({ + attributes, + element, + children, +}: { element: CommandElement } & RenderElementProps) { + const selected = useSelected(); + const focused = useFocused(); + const editor = useSlate(); + + return ( + + {`/${element.command}`} + {children} + + ); +} function RenderEmoticonElement({ attributes, @@ -200,6 +207,12 @@ export function RenderElement({ attributes, element, children }: RenderElementPr {children} ); + case BlockType.Command: + return ( + + {children} + + ); default: return ( diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 72e2c38c..342dd106 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -25,9 +25,9 @@ import { removeAllMark, toggleBlock, toggleMark, -} from './common'; +} from './utils'; import * as css from './Editor.css'; -import { BlockType, MarkType } from './Elements'; +import { BlockType, MarkType } from './types'; import { HeadingLevel } from './slate'; import { isMacOS } from '../../utils/user-agent'; import { KeySymbol } from '../../utils/key-symbol'; diff --git a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx index d89cda09..e7c8df38 100644 --- a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx +++ b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx @@ -19,6 +19,7 @@ export function AutocompleteMenu({ headerContent, requestClose, children }: Auto focusTrapOptions={{ initialFocus: false, onDeactivate: () => requestClose(), + returnFocusOnDeactivate: false, clickOutsideDeactivates: true, allowOutsideClick: true, isKeyForward: (evt: KeyboardEvent) => isHotkey('arrowdown', evt), diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index 2e556000..bc98667e 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -12,7 +12,7 @@ import { useAsyncSearch, } from '../../../hooks/useAsyncSearch'; import { onTabPress } from '../../../utils/keyboard'; -import { createEmoticonElement, moveCursor, replaceWithElement } from '../common'; +import { createEmoticonElement, moveCursor, replaceWithElement } from '../utils'; import { useRecentEmoji } from '../../../hooks/useRecentEmoji'; import { useRelevantImagePacks } from '../../../hooks/useImagePacks'; import { IEmoji, emojis } from '../../../plugins/emoji'; diff --git a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx index baa217ca..31acd2c5 100644 --- a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx @@ -3,7 +3,7 @@ import { Editor } from 'slate'; import { Avatar, AvatarFallback, AvatarImage, Icon, Icons, MenuItem, Text, color } from 'folds'; import { MatrixClient } from 'matrix-js-sdk'; -import { createMentionElement, moveCursor, replaceWithElement } from '../common'; +import { createMentionElement, moveCursor, replaceWithElement } from '../utils'; import { getRoomAvatarUrl, joinRuleToIconSrc } from '../../../utils/room'; import { roomIdByActivity } from '../../../../util/sort'; import initMatrix from '../../../../client/initMatrix'; diff --git a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx index 00ecb015..a99274a5 100644 --- a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx @@ -13,7 +13,7 @@ import { useAsyncSearch, } from '../../../hooks/useAsyncSearch'; import { onTabPress } from '../../../utils/keyboard'; -import { createMentionElement, moveCursor, replaceWithElement } from '../common'; +import { createMentionElement, moveCursor, replaceWithElement } from '../utils'; import { useKeyDown } from '../../../hooks/useKeyDown'; import { getMxIdLocalPart, getMxIdServer, validMxId } from '../../../utils/matrix'; diff --git a/src/app/components/editor/autocomplete/autocompleteQuery.ts b/src/app/components/editor/autocomplete/autocompleteQuery.ts index 96dabc57..1baa44a1 100644 --- a/src/app/components/editor/autocomplete/autocompleteQuery.ts +++ b/src/app/components/editor/autocomplete/autocompleteQuery.ts @@ -4,11 +4,13 @@ export enum AutocompletePrefix { RoomMention = '#', UserMention = '@', Emoticon = ':', + Command = '/', } export const AUTOCOMPLETE_PREFIXES: readonly AutocompletePrefix[] = [ AutocompletePrefix.RoomMention, AutocompletePrefix.UserMention, AutocompletePrefix.Emoticon, + AutocompletePrefix.Command, ]; export type AutocompleteQuery = { diff --git a/src/app/components/editor/index.ts b/src/app/components/editor/index.ts index 7c63ce61..aae0137d 100644 --- a/src/app/components/editor/index.ts +++ b/src/app/components/editor/index.ts @@ -1,8 +1,9 @@ export * from './autocomplete'; -export * from './common'; +export * from './utils'; export * from './Editor'; export * from './Elements'; export * from './keyboard'; export * from './output'; export * from './Toolbar'; export * from './input'; +export * from './types'; diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 39db0e1b..37aa7244 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -4,7 +4,7 @@ import parse from 'html-dom-parser'; import { ChildNode, Element, isText, isTag } from 'domhandler'; import { sanitizeCustomHtml } from '../../utils/sanitize'; -import { BlockType, MarkType } from './Elements'; +import { BlockType, MarkType } from './types'; import { BlockQuoteElement, CodeBlockElement, @@ -21,7 +21,7 @@ import { UnorderedListElement, } from './slate'; import { parseMatrixToUrl } from '../../utils/matrix'; -import { createEmoticonElement, createMentionElement } from './common'; +import { createEmoticonElement, createMentionElement } from './utils'; const markNodeToType: Record = { b: MarkType.Bold, diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index b6e1c3f4..b6d4d692 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -1,8 +1,8 @@ import { isHotkey } from 'is-hotkey'; import { KeyboardEvent } from 'react'; import { Editor } from 'slate'; -import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './common'; -import { BlockType, MarkType } from './Elements'; +import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './utils'; +import { BlockType, MarkType } from './types'; export const INLINE_HOTKEYS: Record = { 'mod+b': MarkType.Bold, diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 89a5f7c5..307ef8a2 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -1,7 +1,7 @@ import { Descendant, Text } from 'slate'; import { sanitizeText } from '../../utils/sanitize'; -import { BlockType } from './Elements'; +import { BlockType } from './types'; import { CustomElement } from './slate'; import { parseInlineMD } from '../../utils/markdown'; @@ -57,6 +57,8 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { : node.key; case BlockType.Link: return `${node.children}`; + case BlockType.Command: + return `/${node.command}`; default: return children; } @@ -104,6 +106,8 @@ const elementToPlainText = (node: CustomElement, children: string): string => { return node.key.startsWith('mxc://') ? `:${node.shortcode}:` : node.key; case BlockType.Link: return `[${node.children}](${node.href})`; + case BlockType.Command: + return `/${node.command}`; default: return children; } @@ -129,4 +133,12 @@ export const toPlainText = (node: Descendant | Descendant[]): string => { export const customHtmlEqualsPlainText = (customHtml: string, plain: string): boolean => customHtml.replace(//g, '\n') === sanitizeText(plain); -export const trimCustomHtml = (customHtml: string) => customHtml.replace(/$/g, ''); +export const trimCustomHtml = (customHtml: string) => customHtml.replace(/$/g, '').trim(); + +export const trimCommand = (cmdName: string, str: string) => { + const cmdRegX = new RegExp(`^(\\s+)?(\\/${cmdName})([^\\S\n]+)?`); + + const match = str.match(cmdRegX); + if (!match) return str; + return str.slice(match[0].length); +}; diff --git a/src/app/components/editor/slate.d.ts b/src/app/components/editor/slate.d.ts index ee046a08..1b08ae88 100644 --- a/src/app/components/editor/slate.d.ts +++ b/src/app/components/editor/slate.d.ts @@ -1,7 +1,7 @@ import { BaseEditor } from 'slate'; import { ReactEditor } from 'slate-react'; import { HistoryEditor } from 'slate-history'; -import { BlockType } from './Elements'; +import { BlockType } from './types'; export type HeadingLevel = 1 | 2 | 3; @@ -39,8 +39,13 @@ export type EmoticonElement = { shortcode: string; children: Text[]; }; +export type CommandElement = { + type: BlockType.Command; + command: string; + children: Text[]; +}; -export type InlineElement = Text | LinkElement | MentionElement | EmoticonElement; +export type InlineElement = Text | LinkElement | MentionElement | EmoticonElement | CommandElement; export type ParagraphElement = { type: BlockType.Paragraph; @@ -84,6 +89,7 @@ export type CustomElement = | LinkElement | MentionElement | EmoticonElement + | CommandElement | ParagraphElement | HeadingElement | CodeLineElement diff --git a/src/app/components/editor/types.ts b/src/app/components/editor/types.ts new file mode 100644 index 00000000..9a108ec7 --- /dev/null +++ b/src/app/components/editor/types.ts @@ -0,0 +1,24 @@ +export enum MarkType { + Bold = 'bold', + Italic = 'italic', + Underline = 'underline', + StrikeThrough = 'strikeThrough', + Code = 'code', + Spoiler = 'spoiler', +} + +export enum BlockType { + Paragraph = 'paragraph', + Heading = 'heading', + CodeLine = 'code-line', + CodeBlock = 'code-block', + QuoteLine = 'quote-line', + BlockQuote = 'block-quote', + ListItem = 'list-item', + OrderedList = 'ordered-list', + UnorderedList = 'unordered-list', + Mention = 'mention', + Emoticon = 'emoticon', + Link = 'link', + Command = 'command', +} diff --git a/src/app/components/editor/common.ts b/src/app/components/editor/utils.ts similarity index 82% rename from src/app/components/editor/common.ts rename to src/app/components/editor/utils.ts index 68717b38..9bdfde18 100644 --- a/src/app/components/editor/common.ts +++ b/src/app/components/editor/utils.ts @@ -1,6 +1,13 @@ -import { BasePoint, BaseRange, Editor, Element, Point, Range, Transforms } from 'slate'; -import { BlockType, MarkType } from './Elements'; -import { EmoticonElement, FormattedText, HeadingLevel, LinkElement, MentionElement } from './slate'; +import { BasePoint, BaseRange, Editor, Element, Point, Range, Text, Transforms } from 'slate'; +import { BlockType, MarkType } from './types'; +import { + CommandElement, + EmoticonElement, + FormattedText, + HeadingLevel, + LinkElement, + MentionElement, +} from './slate'; const ALL_MARK_TYPE: MarkType[] = [ MarkType.Bold, @@ -54,6 +61,9 @@ const NESTED_BLOCK = [ ]; export const toggleBlock = (editor: Editor, format: BlockType, option?: BlockOption) => { + Transforms.collapse(editor, { + edge: 'end', + }); const isActive = isBlockActive(editor, format); Transforms.unwrapNodes(editor, { @@ -163,17 +173,23 @@ export const createLinkElement = ( children: typeof children === 'string' ? [{ text: children }] : children, }); +export const createCommandElement = (command: string): CommandElement => ({ + type: BlockType.Command, + command, + children: [{ text: '' }], +}); + export const replaceWithElement = (editor: Editor, selectRange: BaseRange, element: Element) => { Transforms.select(editor, selectRange); Transforms.insertNodes(editor, element); + Transforms.collapse(editor, { + edge: 'end', + }); }; export const moveCursor = (editor: Editor, withSpace?: boolean) => { - // without timeout move cursor doesn't works properly. - setTimeout(() => { - Transforms.move(editor); - if (withSpace) editor.insertText(' '); - }, 100); + Transforms.move(editor); + if (withSpace) editor.insertText(' '); }; interface PointUntilCharOptions { @@ -230,3 +246,16 @@ export const isEmptyEditor = (editor: Editor): boolean => { } return false; }; + +export const getBeginCommand = (editor: Editor): string | undefined => { + const lineBlock = editor.children[0]; + if (!Element.isElement(lineBlock)) return undefined; + if (lineBlock.type !== BlockType.Paragraph) return undefined; + + const [firstInline, secondInline] = lineBlock.children; + const isEmptyText = Text.isText(firstInline) && firstInline.text.trim() === ''; + if (!isEmptyText) return undefined; + if (Element.isElement(secondInline) && secondInline.type === BlockType.Command) + return secondInline.command; + return undefined; +}; diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 81730e3d..067ebe39 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -47,6 +47,7 @@ import { useAsyncSearch, UseAsyncSearchOptions } from '../../hooks/useAsyncSearc import { useDebounce } from '../../hooks/useDebounce'; import { useThrottle } from '../../hooks/useThrottle'; import { addRecentEmoji } from '../../plugins/recent-emoji'; +import { mobileOrTablet } from '../../utils/user-agent'; const RECENT_GROUP_ID = 'recent_group'; const SEARCH_GROUP_ID = 'search_group'; @@ -782,7 +783,7 @@ export function EmojiBoard({ maxLength={50} after={} onChange={handleOnChange} - autoFocus + autoFocus={!mobileOrTablet()} /> diff --git a/src/app/components/media/Video.tsx b/src/app/components/media/Video.tsx index ab13c5bd..03108c32 100644 --- a/src/app/components/media/Video.tsx +++ b/src/app/components/media/Video.tsx @@ -5,6 +5,6 @@ import * as css from './media.css'; export const Video = forwardRef>( ({ className, ...props }, ref) => ( // eslint-disable-next-line jsx-a11y/media-has-caption -
    diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index 81c29b03..ae12afb0 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -443,7 +443,7 @@ export const RoomInput = forwardRef( )} {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && ( ( )} {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && ( string +): string[] => [ + member.rawDisplayName === member.userId ? mxIdToName(member.userId) : member.rawDisplayName, + query.startsWith('@') || query.indexOf(':') > -1 ? member.userId : mxIdToName(member.userId), +]; + export const getMemberAvatarMxc = (room: Room, userId: string): string | undefined => { const member = room.getMember(userId); return member?.getMxcAvatarUrl(); From ed3d14b131ee39f4c530681df3de42ae93e34c0c Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:43:37 +1100 Subject: [PATCH 494/824] fix recursive state updates (#1458) --- src/app/organisms/room/RoomInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index ae12afb0..a1fa6c26 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -187,7 +187,7 @@ export const RoomInput = forwardRef( const parsedDraft = JSON.parse(JSON.stringify(editor.children)); setMsgDraft(parsedDraft); } else { - roomIdToMsgDraftAtomFamily.remove(roomId); + setMsgDraft([]); } resetEditor(editor); resetEditorHistory(editor); From a2692e1469c57430545421b616f5f1d648415464 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:43:54 +1100 Subject: [PATCH 495/824] Fix room mention (#1459) * create room mention with alias if possible * display room mention text as they were sent --- .../autocomplete/RoomMentionAutocomplete.tsx | 14 ++++++++------ src/app/components/editor/input.ts | 2 +- src/app/plugins/react-custom-html-parser.tsx | 5 +---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx index 31acd2c5..b9fee878 100644 --- a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx @@ -32,14 +32,14 @@ function UnknownRoomMentionItem({ const mx = useMatrixClient(); const roomAlias: string = roomAliasFromQueryText(mx, query.text); + const handleSelect = () => handleAutocomplete(roomAlias, roomAlias); + return ( ) => - onTabPress(evt, () => handleAutocomplete(roomAlias, roomAlias)) - } - onClick={() => handleAutocomplete(roomAlias, roomAlias)} + onKeyDown={(evt: ReactKeyboardEvent) => onTabPress(evt, handleSelect)} + onClick={handleSelect} before={ @@ -140,15 +140,17 @@ export function RoomMentionAutocomplete({ const avatarUrl = getRoomAvatarUrl(mx, room); const iconSrc = !dm && joinRuleToIconSrc(Icons, room.getJoinRule(), room.isSpaceRoom()); + const handleSelect = () => handleAutocomplete(room.getCanonicalAlias() ?? rId, room.name); + return ( ) => - onTabPress(evt, () => handleAutocomplete(rId, room.name)) + onTabPress(evt, handleSelect) } - onClick={() => handleAutocomplete(room.getCanonicalAlias() ?? rId, room.name)} + onClick={handleSelect} after={ {room.getCanonicalAlias() ?? ''} diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 37aa7244..91386a87 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -74,7 +74,7 @@ const elementToInlineNode = (node: Element): MentionElement | EmoticonElement | if (typeof href !== 'string') return undefined; const [mxId] = parseMatrixToUrl(href); if (mxId) { - return createMentionElement(mxId, mxId, false); + return createMentionElement(mxId, parseNodeText(node) || mxId, false); } } return undefined; diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index aba5997d..09f09d8f 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -180,10 +180,7 @@ export const getReactCustomHtmlParser = ( mentionPrefix === '#' ? getRoomWithCanonicalAlias(mx, mentionId) : mx.getRoom(mentionId); - const mentionName = mentionRoom?.name; - const mentionDisplayName = - mentionName && (mentionName.startsWith('#') ? mentionName : `#${mentionName}`); return ( - {mentionDisplayName ?? mentionId} + {domToReact(children, opts)} ); } From 1d86c6da01bbab2ef6a7c268f17c9bcd6cfdd424 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:44:18 +1100 Subject: [PATCH 496/824] remove twemoji & katex usage (#1460) --- src/util/twemojify.jsx | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/src/util/twemojify.jsx b/src/util/twemojify.jsx index abe82a66..ad203a91 100644 --- a/src/util/twemojify.jsx +++ b/src/util/twemojify.jsx @@ -1,60 +1,31 @@ /* eslint-disable import/prefer-default-export */ -import React, { lazy, Suspense } from 'react'; - import linkifyHtml from 'linkify-html'; import parse from 'html-react-parser'; -import twemoji from 'twemoji'; import { sanitizeText } from './sanitize'; export const TWEMOJI_BASE_URL = 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/'; -const Math = lazy(() => import('../app/atoms/math/Math')); - -const mathOptions = { - replace: (node) => { - const maths = node.attribs?.['data-mx-maths']; - if (maths) { - return ( - {maths}}> - - - ); - } - return null; - }, -}; - /** * @param {string} text - text to twemojify - * @param {object|undefined} opts - options for tweomoji.parse + * @param {object|undefined} opts - DEPRECATED - options for tweomoji.parse * @param {boolean} [linkify=false] - convert links to html tags (default: false) * @param {boolean} [sanitize=true] - sanitize html text (default: true) - * @param {boolean} [maths=false] - render maths (default: false) + * @param {boolean} [maths=false] - DEPRECATED - render maths (default: false) * @returns React component */ -export function twemojify(text, opts, linkify = false, sanitize = true, maths = false) { +export function twemojify(text, opts, linkify = false, sanitize = true) { if (typeof text !== 'string') return text; let content = text; - const options = opts ?? { base: TWEMOJI_BASE_URL }; - if (!options.base) { - options.base = TWEMOJI_BASE_URL; - } if (sanitize) { content = sanitizeText(content); } - content = twemoji.parse(content, options); if (linkify) { content = linkifyHtml(content, { target: '_blank', rel: 'noreferrer noopener', }); } - return parse(content, maths ? mathOptions : null); + return parse(content); } From 5eafa37cddab363cd348c08dc7242d5eeedb5f88 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:41:31 +1100 Subject: [PATCH 497/824] Change loading session message (#1461) --- src/app/organisms/settings/DeviceManage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 7689f0f9..4a4f141c 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -91,7 +91,7 @@ function DeviceManage() {
    - Loading devices... + Loading sessions...
    ); From 144cf7136887e2a31522511d42c3065ba17ade58 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 19 Oct 2023 22:20:38 +1100 Subject: [PATCH 498/824] Add text reaction (#1462) --- src/app/components/emoji-board/EmojiBoard.tsx | 27 ++++++++++++++++++- src/app/organisms/room/message/Message.tsx | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 067ebe39..94ba14c1 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -13,6 +13,7 @@ import React, { import { Badge, Box, + Chip, Icon, IconButton, Icons, @@ -623,6 +624,7 @@ export function EmojiBoard({ onEmojiSelect, onCustomEmojiSelect, onStickerSelect, + allowTextCustomEmoji, }: { tab?: EmojiBoardTab; onTabChange?: (tab: EmojiBoardTab) => void; @@ -632,6 +634,7 @@ export function EmojiBoard({ onEmojiSelect?: (unicode: string, shortcode: string) => void; onCustomEmojiSelect?: (mxc: string, shortcode: string) => void; onStickerSelect?: (mxc: string, shortcode: string) => void; + allowTextCustomEmoji?: boolean; }) { const emojiTab = tab === EmojiBoardTab.Emoji; const stickerTab = tab === EmojiBoardTab.Sticker; @@ -777,11 +780,33 @@ export function EmojiBoard({ {onTabChange && } } + after={ + allowTextCustomEmoji && result?.query ? ( + } + onClick={() => { + const searchInput = document.querySelector( + '[data-emoji-board-search="true"]' + ); + const textReaction = searchInput?.value.trim(); + if (!textReaction) return; + onCustomEmojiSelect?.(textReaction, textReaction); + requestClose(); + }} + > + React + + ) : ( + + ) + } onChange={handleOnChange} autoFocus={!mobileOrTablet()} /> diff --git a/src/app/organisms/room/message/Message.tsx b/src/app/organisms/room/message/Message.tsx index f5d25503..e26f3662 100644 --- a/src/app/organisms/room/message/Message.tsx +++ b/src/app/organisms/room/message/Message.tsx @@ -734,6 +734,7 @@ export const Message = as<'div', MessageProps>( { onReactionToggle(mEvent.getId()!, key); setEmojiBoard(false); From 03af183fb3e1d4fc52a5e96a4005eca32a1c0617 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:39:47 +1100 Subject: [PATCH 499/824] fix wrong following member count on message sent (#1464) --- src/app/hooks/useRoomEventReaders.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/app/hooks/useRoomEventReaders.ts b/src/app/hooks/useRoomEventReaders.ts index f6bac27e..6222bf92 100644 --- a/src/app/hooks/useRoomEventReaders.ts +++ b/src/app/hooks/useRoomEventReaders.ts @@ -3,6 +3,11 @@ import { useEffect, useState } from 'react'; const getEventReaders = (room: Room, evtId?: string) => { if (!evtId) return []; + + // if eventId is locally generated + // we don't have read receipt for it yet + if (!evtId.startsWith('$')) return []; + const liveEvents = room.getLiveTimeline().getEvents(); const userIds: string[] = []; @@ -25,9 +30,25 @@ export const useRoomEventReaders = (room: Room, eventId?: string): string[] => { setReaders(getEventReaders(room, eventId)); }; + const handleLocalEcho: RoomEventHandlerMap[RoomEvent.LocalEchoUpdated] = ( + event, + r, + oldEventId + ) => { + // update members on local event id replaced + // with server generated id + if (r.roomId !== room.roomId || !oldEventId) return; + if (oldEventId.startsWith('$')) return; + if (oldEventId !== eventId) return; + + setReaders(getEventReaders(room, event.getId())); + }; + room.on(RoomEvent.Receipt, handleReceipt); + room.on(RoomEvent.LocalEchoUpdated, handleLocalEcho); return () => { room.removeListener(RoomEvent.Receipt, handleReceipt); + room.removeListener(RoomEvent.LocalEchoUpdated, handleLocalEcho); }; }, [room, eventId]); From 5dc613cd7957e06f2c29692a3b0d6d7e79311860 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 21 Oct 2023 18:14:21 +1100 Subject: [PATCH 500/824] Fix auto read (#1466) * add height to bottom anchor * add width to bottom anchor * add make bottom anchor inline-block * try mark as read on focus receive --- src/app/hooks/useDocumentFocusChange.ts | 25 +++++++++++++++++++++ src/app/organisms/room/RoomTimeline.tsx | 30 ++++++++++++++++++------- 2 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 src/app/hooks/useDocumentFocusChange.ts diff --git a/src/app/hooks/useDocumentFocusChange.ts b/src/app/hooks/useDocumentFocusChange.ts new file mode 100644 index 00000000..ae171b64 --- /dev/null +++ b/src/app/hooks/useDocumentFocusChange.ts @@ -0,0 +1,25 @@ +import { useEffect } from 'react'; + +export const useDocumentFocusChange = (onChange: (focus: boolean) => void) => { + useEffect(() => { + let localFocus = document.hasFocus(); + + const handleFocus = () => { + if (document.hasFocus()) { + if (localFocus) return; + localFocus = true; + onChange(localFocus); + } else if (localFocus) { + localFocus = false; + onChange(localFocus); + } + }; + + document.addEventListener('focusin', handleFocus); + document.addEventListener('focusout', handleFocus); + return () => { + document.removeEventListener('focusin', handleFocus); + document.removeEventListener('focusout', handleFocus); + }; + }, [onChange]); +}; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index bc810812..2a22245a 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -133,6 +133,7 @@ import { MessageEvent } from '../../../types/matrix/room'; import initMatrix from '../../../client/initMatrix'; import { useKeyDown } from '../../hooks/useKeyDown'; import cons from '../../../client/state/cons'; +import { useDocumentFocusChange } from '../../hooks/useDocumentFocusChange'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -606,13 +607,15 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli // keep paginating timeline and conditionally mark as read // otherwise we update timeline without paginating // so timeline can be updated with evt like: edits, reactions etc - if (atBottomRef.current && document.hasFocus()) { - if (!unreadInfo) { - markAsRead(mEvt.getRoomId()); + if (atBottomRef.current) { + if (document.hasFocus() && (!unreadInfo || mEvt.getSender() === mx.getUserId())) { + requestAnimationFrame(() => markAsRead(mEvt.getRoomId())); } - scrollToBottomRef.current.count += 1; - scrollToBottomRef.current.smooth = true; + if (document.hasFocus()) { + scrollToBottomRef.current.count += 1; + scrollToBottomRef.current.smooth = true; + } setTimeline((ct) => ({ ...ct, range: { @@ -627,7 +630,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli setUnreadInfo(getRoomUnreadInfo(room)); } }, - [room, unreadInfo] + [mx, room, unreadInfo] ) ); @@ -665,13 +668,13 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const tryAutoMarkAsRead = useCallback(() => { if (!unreadInfo) { - markAsRead(room.roomId); + requestAnimationFrame(() => markAsRead(room.roomId)); return; } const evtTimeline = getEventTimeline(room, unreadInfo.readUptoEventId); const latestTimeline = evtTimeline && getFirstLinkedTimeline(evtTimeline, Direction.Forward); if (latestTimeline === room.getLiveTimeline()) { - markAsRead(room.roomId); + requestAnimationFrame(() => markAsRead(room.roomId)); } }, [room, unreadInfo]); @@ -705,6 +708,17 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli useCallback(() => atBottomAnchorRef.current, []) ); + useDocumentFocusChange( + useCallback( + (inFocus) => { + if (inFocus && atBottomRef.current) { + tryAutoMarkAsRead(); + } + }, + [tryAutoMarkAsRead] + ) + ); + // Handle up arrow edit useKeyDown( window, From d5ff55e23ed0ade6979e2d87bb48be9349e1ef98 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 21 Oct 2023 18:14:33 +1100 Subject: [PATCH 501/824] Fix hotkeys (#1468) * use hotkey using key instead of which (default) * remove shift from block formatting hotkeys * smartly exit formatting with backspace * set markdown to off by default * exit formatting with escape --- src/app/components/editor/Toolbar.tsx | 23 +++------ .../editor/autocomplete/AutocompleteMenu.tsx | 6 +-- src/app/components/editor/keyboard.ts | 47 +++++++++++++++---- src/app/components/emoji-board/EmojiBoard.tsx | 6 +-- src/app/organisms/room/RoomInput.tsx | 8 ++-- src/app/organisms/room/RoomTimeline.tsx | 4 +- .../organisms/room/message/MessageEditor.tsx | 8 ++-- src/app/state/settings.ts | 2 +- src/app/utils/keyboard.ts | 6 +-- 9 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 342dd106..766a1d83 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -261,33 +261,22 @@ export function Toolbar() { - } + tooltip={} /> - } + tooltip={} /> - } + tooltip={} /> - } + tooltip={} /> @@ -296,7 +285,9 @@ export function Toolbar() { } + tooltip={ + + } /> diff --git a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx index e7c8df38..fc4327da 100644 --- a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx +++ b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from 'react'; import FocusTrap from 'focus-trap-react'; -import isHotkey from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import { Header, Menu, Scroll, config } from 'folds'; import * as css from './AutocompleteMenu.css'; @@ -22,8 +22,8 @@ export function AutocompleteMenu({ headerContent, requestClose, children }: Auto returnFocusOnDeactivate: false, clickOutsideDeactivates: true, allowOutsideClick: true, - isKeyForward: (evt: KeyboardEvent) => isHotkey('arrowdown', evt), - isKeyBackward: (evt: KeyboardEvent) => isHotkey('arrowup', evt), + isKeyForward: (evt: KeyboardEvent) => isKeyHotkey('arrowdown', evt), + isKeyBackward: (evt: KeyboardEvent) => isKeyHotkey('arrowup', evt), }} > diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index b6d4d692..7031749e 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -1,6 +1,6 @@ -import { isHotkey } from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import { KeyboardEvent } from 'react'; -import { Editor } from 'slate'; +import { Editor, Range } from 'slate'; import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './utils'; import { BlockType, MarkType } from './types'; @@ -15,10 +15,10 @@ export const INLINE_HOTKEYS: Record = { const INLINE_KEYS = Object.keys(INLINE_HOTKEYS); export const BLOCK_HOTKEYS: Record = { - 'mod+shift+7': BlockType.OrderedList, - 'mod+shift+8': BlockType.UnorderedList, - "mod+shift+'": BlockType.BlockQuote, - 'mod+shift+;': BlockType.CodeBlock, + 'mod+7': BlockType.OrderedList, + 'mod+8': BlockType.UnorderedList, + "mod+'": BlockType.BlockQuote, + 'mod+;': BlockType.CodeBlock, }; const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); @@ -26,7 +26,36 @@ const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); * @return boolean true if shortcut is toggled. */ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent): boolean => { - if (isHotkey('mod+e', event)) { + if (isKeyHotkey('backspace', event) && editor.selection && Range.isCollapsed(editor.selection)) { + const startPoint = Range.start(editor.selection); + if (startPoint.offset !== 0) return false; + + const [parentNode, parentPath] = Editor.parent(editor, startPoint); + + if (Editor.isEditor(parentNode)) return false; + + if (parentNode.type === BlockType.Heading) { + toggleBlock(editor, BlockType.Paragraph); + return true; + } + if ( + parentNode.type === BlockType.CodeLine || + parentNode.type === BlockType.QuoteLine || + parentNode.type === BlockType.ListItem + ) { + // exit formatting only when line block + // is first of last of it's parent + const parentLocation = { at: parentPath }; + const [previousNode] = Editor.previous(editor, parentLocation) ?? []; + const [nextNode] = Editor.next(editor, parentLocation) ?? []; + if (!previousNode || !nextNode) { + toggleBlock(editor, BlockType.Paragraph); + return true; + } + } + } + + if (isKeyHotkey('mod+e', event) || isKeyHotkey('escape', event)) { if (isAnyMarkActive(editor)) { removeAllMark(editor); return true; @@ -40,7 +69,7 @@ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent { - if (isHotkey(hotkey, event)) { + if (isKeyHotkey(hotkey, event)) { event.preventDefault(); toggleBlock(editor, BLOCK_HOTKEYS[hotkey]); return true; @@ -52,7 +81,7 @@ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent { - if (isHotkey(hotkey, event)) { + if (isKeyHotkey(hotkey, event)) { event.preventDefault(); toggleMark(editor, INLINE_HOTKEYS[hotkey]); return true; diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 94ba14c1..52df9258 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -28,7 +28,7 @@ import { toRem, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import isHotkey from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import classNames from 'classnames'; import { MatrixClient, Room } from 'matrix-js-sdk'; import { atom, useAtomValue, useSetAtom } from 'jotai'; @@ -769,9 +769,9 @@ export function EmojiBoard({ clickOutsideDeactivates: true, allowOutsideClick: true, isKeyForward: (evt: KeyboardEvent) => - !editableActiveElement() && isHotkey(['arrowdown', 'arrowright'], evt), + !editableActiveElement() && isKeyHotkey(['arrowdown', 'arrowright'], evt), isKeyBackward: (evt: KeyboardEvent) => - !editableActiveElement() && isHotkey(['arrowup', 'arrowleft'], evt), + !editableActiveElement() && isKeyHotkey(['arrowup', 'arrowleft'], evt), }} > ( const handleKeyDown: KeyboardEventHandler = useCallback( (evt) => { - if (enterForNewline ? isHotkey('shift+enter', evt) : isHotkey('enter', evt)) { + if (enterForNewline ? isKeyHotkey('shift+enter', evt) : isKeyHotkey('enter', evt)) { evt.preventDefault(); submit(); } - if (isHotkey('escape', evt)) { + if (isKeyHotkey('escape', evt)) { evt.preventDefault(); setReplyDraft(); } @@ -333,7 +333,7 @@ export const RoomInput = forwardRef( const handleKeyUp: KeyboardEventHandler = useCallback( (evt) => { - if (isHotkey('escape', evt)) { + if (isKeyHotkey('escape', evt)) { evt.preventDefault(); return; } diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 2a22245a..0852ecf7 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -43,7 +43,7 @@ import { config, toRem, } from 'folds'; -import isHotkey from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import Linkify from 'linkify-react'; import { decryptFile, @@ -725,7 +725,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli useCallback( (evt) => { if ( - isHotkey('arrowup', evt) && + isKeyHotkey('arrowup', evt) && editableActiveElement() && document.activeElement?.getAttribute('data-editable-name') === 'RoomInput' && isEmptyEditor(editor) diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/organisms/room/message/MessageEditor.tsx index f38cfbef..385042ec 100644 --- a/src/app/organisms/room/message/MessageEditor.tsx +++ b/src/app/organisms/room/message/MessageEditor.tsx @@ -3,7 +3,7 @@ import { Box, Chip, Icon, IconButton, Icons, Line, PopOut, Spinner, Text, as, co import { Editor, Transforms } from 'slate'; import { ReactEditor } from 'slate-react'; import { IContent, MatrixEvent, RelationType, Room } from 'matrix-js-sdk'; -import isHotkey from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import { AUTOCOMPLETE_PREFIXES, AutocompletePrefix, @@ -120,11 +120,11 @@ export const MessageEditor = as<'div', MessageEditorProps>( const handleKeyDown: KeyboardEventHandler = useCallback( (evt) => { - if (enterForNewline ? isHotkey('shift+enter', evt) : isHotkey('enter', evt)) { + if (enterForNewline ? isKeyHotkey('shift+enter', evt) : isKeyHotkey('enter', evt)) { evt.preventDefault(); handleSave(); } - if (isHotkey('escape', evt)) { + if (isKeyHotkey('escape', evt)) { evt.preventDefault(); onCancel(); } @@ -134,7 +134,7 @@ export const MessageEditor = as<'div', MessageEditorProps>( const handleKeyUp: KeyboardEventHandler = useCallback( (evt) => { - if (isHotkey('escape', evt)) { + if (isKeyHotkey('escape', evt)) { evt.preventDefault(); return; } diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index 7770a758..26e3431d 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -28,7 +28,7 @@ export interface Settings { const defaultSettings: Settings = { themeIndex: 0, useSystemTheme: true, - isMarkdown: true, + isMarkdown: false, editorToolbar: false, useSystemEmoji: false, diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts index 56eeb9fc..78aa2521 100644 --- a/src/app/utils/keyboard.ts +++ b/src/app/utils/keyboard.ts @@ -1,4 +1,4 @@ -import isHotkey from 'is-hotkey'; +import { isKeyHotkey } from 'is-hotkey'; import { KeyboardEventHandler } from 'react'; export interface KeyboardEventLike { @@ -12,14 +12,14 @@ export interface KeyboardEventLike { } export const onTabPress = (evt: KeyboardEventLike, callback: () => void) => { - if (isHotkey('tab', evt)) { + if (isKeyHotkey('tab', evt)) { evt.preventDefault(); callback(); } }; export const preventScrollWithArrowKey: KeyboardEventHandler = (evt) => { - if (isHotkey(['arrowup', 'arrowright', 'arrowdown', 'arrowleft'], evt)) { + if (isKeyHotkey(['arrowup', 'arrowright', 'arrowdown', 'arrowleft'], evt)) { evt.preventDefault(); } }; From 9200e22a7e0a8a1b15067bd8f4cc09295879452d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:16:36 +1100 Subject: [PATCH 502/824] fix backward delete with previous empty line (#1469) --- src/app/components/editor/keyboard.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index 7031749e..2ea2dbe1 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -1,6 +1,6 @@ import { isKeyHotkey } from 'is-hotkey'; import { KeyboardEvent } from 'react'; -import { Editor, Range } from 'slate'; +import { Editor, Element as SlateElement, Range, Transforms } from 'slate'; import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './utils'; import { BlockType, MarkType } from './types'; @@ -31,6 +31,9 @@ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent Date: Sat, 21 Oct 2023 21:36:13 +1100 Subject: [PATCH 503/824] Update default server list in config.json (#1467) * Remove halogen.city * Update config.json * Update config.json --- config.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config.json b/config.json index c919882f..ac7b1f32 100644 --- a/config.json +++ b/config.json @@ -1,11 +1,13 @@ { "defaultHomeserver": 3, "homeserverList": [ + "0wnz.at", "converser.eu", "envs.net", - "halogen.city", "matrix.org", - "mozilla.org" + "monero.social", + "mozilla.org", + "xmr.se" ], "allowCustomHomeservers": true } From b80f801d235f1253acfae8db87b00a687b246a06 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:37:30 +1100 Subject: [PATCH 504/824] Release v3.0.0 (#1463) * Release v3.0.0 * Update package-lock.json * Update cons.js --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7354f3d5..8c2e80d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "2.2.6", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "2.2.6", + "version": "3.0.0", "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index 8f37636c..0f1bfa75 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "2.2.6", + "version": "3.0.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 873c4e33..5d29d1df 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '2.2.6', + version: '3.0.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 1ff312d236bc8ad9cad02bd421d0e8e3a00a47e2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:42:27 +1100 Subject: [PATCH 505/824] Fix edit related bugs (#1477) * fix missing empty line on edit * fix edit save after adding formatting to plaintext * fix reading edit content with wrong key --- src/app/components/editor/input.ts | 3 ++ src/app/organisms/room/RoomTimeline.tsx | 10 +++--- .../organisms/room/message/MessageEditor.tsx | 31 ++++++++++++------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 91386a87..5860df04 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -138,6 +138,7 @@ const parseBlockquoteNode = (node: Element): BlockQuoteElement => { } if (isTag(child)) { if (child.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } @@ -202,6 +203,7 @@ const parseListNode = (node: Element): OrderedListElement | UnorderedListElement } if (isTag(child)) { if (child.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } @@ -260,6 +262,7 @@ export const domToEditorInput = (domNodes: ChildNode[]): Descendant[] => { } if (isTag(node)) { if (node.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 0852ecf7..2cfbd658 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -615,6 +615,8 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (document.hasFocus()) { scrollToBottomRef.current.count += 1; scrollToBottomRef.current.smooth = true; + } else if (!unreadInfo) { + setUnreadInfo(getRoomUnreadInfo(room)); } setTimeline((ct) => ({ ...ct, @@ -919,7 +921,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (!replyEvt) return; const editedReply = getEditedEvent(replyId, replyEvt, room.getUnfilteredTimelineSet()); const { body, formatted_body: formattedBody }: Record = - editedReply?.getContent()['m.new.content'] ?? replyEvt.getContent(); + editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent(); const senderId = replyEvt.getSender(); if (senderId && typeof body === 'string') { setReplyDraft({ @@ -982,7 +984,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderText: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; return ( @@ -1002,7 +1004,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderEmote: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody } = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); const senderId = mEvent.getSender() ?? ''; const senderDisplayName = @@ -1027,7 +1029,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderNotice: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; return ( diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/organisms/room/message/MessageEditor.tsx index 385042ec..776e1d4d 100644 --- a/src/app/organisms/room/message/MessageEditor.tsx +++ b/src/app/organisms/room/message/MessageEditor.tsx @@ -53,16 +53,22 @@ export const MessageEditor = as<'div', MessageEditorProps>( const [autocompleteQuery, setAutocompleteQuery] = useState>(); - const getPrevBodyAndFormattedBody = useCallback(() => { + const getPrevBodyAndFormattedBody = useCallback((): [ + string | undefined, + string | undefined + ] => { const evtId = mEvent.getId()!; const evtTimeline = room.getTimelineForEvent(evtId); const editedEvent = evtTimeline && getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet()); const { body, formatted_body: customHtml }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); - return [body, customHtml]; + return [ + typeof body === 'string' ? body : undefined, + typeof customHtml === 'string' ? customHtml : undefined, + ]; }, [room, mEvent]); const [saveState, save] = useAsyncCallback( @@ -78,14 +84,17 @@ export const MessageEditor = as<'div', MessageEditorProps>( const [prevBody, prevCustomHtml] = getPrevBodyAndFormattedBody(); if (plainText === '') return undefined; - if ( - typeof prevCustomHtml === 'string' && - trimReplyFromFormattedBody(prevCustomHtml) === customHtml - ) { - return undefined; - } - if (!prevCustomHtml && typeof prevBody === 'string' && prevBody === plainText) { - return undefined; + if (prevBody) { + if (prevCustomHtml && trimReplyFromFormattedBody(prevCustomHtml) === customHtml) { + return undefined; + } + if ( + !prevCustomHtml && + prevBody === plainText && + customHtmlEqualsPlainText(customHtml, plainText) + ) { + return undefined; + } } const newContent: IContent = { From c0abb0d50da8ae03fa184514c4dfdf4479635f99 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:43:07 +1100 Subject: [PATCH 506/824] fix thread fallback (#1478) --- src/app/hooks/useRoomLatestRenderedEvent.ts | 4 ++-- src/app/organisms/room/RoomTimeline.tsx | 3 ++- src/app/utils/room.ts | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/app/hooks/useRoomLatestRenderedEvent.ts b/src/app/hooks/useRoomLatestRenderedEvent.ts index 428e7b52..fd0ed9e5 100644 --- a/src/app/hooks/useRoomLatestRenderedEvent.ts +++ b/src/app/hooks/useRoomLatestRenderedEvent.ts @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'; import { settingsAtom } from '../state/settings'; import { useSetting } from '../state/hooks/settings'; import { MessageEvent, StateEvent } from '../../types/matrix/room'; -import { isMembershipChanged } from '../utils/room'; +import { isMembershipChanged, reactionOrEditEvent } from '../utils/room'; export const useRoomLatestRenderedEvent = (room: Room) => { const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); @@ -19,7 +19,7 @@ export const useRoomLatestRenderedEvent = (room: Room) => { const evt = liveEvents[i]; if (!evt) continue; - if (evt.isRelation()) continue; + if (reactionOrEditEvent(evt)) continue; if (evt.getType() === StateEvent.RoomMember) { const membershipChanged = isMembershipChanged(evt); if (membershipChanged && hideMembershipEvents) continue; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 2cfbd658..09f33260 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -86,6 +86,7 @@ import { getMemberDisplayName, getReactionContent, isMembershipChanged, + reactionOrEditEvent, } from '../../utils/room'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; @@ -1632,7 +1633,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli prevEvent.getType() === mEvent.getType() && minuteDifference(prevEvent.getTs(), mEvent.getTs()) < 2; - const eventJSX = mEvent.isRelation() + const eventJSX = reactionOrEditEvent(mEvent) ? null : renderMatrixEvent(mEventId, mEvent, item, timelineSet, collapsed); prevEvent = mEvent; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index 1c015a1f..adb6dc08 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -380,3 +380,7 @@ export const getLatestEditableEvt = ( } return undefined; }; + +export const reactionOrEditEvent = (mEvent: MatrixEvent) => + mEvent.getRelation()?.rel_type === RelationType.Annotation || + mEvent.getRelation()?.rel_type === RelationType.Replace; From 122ff2d21670b715d2b1d16f7832bf43364ed3fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:49:38 +1100 Subject: [PATCH 507/824] Bump thollander/actions-comment-pull-request from 2.4.0 to 2.4.3 (#1480) Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2.4.0 to 2.4.3. - [Release notes](https://github.com/thollander/actions-comment-pull-request/releases) - [Commits](https://github.com/thollander/actions-comment-pull-request/compare/dadb7667129e23f12ca3925c90dc5cd7121ab57e...1d3973dc4b8e1399c0620d3f2b1aa5e795465308) --- updated-dependencies: - dependency-name: thollander/actions-comment-pull-request dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index c4d82436..3ea1d6b0 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -45,7 +45,7 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_PR_CINNY }} timeout-minutes: 1 - name: Comment preview on PR - uses: thollander/actions-comment-pull-request@dadb7667129e23f12ca3925c90dc5cd7121ab57e + uses: thollander/actions-comment-pull-request@1d3973dc4b8e1399c0620d3f2b1aa5e795465308 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 7b64258af6be85036fa051d7bd09cfcc6533aa15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 22:03:00 +1100 Subject: [PATCH 508/824] Bump actions/setup-node from 3.6.0 to 3.8.1 (#1401) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.6.0 to 3.8.1. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3.6.0...v3.8.1) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index d7731055..f2f93feb 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Setup node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.8.1 with: node-version: 18.12.1 cache: "npm" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 8935c510..15698e17 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Setup node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.8.1 with: node-version: 18.12.1 cache: "npm" diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 66f40523..d42eef8e 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v3.5.3 - name: Setup node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.8.1 with: node-version: 18.12.1 cache: "npm" From 8731f58948dcd015c5880d42a5fe6eb832519a0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 22:05:38 +1100 Subject: [PATCH 509/824] Bump nwtgck/actions-netlify from 2.0.0 to 2.1.0 (#1402) Bumps [nwtgck/actions-netlify](https://github.com/nwtgck/actions-netlify) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/nwtgck/actions-netlify/releases) - [Changelog](https://github.com/nwtgck/actions-netlify/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nwtgck/actions-netlify/compare/5da65c9f74c7961c5501a3ba329b8d0912f39c03...7a92f00dde8c92a5a9e8385ec2919775f7647352) --- updated-dependencies: - dependency-name: nwtgck/actions-netlify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 3ea1d6b0..12eabbe4 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -32,7 +32,7 @@ jobs: path: dist - name: Deploy to Netlify id: netlify - uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 + uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 with: publish-dir: dist deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 15698e17..411b6e3e 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -24,7 +24,7 @@ jobs: NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 + uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 with: publish-dir: dist deploy-message: "Dev deploy ${{ github.sha }}" diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index d42eef8e..63fc342c 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -23,7 +23,7 @@ jobs: NODE_OPTIONS: "--max_old_space_size=4096" run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@5da65c9f74c7961c5501a3ba329b8d0912f39c03 + uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 with: publish-dir: dist deploy-message: "Prod deploy ${{ github.ref_name }}" From c7e5c1fce813af88eba15d62c9294d53d2b858b8 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 24 Oct 2023 22:21:39 +1100 Subject: [PATCH 510/824] Fix reply username overflow (#1501) * fix reply overflow * fix shrinkable typing indicator * fix message avatar hover & cursor --- src/app/components/message/Reply.tsx | 6 +++++- src/app/components/message/layout/layout.css.ts | 2 +- src/app/components/typing-indicator/TypingIndicator.tsx | 1 + src/app/organisms/room/message/Message.tsx | 8 +++++++- src/app/organisms/room/message/styles.css.ts | 4 ++++ 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/app/components/message/Reply.tsx b/src/app/components/message/Reply.tsx index a8800fa8..6eaab31e 100644 --- a/src/app/components/message/Reply.tsx +++ b/src/app/components/message/Reply.tsx @@ -67,7 +67,11 @@ export const Reply = as<'div', ReplyProps>( {...props} ref={ref} > - + {sender && ( diff --git a/src/app/components/message/layout/layout.css.ts b/src/app/components/message/layout/layout.css.ts index ff31baa5..7b1a267d 100644 --- a/src/app/components/message/layout/layout.css.ts +++ b/src/app/components/message/layout/layout.css.ts @@ -118,8 +118,8 @@ export const CompactHeader = style([ export const AvatarBase = style({ paddingTop: toRem(4), - cursor: 'pointer', transition: 'transform 200ms cubic-bezier(0, 0.8, 0.67, 0.97)', + alignSelf: 'start', selectors: { '&:hover': { diff --git a/src/app/components/typing-indicator/TypingIndicator.tsx b/src/app/components/typing-indicator/TypingIndicator.tsx index 33690359..e5255873 100644 --- a/src/app/components/typing-indicator/TypingIndicator.tsx +++ b/src/app/components/typing-indicator/TypingIndicator.tsx @@ -10,6 +10,7 @@ export const TypingIndicator = as<'div', TypingIndicatorProps>(({ size, style, . ( const avatarJSX = !collapse && messageLayout !== 1 && ( - + {senderAvatarMxc ? ( Date: Wed, 25 Oct 2023 16:50:38 +1100 Subject: [PATCH 511/824] Room input improvements (#1502) * prevent context menu when editing message * send sticker body (#1479) * update emojiboard search text reaction input label * stop generating upload image thumbnail (#1475) * maintain upload order * Fix message options spinner variant * add markdown toggle in editor toolbar * fix heading toggle icon update with cursor move * add hotkeys for heading * change editor markdown btn style * use Ctrl + Enter to send message (#1470) * fix reaction tooltip word-break * add shift in editor hokeys with number * stop parsing markdown in link --- src/app/components/editor/Editor.css.ts | 4 + src/app/components/editor/Toolbar.tsx | 92 ++++++++++++++++--- src/app/components/editor/keyboard.ts | 19 +++- src/app/components/editor/utils.ts | 10 ++ src/app/components/emoji-board/EmojiBoard.tsx | 12 ++- src/app/organisms/room/RoomInput.tsx | 37 +++----- src/app/organisms/room/message/Message.tsx | 6 +- .../organisms/room/message/MessageEditor.tsx | 2 +- src/app/organisms/room/message/Reactions.tsx | 2 +- src/app/organisms/room/message/styles.css.ts | 4 + src/app/organisms/room/msgContent.ts | 13 --- src/app/organisms/settings/Settings.jsx | 4 +- src/app/utils/markdown.ts | 28 ++++-- 13 files changed, 162 insertions(+), 71 deletions(-) diff --git a/src/app/components/editor/Editor.css.ts b/src/app/components/editor/Editor.css.ts index edce743f..09a444ec 100644 --- a/src/app/components/editor/Editor.css.ts +++ b/src/app/components/editor/Editor.css.ts @@ -66,3 +66,7 @@ export const EditorToolbarBase = style({ export const EditorToolbar = style({ padding: config.space.S100, }); + +export const MarkdownBtnBox = style({ + paddingRight: config.space.S100, +}); diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 766a1d83..6feae009 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -19,6 +19,7 @@ import { import React, { ReactNode, useState } from 'react'; import { ReactEditor, useSlate } from 'slate-react'; import { + headingLevel, isAnyMarkActive, isBlockActive, isMarkActive, @@ -31,6 +32,8 @@ import { BlockType, MarkType } from './types'; import { HeadingLevel } from './slate'; import { isMacOS } from '../../utils/user-agent'; import { KeySymbol } from '../../utils/key-symbol'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; function BtnTooltip({ text, shortCode }: { text: string; shortCode?: string }) { return ( @@ -115,13 +118,13 @@ export function BlockButton({ format, icon, tooltip }: BlockButtonProps) { export function HeadingBlockButton() { const editor = useSlate(); - const [level, setLevel] = useState(1); + const level = headingLevel(editor); const [open, setOpen] = useState(false); const isActive = isBlockActive(editor, BlockType.Heading); + const modKey = isMacOS() ? KeySymbol.Command : 'Ctrl'; const handleMenuSelect = (selectedLevel: HeadingLevel) => { setOpen(false); - setLevel(selectedLevel); toggleBlock(editor, BlockType.Heading, { level: selectedLevel }); ReactEditor.focus(editor); }; @@ -130,7 +133,6 @@ export function HeadingBlockButton() { - handleMenuSelect(1)} size="400" radii="300"> - - - handleMenuSelect(2)} size="400" radii="300"> - - - handleMenuSelect(3)} size="400" radii="300"> - - + } + delay={500} + > + {(triggerRef) => ( + handleMenuSelect(1)} + size="400" + radii="300" + > + + + )} + + } + delay={500} + > + {(triggerRef) => ( + handleMenuSelect(2)} + size="400" + radii="300" + > + + + )} + + } + delay={500} + > + {(triggerRef) => ( + handleMenuSelect(3)} + size="400" + radii="300" + > + + + )} + @@ -169,7 +207,7 @@ export function HeadingBlockButton() { size="400" radii="300" > - + )} @@ -210,8 +248,10 @@ export function ExitFormatting({ tooltip }: ExitFormattingProps) { export function Toolbar() { const editor = useSlate(); const modKey = isMacOS() ? KeySymbol.Command : 'Ctrl'; + const disableInline = isBlockActive(editor, BlockType.CodeBlock); const canEscape = isAnyMarkActive(editor) || !isBlockActive(editor, BlockType.Paragraph); + const [isMarkdown, setIsMarkdown] = useSetting(settingsAtom, 'isMarkdown'); return ( @@ -271,12 +311,12 @@ export function Toolbar() { } + tooltip={} /> } + tooltip={} /> @@ -292,6 +332,28 @@ export function Toolbar() { )} + + } + delay={500} + > + {(triggerRef) => ( + setIsMarkdown(!isMarkdown)} + aria-pressed={isMarkdown} + size="300" + radii="300" + disabled={disableInline || !!isAnyMarkActive(editor)} + > + + + )} + + + diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index 2ea2dbe1..370f3e82 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -15,12 +15,15 @@ export const INLINE_HOTKEYS: Record = { const INLINE_KEYS = Object.keys(INLINE_HOTKEYS); export const BLOCK_HOTKEYS: Record = { - 'mod+7': BlockType.OrderedList, - 'mod+8': BlockType.UnorderedList, + 'mod+shift+7': BlockType.OrderedList, + 'mod+shift+8': BlockType.UnorderedList, "mod+'": BlockType.BlockQuote, 'mod+;': BlockType.CodeBlock, }; const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); +const isHeading1 = isKeyHotkey('mod+shift+1'); +const isHeading2 = isKeyHotkey('mod+shift+2'); +const isHeading3 = isKeyHotkey('mod+shift+3'); /** * @return boolean true if shortcut is toggled. @@ -86,6 +89,18 @@ export const toggleKeyboardShortcut = (editor: Editor, event: KeyboardEvent { return !!match; }; +export const headingLevel = (editor: Editor): HeadingLevel | undefined => { + const [nodeEntry] = Editor.nodes(editor, { + match: (node) => Element.isElement(node) && node.type === BlockType.Heading, + }); + const [node] = nodeEntry ?? []; + if (!node) return undefined; + if ('level' in node) return node.level; + return undefined; +}; + type BlockOption = { level: HeadingLevel }; const NESTED_BLOCK = [ BlockType.OrderedList, diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 52df9258..5452722f 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -68,6 +68,7 @@ export type EmojiItemInfo = { type: EmojiType; data: string; shortcode: string; + label: string; }; const getDOMGroupId = (id: string): string => `EmojiBoardGroup-${id}`; @@ -75,13 +76,15 @@ const getDOMGroupId = (id: string): string => `EmojiBoardGroup-${id}`; const getEmojiItemInfo = (element: Element): EmojiItemInfo | undefined => { const type = element.getAttribute('data-emoji-type') as EmojiType | undefined; const data = element.getAttribute('data-emoji-data'); + const label = element.getAttribute('title'); const shortcode = element.getAttribute('data-emoji-shortcode'); - if (type && data && shortcode) + if (type && data && shortcode && label) return { type, data, shortcode, + label, }; return undefined; }; @@ -633,7 +636,7 @@ export function EmojiBoard({ returnFocusOnDeactivate?: boolean; onEmojiSelect?: (unicode: string, shortcode: string) => void; onCustomEmojiSelect?: (mxc: string, shortcode: string) => void; - onStickerSelect?: (mxc: string, shortcode: string) => void; + onStickerSelect?: (mxc: string, shortcode: string, label: string) => void; allowTextCustomEmoji?: boolean; }) { const emojiTab = tab === EmojiBoardTab.Emoji; @@ -712,7 +715,7 @@ export function EmojiBoard({ if (!evt.altKey && !evt.shiftKey) requestClose(); } if (emojiInfo.type === EmojiType.Sticker) { - onStickerSelect?.(emojiInfo.data, emojiInfo.shortcode); + onStickerSelect?.(emojiInfo.data, emojiInfo.shortcode, emojiInfo.label); if (!evt.altKey && !evt.shiftKey) requestClose(); } }; @@ -783,7 +786,7 @@ export function EmojiBoard({ data-emoji-board-search variant="SurfaceVariant" size="400" - placeholder="Search" + placeholder={allowTextCustomEmoji ? 'Search or Text Reaction ' : 'Search'} maxLength={50} after={ allowTextCustomEmoji && result?.query ? ( @@ -791,6 +794,7 @@ export function EmojiBoard({ variant="Primary" radii="Pill" after={} + outlined onClick={() => { const searchInput = document.querySelector( '[data-emoji-board-search="true"]' diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index f7b219be..8dc4e644 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -29,7 +29,6 @@ import { config, toRem, } from 'folds'; -import to from 'await-to-js'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { @@ -216,30 +215,24 @@ export const RoomInput = forwardRef( }; const handleSendUpload = async (uploads: UploadSuccess[]) => { - const sendPromises = uploads.map(async (upload) => { + const contentsPromises = uploads.map(async (upload) => { const fileItem = selectedFiles.find((f) => f.file === upload.file); - if (fileItem && fileItem.file.type.startsWith('image')) { - const [imgError, imgContent] = await to(getImageMsgContent(mx, fileItem, upload.mxc)); - if (imgError) console.warn(imgError); - if (imgContent) mx.sendMessage(roomId, imgContent); - return; + if (!fileItem) throw new Error('Broken upload'); + + if (fileItem.file.type.startsWith('image')) { + return getImageMsgContent(mx, fileItem, upload.mxc); } - if (fileItem && fileItem.file.type.startsWith('video')) { - const [videoError, videoContent] = await to(getVideoMsgContent(mx, fileItem, upload.mxc)); - if (videoError) console.warn(videoError); - if (videoContent) mx.sendMessage(roomId, videoContent); - return; + if (fileItem.file.type.startsWith('video')) { + return getVideoMsgContent(mx, fileItem, upload.mxc); } - if (fileItem && fileItem.file.type.startsWith('audio')) { - mx.sendMessage(roomId, getAudioMsgContent(fileItem, upload.mxc)); - return; - } - if (fileItem) { - mx.sendMessage(roomId, getFileMsgContent(fileItem, upload.mxc)); + if (fileItem.file.type.startsWith('audio')) { + return getAudioMsgContent(fileItem, upload.mxc); } + return getFileMsgContent(fileItem, upload.mxc); }); handleCancelUpload(uploads); - await Promise.allSettled(sendPromises); + const contents = fulfilledPromiseSettledResult(await Promise.allSettled(contentsPromises)); + contents.forEach((content) => mx.sendMessage(roomId, content)); }; const submit = useCallback(() => { @@ -319,7 +312,7 @@ export const RoomInput = forwardRef( const handleKeyDown: KeyboardEventHandler = useCallback( (evt) => { - if (enterForNewline ? isKeyHotkey('shift+enter', evt) : isKeyHotkey('enter', evt)) { + if (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) { evt.preventDefault(); submit(); } @@ -359,7 +352,7 @@ export const RoomInput = forwardRef( moveCursor(editor); }; - const handleStickerSelect = async (mxc: string, shortcode: string) => { + const handleStickerSelect = async (mxc: string, shortcode: string, label: string) => { const stickerUrl = mx.mxcUrlToHttp(mxc); if (!stickerUrl) return; @@ -369,7 +362,7 @@ export const RoomInput = forwardRef( ); mx.sendEvent(roomId, EventType.Sticker, { - body: shortcode, + body: label, url: mxc, info, }); diff --git a/src/app/organisms/room/message/Message.tsx b/src/app/organisms/room/message/Message.tsx index 14996a9a..25d894f3 100644 --- a/src/app/organisms/room/message/Message.tsx +++ b/src/app/organisms/room/message/Message.tsx @@ -392,7 +392,7 @@ export const MessageDeleteItem = as< variant="Critical" before={ deleteState.status === AsyncStatus.Loading ? ( - + ) : undefined } aria-disabled={deleteState.status === AsyncStatus.Loading} @@ -522,7 +522,7 @@ export const MessageReportItem = as< variant="Critical" before={ reportState.status === AsyncStatus.Loading ? ( - + ) : undefined } aria-disabled={ @@ -702,7 +702,7 @@ export const Message = as<'div', MessageProps>( ); const handleContextMenu: MouseEventHandler = (evt) => { - if (evt.altKey || !window.getSelection()?.isCollapsed) return; + if (evt.altKey || !window.getSelection()?.isCollapsed || edit) return; const tag = (evt.target as any).tagName; if (typeof tag === 'string' && tag.toLowerCase() === 'a') return; evt.preventDefault(); diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/organisms/room/message/MessageEditor.tsx index 776e1d4d..0756c38e 100644 --- a/src/app/organisms/room/message/MessageEditor.tsx +++ b/src/app/organisms/room/message/MessageEditor.tsx @@ -129,7 +129,7 @@ export const MessageEditor = as<'div', MessageEditorProps>( const handleKeyDown: KeyboardEventHandler = useCallback( (evt) => { - if (enterForNewline ? isKeyHotkey('shift+enter', evt) : isKeyHotkey('enter', evt)) { + if (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) { evt.preventDefault(); handleSave(); } diff --git a/src/app/organisms/room/message/Reactions.tsx b/src/app/organisms/room/message/Reactions.tsx index bc32c1a3..17b914e5 100644 --- a/src/app/organisms/room/message/Reactions.tsx +++ b/src/app/organisms/room/message/Reactions.tsx @@ -68,7 +68,7 @@ export const Reactions = as<'div', ReactionsProps>( position="Top" tooltip={ - + diff --git a/src/app/organisms/room/message/styles.css.ts b/src/app/organisms/room/message/styles.css.ts index 9cb0f2ef..a5f2f6b5 100644 --- a/src/app/organisms/room/message/styles.css.ts +++ b/src/app/organisms/room/message/styles.css.ts @@ -79,3 +79,7 @@ export const ReactionsContainer = style({ }, }, }); + +export const ReactionsTooltipText = style({ + wordBreak: 'break-all', +}); diff --git a/src/app/organisms/room/msgContent.ts b/src/app/organisms/room/msgContent.ts index e4cf1cbc..0760ec9e 100644 --- a/src/app/organisms/room/msgContent.ts +++ b/src/app/organisms/room/msgContent.ts @@ -54,23 +54,10 @@ export const getImageMsgContent = async ( }; if (imgEl) { const blurHash = encodeBlurHash(imgEl, 512, scaleYDimension(imgEl.width, 512, imgEl.height)); - const [thumbError, thumbContent] = await to( - generateThumbnailContent( - mx, - imgEl, - getThumbnailDimensions(imgEl.width, imgEl.height), - !!encInfo - ) - ); - if (thumbContent && thumbContent.thumbnail_info) { - thumbContent.thumbnail_info[MATRIX_BLUR_HASH_PROPERTY_NAME] = blurHash; - } - if (thumbError) console.warn(thumbError); content.info = { ...getImageInfo(imgEl, file), [MATRIX_BLUR_HASH_PROPERTY_NAME]: blurHash, - ...thumbContent, }; } if (encInfo) { diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 962a80b6..ae094eff 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -45,6 +45,8 @@ import CinnySVG from '../../../../public/res/svg/cinny.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; +import { isMacOS } from '../../utils/user-agent'; +import { KeySymbol } from '../../utils/key-symbol'; function AppearanceSection() { const [, updateState] = useState({}); @@ -147,7 +149,7 @@ function AppearanceSection() { onToggle={() => setEnterForNewline(!enterForNewline) } /> )} - content={Use SHIFT + ENTER to send message and ENTER for newline.} + content={{`Use ${isMacOS() ? KeySymbol.Command : 'Ctrl'} + ENTER to send message and ENTER for newline.`}} /> string | undefined; const MIN_ANY = '(.+?)'; +const URL_NEG_LB = '(? text.match(BOLD_REG_1), html: (parse, match) => { const [, g1] = match; - const child = parse(g1); - return `${child}`; + return `${parse(g1)}`; }, }; const ITALIC_MD_1 = '*'; const ITALIC_PREFIX_1 = '\\*'; const ITALIC_NEG_LA_1 = '(?!\\*)'; -const ITALIC_REG_1 = new RegExp(`${ITALIC_PREFIX_1}${MIN_ANY}${ITALIC_PREFIX_1}${ITALIC_NEG_LA_1}`); +const ITALIC_REG_1 = new RegExp( + `${URL_NEG_LB}${ITALIC_PREFIX_1}${MIN_ANY}${ITALIC_PREFIX_1}${ITALIC_NEG_LA_1}` +); const ItalicRule1: MDRule = { match: (text) => text.match(ITALIC_REG_1), html: (parse, match) => { @@ -52,7 +56,9 @@ const ItalicRule1: MDRule = { const ITALIC_MD_2 = '_'; const ITALIC_PREFIX_2 = '_'; const ITALIC_NEG_LA_2 = '(?!_)'; -const ITALIC_REG_2 = new RegExp(`${ITALIC_PREFIX_2}${MIN_ANY}${ITALIC_PREFIX_2}${ITALIC_NEG_LA_2}`); +const ITALIC_REG_2 = new RegExp( + `${URL_NEG_LB}${ITALIC_PREFIX_2}${MIN_ANY}${ITALIC_PREFIX_2}${ITALIC_NEG_LA_2}` +); const ItalicRule2: MDRule = { match: (text) => text.match(ITALIC_REG_2), html: (parse, match) => { @@ -65,7 +71,7 @@ const UNDERLINE_MD_1 = '__'; const UNDERLINE_PREFIX_1 = '_{2}'; const UNDERLINE_NEG_LA_1 = '(?!_)'; const UNDERLINE_REG_1 = new RegExp( - `${UNDERLINE_PREFIX_1}${MIN_ANY}${UNDERLINE_PREFIX_1}${UNDERLINE_NEG_LA_1}` + `${URL_NEG_LB}${UNDERLINE_PREFIX_1}${MIN_ANY}${UNDERLINE_PREFIX_1}${UNDERLINE_NEG_LA_1}` ); const UnderlineRule: MDRule = { match: (text) => text.match(UNDERLINE_REG_1), @@ -78,7 +84,9 @@ const UnderlineRule: MDRule = { const STRIKE_MD_1 = '~~'; const STRIKE_PREFIX_1 = '~{2}'; const STRIKE_NEG_LA_1 = '(?!~)'; -const STRIKE_REG_1 = new RegExp(`${STRIKE_PREFIX_1}${MIN_ANY}${STRIKE_PREFIX_1}${STRIKE_NEG_LA_1}`); +const STRIKE_REG_1 = new RegExp( + `${URL_NEG_LB}${STRIKE_PREFIX_1}${MIN_ANY}${STRIKE_PREFIX_1}${STRIKE_NEG_LA_1}` +); const StrikeRule: MDRule = { match: (text) => text.match(STRIKE_REG_1), html: (parse, match) => { @@ -90,7 +98,9 @@ const StrikeRule: MDRule = { const CODE_MD_1 = '`'; const CODE_PREFIX_1 = '`'; const CODE_NEG_LA_1 = '(?!`)'; -const CODE_REG_1 = new RegExp(`${CODE_PREFIX_1}${MIN_ANY}${CODE_PREFIX_1}${CODE_NEG_LA_1}`); +const CODE_REG_1 = new RegExp( + `${URL_NEG_LB}${CODE_PREFIX_1}${MIN_ANY}${CODE_PREFIX_1}${CODE_NEG_LA_1}` +); const CodeRule: MDRule = { match: (text) => text.match(CODE_REG_1), html: (parse, match) => { @@ -103,7 +113,7 @@ const SPOILER_MD_1 = '||'; const SPOILER_PREFIX_1 = '\\|{2}'; const SPOILER_NEG_LA_1 = '(?!\\|)'; const SPOILER_REG_1 = new RegExp( - `${SPOILER_PREFIX_1}${MIN_ANY}${SPOILER_PREFIX_1}${SPOILER_NEG_LA_1}` + `${URL_NEG_LB}${SPOILER_PREFIX_1}${MIN_ANY}${SPOILER_PREFIX_1}${SPOILER_NEG_LA_1}` ); const SpoilerRule: MDRule = { match: (text) => text.match(SPOILER_REG_1), From f53bb28b66cfb56ce7549608283dd6004745e6ce Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 26 Oct 2023 09:09:27 +1100 Subject: [PATCH 512/824] Fix emoji and other related bugs (#1504) * make system-emoji default & twitter emoji optional * add mozilla twemoji-colr credit * fix wrong audio duration * set locales to empty in member count millify * render system emoji as same size of custom emoji --- src/app/organisms/room/MembersDrawer.tsx | 2 +- src/app/organisms/room/RoomTimeline.tsx | 8 ++- .../organisms/room/message/AudioContent.tsx | 3 +- src/app/organisms/settings/Settings.jsx | 14 ++-- src/app/plugins/react-custom-html-parser.tsx | 70 +++++++++++++------ src/app/state/settings.ts | 4 +- src/app/styles/CustomHtml.css.ts | 4 +- src/app/templates/client/Client.jsx | 8 +-- src/app/utils/regex.ts | 4 ++ src/index.scss | 2 +- 10 files changed, 78 insertions(+), 41 deletions(-) create mode 100644 src/app/utils/regex.ts diff --git a/src/app/organisms/room/MembersDrawer.tsx b/src/app/organisms/room/MembersDrawer.tsx index 365dc62d..b4ba6b79 100644 --- a/src/app/organisms/room/MembersDrawer.tsx +++ b/src/app/organisms/room/MembersDrawer.tsx @@ -271,7 +271,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { - {`${millify(room.getJoinedMemberCount(), { precision: 1 })} Members`} + {`${millify(room.getJoinedMemberCount(), { precision: 1, locales: [] })} Members`} diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 09f33260..742971d1 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -44,7 +44,6 @@ import { toRem, } from 'folds'; import { isKeyHotkey } from 'is-hotkey'; -import Linkify from 'linkify-react'; import { decryptFile, eventWithShortcode, @@ -76,7 +75,10 @@ import { MessageBadEncryptedContent, MessageNotDecryptedContent, } from '../../components/message'; -import { LINKIFY_OPTS, getReactCustomHtmlParser } from '../../plugins/react-custom-html-parser'; +import { + emojifyAndLinkify, + getReactCustomHtmlParser, +} from '../../plugins/react-custom-html-parser'; import { canEditEvent, decryptAllTimelineEvent, @@ -978,7 +980,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (customBody === '') ; return parse(sanitizeCustomHtml(customBody), htmlReactParserOptions); } - return {body}; + return emojifyAndLinkify(body, true); }; const renderRoomMsgContent = useRoomMsgContentRenderer<[EventTimelineSet]>({ diff --git a/src/app/organisms/room/message/AudioContent.tsx b/src/app/organisms/room/message/AudioContent.tsx index b5873f35..eae5447b 100644 --- a/src/app/organisms/room/message/AudioContent.tsx +++ b/src/app/organisms/room/message/AudioContent.tsx @@ -44,7 +44,8 @@ export const AudioContent = as<'div', AudioContentProps>( const audioRef = useRef(null); const [currentTime, setCurrentTime] = useState(0); - const [duration, setDuration] = useState(info.duration ?? 0); + // duration in seconds. (NOTE: info.duration is in milliseconds) + const [duration, setDuration] = useState((info.duration ?? 0) / 1000); const getAudioRef = useCallback(() => audioRef.current, []); const { loading } = useMediaLoading(getAudioRef); diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index ae094eff..2b706eda 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -54,7 +54,7 @@ function AppearanceSection() { const [enterForNewline, setEnterForNewline] = useSetting(settingsAtom, 'enterForNewline'); const [messageLayout, setMessageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing, setMessageSpacing] = useSetting(settingsAtom, 'messageSpacing'); - const [useSystemEmoji, setUseSystemEmoji] = useSetting(settingsAtom, 'useSystemEmoji'); + const [twitterEmoji, setTwitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); const [isMarkdown, setIsMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const [hideMembershipEvents, setHideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); @@ -96,14 +96,14 @@ function AppearanceSection() { )} /> setUseSystemEmoji(!useSystemEmoji)} + isActive={twitterEmoji} + onToggle={() => setTwitterEmoji(!twitterEmoji)} /> )} - content={Use system emoji instead of Twitter emojis.} + content={Use Twitter emoji instead of system emoji.} />
    @@ -339,6 +339,10 @@ function AboutSection() { {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } The matrix-js-sdk is © The Matrix.org Foundation C.I.C used under the terms of Apache 2.0. +
  • + {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } + The twemoji-colr font is © Mozilla Foundation used under the terms of Apache 2.0. +
  • {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } The Twemoji emoji art is © Twitter, Inc and other contributors used under the terms of CC-BY 4.0. diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index 09f09d8f..478a8a3b 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -1,6 +1,6 @@ /* eslint-disable jsx-a11y/alt-text */ import React, { ReactEventHandler, Suspense, lazy } from 'react'; -import { +import parse, { Element, Text as DOMText, HTMLReactParserOptions, @@ -16,9 +16,14 @@ import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; import { getMxIdLocalPart, getRoomWithCanonicalAlias } from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; +import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; +import { sanitizeText } from '../utils/sanitize'; +import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; const ReactPrism = lazy(() => import('./react-prism/ReactPrism')); +const EMOJI_REG = new RegExp(`${URL_NEG_LB}(${EMOJI_PATTERN})`, 'g'); + export const LINKIFY_OPTS: LinkifyOpts = { attributes: { target: '_blank', @@ -27,6 +32,28 @@ export const LINKIFY_OPTS: LinkifyOpts = { validate: { url: (value) => /^(https|http|ftp|mailto|magnet)?:/.test(value), }, + ignoreTags: ['span'], +}; + +const emojifyParserOptions: HTMLReactParserOptions = { + replace: (domNode) => { + if (domNode instanceof DOMText) { + return {domNode.data}; + } + return undefined; + }, +}; + +export const emojifyAndLinkify = (unsafeText: string, linkify?: boolean) => { + const emojifyHtml = sanitizeText(unsafeText).replace( + EMOJI_REG, + (emoji) => + `${emoji}` + ); + + return <>{parse(emojifyHtml, linkify ? emojifyParserOptions : undefined)}; }; export const getReactCustomHtmlParser = ( @@ -45,7 +72,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h1') { return ( - + {domToReact(children, opts)} ); @@ -53,7 +80,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h2') { return ( - + {domToReact(children, opts)} ); @@ -61,7 +88,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h3') { return ( - + {domToReact(children, opts)} ); @@ -69,7 +96,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h4') { return ( - + {domToReact(children, opts)} ); @@ -77,7 +104,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h5') { return ( - + {domToReact(children, opts)} ); @@ -85,7 +112,7 @@ export const getReactCustomHtmlParser = ( if (name === 'h6') { return ( - + {domToReact(children, opts)} ); @@ -93,7 +120,7 @@ export const getReactCustomHtmlParser = ( if (name === 'p') { return ( - + {domToReact(children, opts)} ); @@ -101,7 +128,7 @@ export const getReactCustomHtmlParser = ( if (name === 'pre') { return ( - + + {domToReact(children, opts)} ); @@ -125,14 +152,14 @@ export const getReactCustomHtmlParser = ( if (name === 'ul') { return ( -
      +
        {domToReact(children, opts)}
      ); } if (name === 'ol') { return ( -
        +
          {domToReact(children, opts)}
        ); @@ -240,29 +267,28 @@ export const getReactCustomHtmlParser = ( if (htmlSrc && props.src.startsWith('mxc://') === false) { return ( - {props.alt && htmlSrc} + {props.alt || props.title || htmlSrc} ); } if (htmlSrc && 'data-mx-emoticon' in props) { return ( - - + + ); } - if (htmlSrc) return ; + if (htmlSrc) return ; } } - if ( - domNode instanceof DOMText && - !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'code') && - !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'a') - ) { - return {domNode.data}; + if (domNode instanceof DOMText) { + const linkify = + !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'code') && + !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'a'); + return emojifyAndLinkify(domNode.data, linkify); } return undefined; }, diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index 26e3431d..3a7832cd 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -9,7 +9,7 @@ export interface Settings { useSystemTheme: boolean; isMarkdown: boolean; editorToolbar: boolean; - useSystemEmoji: boolean; + twitterEmoji: boolean; isPeopleDrawer: boolean; memberSortFilterIndex: number; @@ -30,7 +30,7 @@ const defaultSettings: Settings = { useSystemTheme: true, isMarkdown: false, editorToolbar: false, - useSystemEmoji: false, + twitterEmoji: false, isPeopleDrawer: true, memberSortFilterIndex: 0, diff --git a/src/app/styles/CustomHtml.css.ts b/src/app/styles/CustomHtml.css.ts index 2a06c0fb..076bbb61 100644 --- a/src/app/styles/CustomHtml.css.ts +++ b/src/app/styles/CustomHtml.css.ts @@ -187,11 +187,11 @@ export const Emoticon = recipe({ height: '1em', minWidth: '1em', - fontSize: '1.47em', + fontSize: '1.33em', lineHeight: '1em', verticalAlign: 'middle', position: 'relative', - top: '-0.32em', + top: '-0.35em', borderRadius: config.radii.R300, }, ], diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index 77db4115..e9be6b16 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -24,12 +24,12 @@ import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; function SystemEmojiFeature() { - const [systemEmoji] = useSetting(settingsAtom, 'useSystemEmoji'); + const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); - if (systemEmoji) { - document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); - } else { + if (twitterEmoji) { document.documentElement.style.setProperty('--font-emoji', 'Twemoji'); + } else { + document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); } return null; diff --git a/src/app/utils/regex.ts b/src/app/utils/regex.ts new file mode 100644 index 00000000..73da664e --- /dev/null +++ b/src/app/utils/regex.ts @@ -0,0 +1,4 @@ +export const URL_NEG_LB = '(? Date: Thu, 26 Oct 2023 16:21:55 +1100 Subject: [PATCH 513/824] Fix-timeline-loading (#1506) * fix timeline jump to search item after markAsRead * improve pagination logic * add jumbo emoji support in msg rendering --- src/app/organisms/room/RoomTimeline.tsx | 17 +++++++++++++++-- src/app/utils/regex.ts | 3 +++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 742971d1..2d382454 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -137,6 +137,13 @@ import initMatrix from '../../../client/initMatrix'; import { useKeyDown } from '../../hooks/useKeyDown'; import cons from '../../../client/state/cons'; import { useDocumentFocusChange } from '../../hooks/useDocumentFocusChange'; +import { EMOJI_PATTERN, VARIATION_SELECTOR_PATTERN } from '../../utils/regex'; + +// Thumbs up emoji found to have Variation Selector 16 at the end +// so included variation selector pattern in regex +const JUMBO_EMOJI_REG = new RegExp( + `^(((${EMOJI_PATTERN})|(:.+?:))(${VARIATION_SELECTOR_PATTERN}|\\s)*){1,10}$` +); const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -334,6 +341,7 @@ const useTimelinePagination = ( return async (backwards: boolean) => { if (fetching) return; + const targetTimeline = timelineRef.current; const { linkedTimelines: lTimelines } = timelineRef.current; const timelinesEventsCount = lTimelines.map(timelineToEventsCount); @@ -373,6 +381,7 @@ const useTimelinePagination = ( } fetching = false; + if (targetTimeline !== timelineRef.current) return; if (alive()) { recalibratePagination(lTimelines, timelinesEventsCount, backwards); } @@ -582,7 +591,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli focusItem.current = { index: evtAbsIndex, scrollTo: true, - highlight: evtId !== unreadInfo?.readUptoEventId, + highlight: evtId !== readUptoEventIdRef.current, }; setTimeline({ linkedTimelines: lTimelines, @@ -592,7 +601,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }, }); }, - [unreadInfo, alive] + [alive] ), useCallback(() => { if (!alive()) return; @@ -990,12 +999,16 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; + const jumboEmoji = JUMBO_EMOJI_REG.test(body); + return ( diff --git a/src/app/utils/regex.ts b/src/app/utils/regex.ts index 73da664e..3b0e9815 100644 --- a/src/app/utils/regex.ts +++ b/src/app/utils/regex.ts @@ -1,4 +1,7 @@ export const URL_NEG_LB = '(? Date: Fri, 27 Oct 2023 21:27:22 +1100 Subject: [PATCH 514/824] Improve Editor related bugs and add multiline md (#1507) * remove shift from editor hotkeys * fix inline markdown not working * add block md parser - WIP * emojify and linkify text without react-parser * no need to sanitize text when emojify * parse block markdown in editor output - WIP * add inline parser option in block md parser * improve codeblock regex * ignore html tag when parsing inline md in block md * add list markdown rule in block parser * re-generate block markdown on edit * change copy from inline markdown to markdown * fix trim reply from body regex * fix jumbo emoji in reply message * fix broken list regex in block markdown * enable markdown by defualt --- src/app/components/editor/Toolbar.tsx | 19 +- src/app/components/editor/input.ts | 151 +++++++--- src/app/components/editor/keyboard.ts | 12 +- src/app/components/editor/output.ts | 41 ++- src/app/components/message/Reply.tsx | 9 +- src/app/organisms/room/RoomInput.tsx | 3 +- src/app/organisms/room/RoomTimeline.tsx | 3 +- .../organisms/room/message/MessageEditor.tsx | 3 +- src/app/organisms/room/message/styles.css.ts | 2 +- src/app/organisms/settings/Settings.jsx | 4 +- src/app/plugins/react-custom-html-parser.tsx | 46 +-- src/app/state/settings.ts | 2 +- src/app/utils/markdown.ts | 277 ++++++++++++++---- src/app/utils/room.ts | 2 +- src/app/utils/sanitize.ts | 11 +- 15 files changed, 425 insertions(+), 160 deletions(-) diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 6feae009..5d5e9894 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -148,7 +148,7 @@ export function HeadingBlockButton() { } + tooltip={} delay={500} > {(triggerRef) => ( @@ -163,7 +163,7 @@ export function HeadingBlockButton() { )} } + tooltip={} delay={500} > {(triggerRef) => ( @@ -178,7 +178,7 @@ export function HeadingBlockButton() { )} } + tooltip={} delay={500} > {(triggerRef) => ( @@ -277,12 +277,7 @@ export function Toolbar() { - } + tooltip={} /> } + tooltip={} /> } + tooltip={} /> @@ -335,7 +330,7 @@ export function Toolbar() { } + tooltip={} delay={500} > {(triggerRef) => ( diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 5860df04..272b9707 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -13,11 +13,9 @@ import { HeadingElement, HeadingLevel, InlineElement, - ListItemElement, MentionElement, OrderedListElement, ParagraphElement, - QuoteLineElement, UnorderedListElement, } from './slate'; import { parseMatrixToUrl } from '../../utils/matrix'; @@ -117,17 +115,14 @@ const parseInlineNodes = (node: ChildNode): InlineElement[] => { return []; }; -const parseBlockquoteNode = (node: Element): BlockQuoteElement => { - const children: QuoteLineElement[] = []; +const parseBlockquoteNode = (node: Element): BlockQuoteElement[] | ParagraphElement[] => { + const quoteLines: Array = []; let lineHolder: InlineElement[] = []; const appendLine = () => { if (lineHolder.length === 0) return; - children.push({ - type: BlockType.QuoteLine, - children: lineHolder, - }); + quoteLines.push(lineHolder); lineHolder = []; }; @@ -145,10 +140,7 @@ const parseBlockquoteNode = (node: Element): BlockQuoteElement => { if (child.name === 'p') { appendLine(); - children.push({ - type: BlockType.QuoteLine, - children: child.children.flatMap((c) => parseInlineNodes(c)), - }); + quoteLines.push(child.children.flatMap((c) => parseInlineNodes(c))); return; } @@ -157,42 +149,71 @@ const parseBlockquoteNode = (node: Element): BlockQuoteElement => { }); appendLine(); - return { - type: BlockType.BlockQuote, - children, - }; -}; -const parseCodeBlockNode = (node: Element): CodeBlockElement => { - const children: CodeLineElement[] = []; + if (node.attribs['data-md'] !== undefined) { + return quoteLines.map((lineChildren) => ({ + type: BlockType.Paragraph, + children: [{ text: `${node.attribs['data-md']} ` }, ...lineChildren], + })); + } - const code = parseNodeText(node).trim(); - code.split('\n').forEach((lineTxt) => - children.push({ - type: BlockType.CodeLine, + return [ + { + type: BlockType.BlockQuote, + children: quoteLines.map((lineChildren) => ({ + type: BlockType.QuoteLine, + children: lineChildren, + })), + }, + ]; +}; +const parseCodeBlockNode = (node: Element): CodeBlockElement[] | ParagraphElement[] => { + const codeLines = parseNodeText(node).trim().split('\n'); + + if (node.attribs['data-md'] !== undefined) { + const pLines = codeLines.map((lineText) => ({ + type: BlockType.Paragraph, children: [ { - text: lineTxt, + text: lineText, }, ], - }) - ); + })); + const childCode = node.children[0]; + const className = + isTag(childCode) && childCode.tagName === 'code' ? childCode.attribs.class ?? '' : ''; + const prefix = { text: `${node.attribs['data-md']}${className.replace('language-', '')}` }; + const suffix = { text: node.attribs['data-md'] }; + return [ + { type: BlockType.Paragraph, children: [prefix] }, + ...pLines, + { type: BlockType.Paragraph, children: [suffix] }, + ]; + } - return { - type: BlockType.CodeBlock, - children, - }; + return [ + { + type: BlockType.CodeBlock, + children: codeLines.map((lineTxt) => ({ + type: BlockType.CodeLine, + children: [ + { + text: lineTxt, + }, + ], + })), + }, + ]; }; -const parseListNode = (node: Element): OrderedListElement | UnorderedListElement => { - const children: ListItemElement[] = []; +const parseListNode = ( + node: Element +): OrderedListElement[] | UnorderedListElement[] | ParagraphElement[] => { + const listLines: Array = []; let lineHolder: InlineElement[] = []; const appendLine = () => { if (lineHolder.length === 0) return; - children.push({ - type: BlockType.ListItem, - children: lineHolder, - }); + listLines.push(lineHolder); lineHolder = []; }; @@ -210,10 +231,7 @@ const parseListNode = (node: Element): OrderedListElement | UnorderedListElement if (child.name === 'li') { appendLine(); - children.push({ - type: BlockType.ListItem, - children: child.children.flatMap((c) => parseInlineNodes(c)), - }); + listLines.push(child.children.flatMap((c) => parseInlineNodes(c))); return; } @@ -222,17 +240,54 @@ const parseListNode = (node: Element): OrderedListElement | UnorderedListElement }); appendLine(); - return { - type: node.name === 'ol' ? BlockType.OrderedList : BlockType.UnorderedList, - children, - }; + if (node.attribs['data-md'] !== undefined) { + const prefix = node.attribs['data-md'] || '-'; + const [starOrHyphen] = prefix.match(/^\*|-$/) ?? []; + return listLines.map((lineChildren) => ({ + type: BlockType.Paragraph, + children: [ + { text: `${starOrHyphen ? `${starOrHyphen} ` : `${prefix}. `} ` }, + ...lineChildren, + ], + })); + } + + if (node.name === 'ol') { + return [ + { + type: BlockType.OrderedList, + children: listLines.map((lineChildren) => ({ + type: BlockType.ListItem, + children: lineChildren, + })), + }, + ]; + } + + return [ + { + type: BlockType.UnorderedList, + children: listLines.map((lineChildren) => ({ + type: BlockType.ListItem, + children: lineChildren, + })), + }, + ]; }; -const parseHeadingNode = (node: Element): HeadingElement => { +const parseHeadingNode = (node: Element): HeadingElement | ParagraphElement => { const children = node.children.flatMap((child) => parseInlineNodes(child)); const headingMatch = node.name.match(/^h([123456])$/); const [, g1AsLevel] = headingMatch ?? ['h3', '3']; const level = parseInt(g1AsLevel, 10); + + if (node.attribs['data-md'] !== undefined) { + return { + type: BlockType.Paragraph, + children: [{ text: `${node.attribs['data-md']} ` }, ...children], + }; + } + return { type: BlockType.Heading, level: (level <= 3 ? level : 3) as HeadingLevel, @@ -278,17 +333,17 @@ export const domToEditorInput = (domNodes: ChildNode[]): Descendant[] => { if (node.name === 'blockquote') { appendLine(); - children.push(parseBlockquoteNode(node)); + children.push(...parseBlockquoteNode(node)); return; } if (node.name === 'pre') { appendLine(); - children.push(parseCodeBlockNode(node)); + children.push(...parseCodeBlockNode(node)); return; } if (node.name === 'ol' || node.name === 'ul') { appendLine(); - children.push(parseListNode(node)); + children.push(...parseListNode(node)); return; } diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index 370f3e82..19c05bac 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -8,22 +8,22 @@ export const INLINE_HOTKEYS: Record = { 'mod+b': MarkType.Bold, 'mod+i': MarkType.Italic, 'mod+u': MarkType.Underline, - 'mod+shift+u': MarkType.StrikeThrough, + 'mod+s': MarkType.StrikeThrough, 'mod+[': MarkType.Code, 'mod+h': MarkType.Spoiler, }; const INLINE_KEYS = Object.keys(INLINE_HOTKEYS); export const BLOCK_HOTKEYS: Record = { - 'mod+shift+7': BlockType.OrderedList, - 'mod+shift+8': BlockType.UnorderedList, + 'mod+7': BlockType.OrderedList, + 'mod+8': BlockType.UnorderedList, "mod+'": BlockType.BlockQuote, 'mod+;': BlockType.CodeBlock, }; const BLOCK_KEYS = Object.keys(BLOCK_HOTKEYS); -const isHeading1 = isKeyHotkey('mod+shift+1'); -const isHeading2 = isKeyHotkey('mod+shift+2'); -const isHeading3 = isKeyHotkey('mod+shift+3'); +const isHeading1 = isKeyHotkey('mod+1'); +const isHeading2 = isKeyHotkey('mod+2'); +const isHeading3 = isKeyHotkey('mod+3'); /** * @return boolean true if shortcut is toggled. diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 307ef8a2..fa15bb58 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -3,11 +3,12 @@ import { Descendant, Text } from 'slate'; import { sanitizeText } from '../../utils/sanitize'; import { BlockType } from './types'; import { CustomElement } from './slate'; -import { parseInlineMD } from '../../utils/markdown'; +import { parseBlockMD, parseInlineMD, replaceMatch } from '../../utils/markdown'; export type OutputOptions = { allowTextFormatting?: boolean; - allowMarkdown?: boolean; + allowInlineMarkdown?: boolean; + allowBlockMarkdown?: boolean; }; const textToCustomHtml = (node: Text, opts: OutputOptions): string => { @@ -21,7 +22,7 @@ const textToCustomHtml = (node: Text, opts: OutputOptions): string => { if (node.spoiler) string = `${string}`; } - if (opts.allowMarkdown && string === sanitizeText(node.text)) { + if (opts.allowInlineMarkdown && string === sanitizeText(node.text)) { string = parseInlineMD(string); } @@ -64,14 +65,42 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { } }; +const HTML_TAG_REG = /<([a-z]+)(?![^>]*\/>)[^<]*<\/\1>/; +const ignoreHTMLParseInlineMD = (text: string): string => { + if (text === '') return text; + const match = text.match(HTML_TAG_REG); + if (!match) return parseInlineMD(text); + const [matchedTxt] = match; + return replaceMatch((txt) => [ignoreHTMLParseInlineMD(txt)], text, match, matchedTxt).join(''); +}; + export const toMatrixCustomHTML = ( node: Descendant | Descendant[], opts: OutputOptions ): string => { - const parseNode = (n: Descendant) => { + let markdownLines = ''; + const parseNode = (n: Descendant, index: number, targetNodes: Descendant[]) => { + if (opts.allowBlockMarkdown && 'type' in n && n.type === BlockType.Paragraph) { + const line = toMatrixCustomHTML(n, { + ...opts, + allowInlineMarkdown: false, + allowBlockMarkdown: false, + }) + .replace(/$/, '\n') + .replace(/^>/, '>'); + markdownLines += line; + if (index === targetNodes.length - 1) { + return parseBlockMD(markdownLines, ignoreHTMLParseInlineMD); + } + return ''; + } + + const parsedMarkdown = parseBlockMD(markdownLines, ignoreHTMLParseInlineMD); + markdownLines = ''; const isCodeLine = 'type' in n && n.type === BlockType.CodeLine; - if (isCodeLine) return toMatrixCustomHTML(n, {}); - return toMatrixCustomHTML(n, opts); + if (isCodeLine) return `${parsedMarkdown}${toMatrixCustomHTML(n, {})}`; + + return `${parsedMarkdown}${toMatrixCustomHTML(n, { ...opts, allowBlockMarkdown: false })}`; }; if (Array.isArray(node)) return node.map(parseNode).join(''); if (Text.isText(node)) return textToCustomHtml(node, opts); diff --git a/src/app/components/message/Reply.tsx b/src/app/components/message/Reply.tsx index 6eaab31e..c9b6b8d8 100644 --- a/src/app/components/message/Reply.tsx +++ b/src/app/components/message/Reply.tsx @@ -59,6 +59,9 @@ export const Reply = as<'div', ReplyProps>( }; }, [replyEvent, mx, room, eventId]); + const badEncryption = replyEvent?.getContent().msgtype === 'm.bad.encrypted'; + const bodyJSX = body ? trimReplyFromBody(body) : fallbackBody; + return ( ( {replyEvent !== undefined ? ( - {replyEvent?.getContent().msgtype === 'm.bad.encrypted' ? ( - - ) : ( - (body && trimReplyFromBody(body)) ?? fallbackBody - )} + {badEncryption ? : bodyJSX} ) : ( ( let customHtml = trimCustomHtml( toMatrixCustomHTML(editor.children, { allowTextFormatting: true, - allowMarkdown: isMarkdown, + allowBlockMarkdown: isMarkdown, + allowInlineMarkdown: isMarkdown, }) ); let msgType = MsgType.Text; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 2d382454..c1b04458 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -89,6 +89,7 @@ import { getReactionContent, isMembershipChanged, reactionOrEditEvent, + trimReplyFromBody, } from '../../utils/room'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; @@ -999,7 +1000,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; - const jumboEmoji = JUMBO_EMOJI_REG.test(body); + const jumboEmoji = JUMBO_EMOJI_REG.test(trimReplyFromBody(body)); return ( ( const customHtml = trimCustomHtml( toMatrixCustomHTML(editor.children, { allowTextFormatting: true, - allowMarkdown: isMarkdown, + allowBlockMarkdown: isMarkdown, + allowInlineMarkdown: isMarkdown, }) ); diff --git a/src/app/organisms/room/message/styles.css.ts b/src/app/organisms/room/message/styles.css.ts index a5f2f6b5..801f698d 100644 --- a/src/app/organisms/room/message/styles.css.ts +++ b/src/app/organisms/room/message/styles.css.ts @@ -81,5 +81,5 @@ export const ReactionsContainer = style({ }); export const ReactionsTooltipText = style({ - wordBreak: 'break-all', + wordBreak: 'break-word', }); diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 2b706eda..1b04669c 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -152,14 +152,14 @@ function AppearanceSection() { content={{`Use ${isMacOS() ? KeySymbol.Command : 'Ctrl'} + ENTER to send message and ENTER for newline.`}} /> setIsMarkdown(!isMarkdown) } /> )} - content={Format messages with inline markdown syntax before sending.} + content={Format messages with markdown syntax before sending.} /> import('./react-prism/ReactPrism')); -const EMOJI_REG = new RegExp(`${URL_NEG_LB}(${EMOJI_PATTERN})`, 'g'); +const EMOJI_REG = new RegExp(`${URL_NEG_LB}(${EMOJI_PATTERN})`); export const LINKIFY_OPTS: LinkifyOpts = { attributes: { @@ -35,25 +35,31 @@ export const LINKIFY_OPTS: LinkifyOpts = { ignoreTags: ['span'], }; -const emojifyParserOptions: HTMLReactParserOptions = { - replace: (domNode) => { - if (domNode instanceof DOMText) { - return {domNode.data}; - } - return undefined; - }, +const stringToEmojifyJSX = (text: string): (string | JSX.Element)[] => { + const match = text.match(EMOJI_REG); + if (!match) return [text]; + + const [emoji] = match; + + return replaceMatch( + stringToEmojifyJSX, + text, + match, + + + {emoji} + + + ); }; -export const emojifyAndLinkify = (unsafeText: string, linkify?: boolean) => { - const emojifyHtml = sanitizeText(unsafeText).replace( - EMOJI_REG, - (emoji) => - `${emoji}` - ); +export const emojifyAndLinkify = (text: string, linkify?: boolean) => { + const emojifyJSX = stringToEmojifyJSX(text); - return <>{parse(emojifyHtml, linkify ? emojifyParserOptions : undefined)}; + if (linkify) { + return {emojifyJSX}; + } + return emojifyJSX; }; export const getReactCustomHtmlParser = ( @@ -171,6 +177,8 @@ export const getReactCustomHtmlParser = ( if (typeof codeReact === 'string') { let lang = props.className; if (lang === 'language-rs') lang = 'language-rust'; + else if (lang === 'language-js') lang = 'language-javascript'; + else if (lang === 'language-ts') lang = 'language-typescript'; return ( {codeReact}}> {codeReact}}> diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index 3a7832cd..4393b64d 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -28,7 +28,7 @@ export interface Settings { const defaultSettings: Settings = { themeIndex: 0, useSystemTheme: true, - isMarkdown: false, + isMarkdown: true, editorToolbar: false, twitterEmoji: false, diff --git a/src/app/utils/markdown.ts b/src/app/utils/markdown.ts index 9fda6794..c6bb3914 100644 --- a/src/app/utils/markdown.ts +++ b/src/app/utils/markdown.ts @@ -1,25 +1,46 @@ -export type PlainMDParser = (text: string) => string; export type MatchResult = RegExpMatchArray | RegExpExecArray; export type RuleMatch = (text: string) => MatchResult | null; -export type MatchConverter = (parse: PlainMDParser, match: MatchResult) => string; -export type MDRule = { - match: RuleMatch; - html: MatchConverter; -}; +export const beforeMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => + text.slice(0, match.index); +export const afterMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => + text.slice((match.index ?? 0) + match[0].length); -export type MatchReplacer = ( - parse: PlainMDParser, +export const replaceMatch = ( + convertPart: (txt: string) => Array, text: string, match: MatchResult, - content: string -) => string; + content: C +): Array => [ + ...convertPart(beforeMatch(text, match)), + content, + ...convertPart(afterMatch(text, match)), +]; -export type RuleRunner = (parse: PlainMDParser, text: string, rule: MDRule) => string | undefined; -export type RulesRunner = ( - parse: PlainMDParser, +/* + ***************** + * INLINE PARSER * + ***************** + */ + +export type InlineMDParser = (text: string) => string; + +export type InlineMatchConverter = (parse: InlineMDParser, match: MatchResult) => string; + +export type InlineMDRule = { + match: RuleMatch; + html: InlineMatchConverter; +}; + +export type InlineRuleRunner = ( + parse: InlineMDParser, text: string, - rules: MDRule[] + rule: InlineMDRule +) => string | undefined; +export type InlineRulesRunner = ( + parse: InlineMDParser, + text: string, + rules: InlineMDRule[] ) => string | undefined; const MIN_ANY = '(.+?)'; @@ -31,11 +52,11 @@ const BOLD_NEG_LA_1 = '(?!\\*)'; const BOLD_REG_1 = new RegExp( `${URL_NEG_LB}${BOLD_PREFIX_1}${MIN_ANY}${BOLD_PREFIX_1}${BOLD_NEG_LA_1}` ); -const BoldRule: MDRule = { +const BoldRule: InlineMDRule = { match: (text) => text.match(BOLD_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; @@ -45,11 +66,11 @@ const ITALIC_NEG_LA_1 = '(?!\\*)'; const ITALIC_REG_1 = new RegExp( `${URL_NEG_LB}${ITALIC_PREFIX_1}${MIN_ANY}${ITALIC_PREFIX_1}${ITALIC_NEG_LA_1}` ); -const ItalicRule1: MDRule = { +const ItalicRule1: InlineMDRule = { match: (text) => text.match(ITALIC_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; @@ -59,11 +80,11 @@ const ITALIC_NEG_LA_2 = '(?!_)'; const ITALIC_REG_2 = new RegExp( `${URL_NEG_LB}${ITALIC_PREFIX_2}${MIN_ANY}${ITALIC_PREFIX_2}${ITALIC_NEG_LA_2}` ); -const ItalicRule2: MDRule = { +const ItalicRule2: InlineMDRule = { match: (text) => text.match(ITALIC_REG_2), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; @@ -73,11 +94,11 @@ const UNDERLINE_NEG_LA_1 = '(?!_)'; const UNDERLINE_REG_1 = new RegExp( `${URL_NEG_LB}${UNDERLINE_PREFIX_1}${MIN_ANY}${UNDERLINE_PREFIX_1}${UNDERLINE_NEG_LA_1}` ); -const UnderlineRule: MDRule = { +const UnderlineRule: InlineMDRule = { match: (text) => text.match(UNDERLINE_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; @@ -87,25 +108,23 @@ const STRIKE_NEG_LA_1 = '(?!~)'; const STRIKE_REG_1 = new RegExp( `${URL_NEG_LB}${STRIKE_PREFIX_1}${MIN_ANY}${STRIKE_PREFIX_1}${STRIKE_NEG_LA_1}` ); -const StrikeRule: MDRule = { +const StrikeRule: InlineMDRule = { match: (text) => text.match(STRIKE_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; const CODE_MD_1 = '`'; const CODE_PREFIX_1 = '`'; const CODE_NEG_LA_1 = '(?!`)'; -const CODE_REG_1 = new RegExp( - `${URL_NEG_LB}${CODE_PREFIX_1}${MIN_ANY}${CODE_PREFIX_1}${CODE_NEG_LA_1}` -); -const CodeRule: MDRule = { +const CODE_REG_1 = new RegExp(`${URL_NEG_LB}${CODE_PREFIX_1}(.+?)${CODE_PREFIX_1}${CODE_NEG_LA_1}`); +const CodeRule: InlineMDRule = { match: (text) => text.match(CODE_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${g1}`; + const [, , g2] = match; + return `${g2}`; }, }; @@ -115,18 +134,18 @@ const SPOILER_NEG_LA_1 = '(?!\\|)'; const SPOILER_REG_1 = new RegExp( `${URL_NEG_LB}${SPOILER_PREFIX_1}${MIN_ANY}${SPOILER_PREFIX_1}${SPOILER_NEG_LA_1}` ); -const SpoilerRule: MDRule = { +const SpoilerRule: InlineMDRule = { match: (text) => text.match(SPOILER_REG_1), html: (parse, match) => { - const [, g1] = match; - return `${parse(g1)}`; + const [, , g2] = match; + return `${parse(g2)}`; }, }; const LINK_ALT = `\\[${MIN_ANY}\\]`; const LINK_URL = `\\((https?:\\/\\/.+?)\\)`; const LINK_REG_1 = new RegExp(`${LINK_ALT}${LINK_URL}`); -const LinkRule: MDRule = { +const LinkRule: InlineMDRule = { match: (text) => text.match(LINK_REG_1), html: (parse, match) => { const [, g1, g2] = match; @@ -134,19 +153,11 @@ const LinkRule: MDRule = { }, }; -const beforeMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => - text.slice(0, match.index); -const afterMatch = (text: string, match: RegExpMatchArray | RegExpExecArray): string => - text.slice((match.index ?? 0) + match[0].length); - -const replaceMatch: MatchReplacer = (parse, text, match, content) => - `${parse(beforeMatch(text, match))}${content}${parse(afterMatch(text, match))}`; - -const runRule: RuleRunner = (parse, text, rule) => { +const runInlineRule: InlineRuleRunner = (parse, text, rule) => { const matchResult = rule.match(text); if (matchResult) { const content = rule.html(parse, matchResult); - return replaceMatch(parse, text, matchResult, content); + return replaceMatch((txt) => [parse(txt)], text, matchResult, content).join(''); } return undefined; }; @@ -155,10 +166,10 @@ const runRule: RuleRunner = (parse, text, rule) => { * Runs multiple rules at the same time to better handle nested rules. * Rules will be run in the order they appear. */ -const runRules: RulesRunner = (parse, text, rules) => { +const runInlineRules: InlineRulesRunner = (parse, text, rules) => { const matchResults = rules.map((rule) => rule.match(text)); - let targetRule: MDRule | undefined; + let targetRule: InlineMDRule | undefined; let targetResult: MatchResult | undefined; for (let i = 0; i < matchResults.length; i += 1) { @@ -176,7 +187,7 @@ const runRules: RulesRunner = (parse, text, rules) => { if (targetRule && targetResult) { const content = targetRule.html(parse, targetResult); - return replaceMatch(parse, text, targetResult, content); + return replaceMatch((txt) => [parse(txt)], text, targetResult, content).join(''); } return undefined; }; @@ -191,11 +202,167 @@ const LeveledRules = [ LinkRule, ]; -export const parseInlineMD = (text: string): string => { +export const parseInlineMD: InlineMDParser = (text) => { + if (text === '') return text; let result: string | undefined; - if (!result) result = runRule(parseInlineMD, text, CodeRule); + if (!result) result = runInlineRule(parseInlineMD, text, CodeRule); - if (!result) result = runRules(parseInlineMD, text, LeveledRules); + if (!result) result = runInlineRules(parseInlineMD, text, LeveledRules); + + return result ?? text; +}; + +/* + **************** + * BLOCK PARSER * + **************** + */ + +export type BlockMDParser = (test: string, parseInline?: (txt: string) => string) => string; + +export type BlockMatchConverter = ( + match: MatchResult, + parseInline?: (txt: string) => string +) => string; + +export type BlockMDRule = { + match: RuleMatch; + html: BlockMatchConverter; +}; + +export type BlockRuleRunner = ( + parse: BlockMDParser, + text: string, + rule: BlockMDRule, + parseInline?: (txt: string) => string +) => string | undefined; + +const HEADING_REG_1 = /^(#{1,6}) +(.+)\n?/m; +const HeadingRule: BlockMDRule = { + match: (text) => text.match(HEADING_REG_1), + html: (match, parseInline) => { + const [, g1, g2] = match; + const level = g1.length; + return `${parseInline ? parseInline(g2) : g2}`; + }, +}; + +const CODEBLOCK_MD_1 = '```'; +const CODEBLOCK_REG_1 = /^`{3}(\S*)\n((.+\n)+)`{3} *(?!.)\n?/m; +const CodeBlockRule: BlockMDRule = { + match: (text) => text.match(CODEBLOCK_REG_1), + html: (match) => { + const [, g1, g2] = match; + const classNameAtt = g1 ? ` class="language-${g1}"` : ''; + return `
        ${g2}
        `; + }, +}; + +const BLOCKQUOTE_MD_1 = '>'; +const QUOTE_LINE_PREFIX = /^> */; +const BLOCKQUOTE_TRAILING_NEWLINE = /\n$/; +const BLOCKQUOTE_REG_1 = /(^>.*\n?)+/m; +const BlockQuoteRule: BlockMDRule = { + match: (text) => text.match(BLOCKQUOTE_REG_1), + html: (match, parseInline) => { + const [blockquoteText] = match; + + const lines = blockquoteText + .replace(BLOCKQUOTE_TRAILING_NEWLINE, '') + .split('\n') + .map((lineText) => { + const line = lineText.replace(QUOTE_LINE_PREFIX, ''); + if (parseInline) return `${parseInline(line)}
        `; + return `${line}
        `; + }) + .join(''); + return `
        ${lines}
        `; + }, +}; + +const ORDERED_LIST_MD_1 = '-'; +const O_LIST_ITEM_PREFIX = /^(-|[\da-zA-Z]\.) */; +const O_LIST_START = /^([\d])\./; +const O_LIST_TYPE = /^([aAiI])\./; +const O_LIST_TRAILING_NEWLINE = /\n$/; +const ORDERED_LIST_REG_1 = /(^(-|[\da-zA-Z]\.) +.+\n?)+/m; +const OrderedListRule: BlockMDRule = { + match: (text) => text.match(ORDERED_LIST_REG_1), + html: (match, parseInline) => { + const [listText] = match; + const [, listStart] = listText.match(O_LIST_START) ?? []; + const [, listType] = listText.match(O_LIST_TYPE) ?? []; + + const lines = listText + .replace(O_LIST_TRAILING_NEWLINE, '') + .split('\n') + .map((lineText) => { + const line = lineText.replace(O_LIST_ITEM_PREFIX, ''); + const txt = parseInline ? parseInline(line) : line; + return `
      1. ${txt}

      2. `; + }) + .join(''); + + const dataMdAtt = `data-md="${listType || listStart || ORDERED_LIST_MD_1}"`; + const startAtt = listStart ? ` start="${listStart}"` : ''; + const typeAtt = listType ? ` type="${listType}"` : ''; + return `
          ${lines}
        `; + }, +}; + +const UNORDERED_LIST_MD_1 = '*'; +const U_LIST_ITEM_PREFIX = /^\* */; +const U_LIST_TRAILING_NEWLINE = /\n$/; +const UNORDERED_LIST_REG_1 = /(^\* +.+\n?)+/m; +const UnorderedListRule: BlockMDRule = { + match: (text) => text.match(UNORDERED_LIST_REG_1), + html: (match, parseInline) => { + const [listText] = match; + + const lines = listText + .replace(U_LIST_TRAILING_NEWLINE, '') + .split('\n') + .map((lineText) => { + const line = lineText.replace(U_LIST_ITEM_PREFIX, ''); + const txt = parseInline ? parseInline(line) : line; + return `
      3. ${txt}

      4. `; + }) + .join(''); + + return `
          ${lines}
        `; + }, +}; + +const runBlockRule: BlockRuleRunner = (parse, text, rule, parseInline) => { + const matchResult = rule.match(text); + if (matchResult) { + const content = rule.html(matchResult, parseInline); + return replaceMatch((txt) => [parse(txt, parseInline)], text, matchResult, content).join(''); + } + return undefined; +}; + +export const parseBlockMD: BlockMDParser = (text, parseInline) => { + if (text === '') return text; + let result: string | undefined; + + if (!result) result = runBlockRule(parseBlockMD, text, CodeBlockRule, parseInline); + if (!result) result = runBlockRule(parseBlockMD, text, BlockQuoteRule, parseInline); + if (!result) result = runBlockRule(parseBlockMD, text, OrderedListRule, parseInline); + if (!result) result = runBlockRule(parseBlockMD, text, UnorderedListRule, parseInline); + if (!result) result = runBlockRule(parseBlockMD, text, HeadingRule, parseInline); + + // replace \n with
        because want to preserve empty lines + if (!result) { + if (parseInline) { + result = text + .split('\n') + .map((lineText) => parseInline(lineText)) + .join('
        '); + } else { + result = text.replace(/\n/g, '
        '); + } + } return result ?? text; }; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index adb6dc08..a2cb3a9f 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -256,7 +256,7 @@ export const getRoomAvatarUrl = (mx: MatrixClient, room: Room): string | undefin }; export const trimReplyFromBody = (body: string): string => { - const match = body.match(/^>\s<.+?>\s.+\n\n/); + const match = body.match(/^> <.+?> .+\n(>.*\n)*?\n/m); if (!match) return body; return body.slice(match[0].length); }; diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts index 8e7c1283..48ab0b8d 100644 --- a/src/app/utils/sanitize.ts +++ b/src/app/utils/sanitize.ts @@ -59,9 +59,18 @@ const permittedTagToAttributes = { 'data-md', ], div: ['data-mx-maths'], + blockquote: ['data-md'], + h1: ['data-md'], + h2: ['data-md'], + h3: ['data-md'], + h4: ['data-md'], + h5: ['data-md'], + h6: ['data-md'], + pre: ['data-md', 'class'], + ol: ['start', 'type', 'data-md'], + ul: ['data-md'], a: ['name', 'target', 'href', 'rel', 'data-md'], img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], - ol: ['start'], code: ['class', 'data-md'], strong: ['data-md'], i: ['data-md'], From 3cef074c9ef6744278e84b97580049a427d81121 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Fri, 27 Oct 2023 22:11:08 +1100 Subject: [PATCH 515/824] Release v3.1.0 (#1510) * Update package.json * Update cons.js * Update package-lock.json --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c2e80d0..6e581863 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "3.0.0", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "3.0.0", + "version": "3.1.0", "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index 0f1bfa75..17fbf168 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "3.0.0", + "version": "3.1.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 5d29d1df..b8074d90 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '3.0.0', + version: '3.1.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From a2cbe797875ca96394c5af1e69093c32b169eff0 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 29 Oct 2023 21:53:44 +1100 Subject: [PATCH 516/824] Fix broken emoji with md pattern in shortcode (#1514) * fix broken emoji with md pattern in shortcode * fix html regex when generating editor output --- src/app/components/editor/output.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index fa15bb58..1fb2d590 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -51,21 +51,25 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { return `
          ${children}
        `; case BlockType.Mention: - return `${node.name}`; + return `${sanitizeText( + node.name + )}`; case BlockType.Emoticon: return node.key.startsWith('mxc://') - ? `${node.shortcode}` - : node.key; + ? `${sanitizeText(
+            node.shortcode
+          )}` + : sanitizeText(node.key); case BlockType.Link: - return `${node.children}`; + return `${node.children}`; case BlockType.Command: - return `/${node.command}`; + return `/${sanitizeText(node.command)}`; default: return children; } }; -const HTML_TAG_REG = /<([a-z]+)(?![^>]*\/>)[^<]*<\/\1>/; +const HTML_TAG_REG = /<([\w-]+)(?:[^/>]*)(?:(?:\/>)|(?:>.*?<\/\1>))/; const ignoreHTMLParseInlineMD = (text: string): string => { if (text === '') return text; const match = text.match(HTML_TAG_REG); From a98903a85b81d5d799bb65dee9713499ea0ac029 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 29 Oct 2023 22:42:05 +1100 Subject: [PATCH 517/824] Fix regex to ignore html tag in editor output (#1515) --- src/app/components/editor/output.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 1fb2d590..9a03604c 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -69,7 +69,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { } }; -const HTML_TAG_REG = /<([\w-]+)(?:[^/>]*)(?:(?:\/>)|(?:>.*?<\/\1>))/; +const HTML_TAG_REG = /<([\w-]+)(?: [^>]*)?(?:(?:\/>)|(?:>.*?<\/\1>))/; const ignoreHTMLParseInlineMD = (text: string): string => { if (text === '') return text; const match = text.match(HTML_TAG_REG); From 9f9173c691aa61d3dff87aa2d26e4231452ab755 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 30 Oct 2023 07:14:58 +1100 Subject: [PATCH 518/824] Add URL preview (#1511) * URL preview - WIP * fix url preview regex * update url match regex * add url preview components * add scroll btn url preview holder * add message body component * add url preview toggle in settings * update url regex * improve url regex * increase thumbnail size in url preview * hide url preview in encrypted rooms * add encrypted room url preview toggle --- src/app/components/message/layout/Base.tsx | 15 +- .../components/message/layout/layout.css.ts | 27 +++ .../components/url-preview/UrlPreview.css.tsx | 45 +++++ src/app/components/url-preview/UrlPreview.tsx | 27 +++ src/app/components/url-preview/index.ts | 1 + src/app/organisms/room/RoomTimeline.tsx | 112 +++++++---- .../organisms/room/message/UrlPreviewCard.tsx | 183 ++++++++++++++++++ src/app/organisms/room/message/styles.css.ts | 48 ++++- src/app/organisms/settings/Settings.jsx | 22 +++ src/app/state/settings.ts | 4 + src/app/utils/regex.ts | 2 + 11 files changed, 444 insertions(+), 42 deletions(-) create mode 100644 src/app/components/url-preview/UrlPreview.css.tsx create mode 100644 src/app/components/url-preview/UrlPreview.tsx create mode 100644 src/app/components/url-preview/index.ts create mode 100644 src/app/organisms/room/message/UrlPreviewCard.tsx diff --git a/src/app/components/message/layout/Base.tsx b/src/app/components/message/layout/Base.tsx index 9439ec57..1ce764b5 100644 --- a/src/app/components/message/layout/Base.tsx +++ b/src/app/components/message/layout/Base.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { as } from 'folds'; +import { Text, as } from 'folds'; import classNames from 'classnames'; import * as css from './layout.css'; @@ -23,3 +23,16 @@ export const AvatarBase = as<'span'>(({ className, ...props }, ref) => ( export const Username = as<'span'>(({ as: AsUsername = 'span', className, ...props }, ref) => ( )); + +export const MessageTextBody = as<'div', css.MessageTextBodyVariants & { notice?: boolean }>( + ({ as: asComp = 'div', className, preWrap, jumboEmoji, emote, notice, ...props }, ref) => ( + + ) +); diff --git a/src/app/components/message/layout/layout.css.ts b/src/app/components/message/layout/layout.css.ts index 7b1a267d..a6b7db0d 100644 --- a/src/app/components/message/layout/layout.css.ts +++ b/src/app/components/message/layout/layout.css.ts @@ -153,3 +153,30 @@ export const Username = style({ }, }, }); + +export const MessageTextBody = recipe({ + base: { + wordBreak: 'break-word', + }, + variants: { + preWrap: { + true: { + whiteSpace: 'pre-wrap', + }, + }, + jumboEmoji: { + true: { + fontSize: '1.504em', + lineHeight: '1.4962em', + }, + }, + emote: { + true: { + color: color.Success.Main, + fontStyle: 'italic', + }, + }, + }, +}); + +export type MessageTextBodyVariants = RecipeVariants; diff --git a/src/app/components/url-preview/UrlPreview.css.tsx b/src/app/components/url-preview/UrlPreview.css.tsx new file mode 100644 index 00000000..3e97c116 --- /dev/null +++ b/src/app/components/url-preview/UrlPreview.css.tsx @@ -0,0 +1,45 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, color, config, toRem } from 'folds'; + +export const UrlPreview = style([ + DefaultReset, + { + width: toRem(400), + minHeight: toRem(102), + backgroundColor: color.SurfaceVariant.Container, + color: color.SurfaceVariant.OnContainer, + border: `${config.borderWidth.B300} solid ${color.SurfaceVariant.ContainerLine}`, + borderRadius: config.radii.R300, + overflow: 'hidden', + }, +]); + +export const UrlPreviewImg = style([ + DefaultReset, + { + width: toRem(100), + height: toRem(100), + objectFit: 'cover', + objectPosition: 'left', + backgroundPosition: 'start', + flexShrink: 0, + overflow: 'hidden', + }, +]); + +export const UrlPreviewContent = style([ + DefaultReset, + { + padding: config.space.S200, + }, +]); + +export const UrlPreviewDescription = style([ + DefaultReset, + { + display: '-webkit-box', + WebkitLineClamp: 2, + WebkitBoxOrient: 'vertical', + overflow: 'hidden', + }, +]); diff --git a/src/app/components/url-preview/UrlPreview.tsx b/src/app/components/url-preview/UrlPreview.tsx new file mode 100644 index 00000000..4ba3e4e2 --- /dev/null +++ b/src/app/components/url-preview/UrlPreview.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Box, as } from 'folds'; +import * as css from './UrlPreview.css'; + +export const UrlPreview = as<'div'>(({ className, ...props }, ref) => ( + +)); + +export const UrlPreviewImg = as<'img'>(({ className, alt, ...props }, ref) => ( + {alt} +)); + +export const UrlPreviewContent = as<'div'>(({ className, ...props }, ref) => ( + +)); + +export const UrlPreviewDescription = as<'span'>(({ className, ...props }, ref) => ( + +)); diff --git a/src/app/components/url-preview/index.ts b/src/app/components/url-preview/index.ts new file mode 100644 index 00000000..6d4dc333 --- /dev/null +++ b/src/app/components/url-preview/index.ts @@ -0,0 +1 @@ +export * from './UrlPreview'; diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index c1b04458..9603209d 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -74,6 +74,7 @@ import { Time, MessageBadEncryptedContent, MessageNotDecryptedContent, + MessageTextBody, } from '../../components/message'; import { emojifyAndLinkify, @@ -138,13 +139,15 @@ import initMatrix from '../../../client/initMatrix'; import { useKeyDown } from '../../hooks/useKeyDown'; import cons from '../../../client/state/cons'; import { useDocumentFocusChange } from '../../hooks/useDocumentFocusChange'; -import { EMOJI_PATTERN, VARIATION_SELECTOR_PATTERN } from '../../utils/regex'; +import { EMOJI_PATTERN, HTTP_URL_PATTERN, VARIATION_SELECTOR_PATTERN } from '../../utils/regex'; +import { UrlPreviewCard, UrlPreviewHolder } from './message/UrlPreviewCard'; // Thumbs up emoji found to have Variation Selector 16 at the end // so included variation selector pattern in regex const JUMBO_EMOJI_REG = new RegExp( `^(((${EMOJI_PATTERN})|(:.+?:))(${VARIATION_SELECTOR_PATTERN}|\\s)*){1,10}$` ); +const URL_REG = new RegExp(HTTP_URL_PATTERN, 'g'); const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -462,11 +465,15 @@ const getRoomUnreadInfo = (room: Room, scrollTo = false) => { export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimelineProps) { const mx = useMatrixClient(); + const encryptedRoom = mx.isRoomEncrypted(room.roomId); const [messageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing'); const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); const [hideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); + const [urlPreview] = useSetting(settingsAtom, 'urlPreview'); + const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); + const showUrlPreview = encryptedRoom ? encUrlPreview : urlPreview; const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId)); const { canDoAction, canSendEvent, getPowerLevel } = usePowerLevelsAPI(); @@ -1000,22 +1007,27 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; - const jumboEmoji = JUMBO_EMOJI_REG.test(trimReplyFromBody(body)); + const trimmedBody = trimReplyFromBody(body); + const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); + const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; return ( - - {renderBody(body, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - + <> + + {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} + {!!editedEvent && } + + {urls && urls.length > 0 && ( + + {urls.map((url) => ( + + ))} + + )} + ); }, renderEmote: (mEventId, mEvent, timelineSet) => { @@ -1026,21 +1038,31 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const senderDisplayName = getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId; + + if (typeof body !== 'string') return null; + const trimmedBody = trimReplyFromBody(body); + const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); + const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; + return ( - - {`${senderDisplayName} `} - {renderBody(body, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - + <> + + {`${senderDisplayName} `} + {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} + {!!editedEvent && } + + {urls && urls.length > 0 && ( + + {urls.map((url) => ( + + ))} + + )} + ); }, renderNotice: (mEventId, mEvent, timelineSet) => { @@ -1049,18 +1071,28 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; + const trimmedBody = trimReplyFromBody(body); + const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); + const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; + return ( - - {renderBody(body, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - + <> + + {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} + {!!editedEvent && } + + {urls && urls.length > 0 && ( + + {urls.map((url) => ( + + ))} + + )} + ); }, renderImage: (mEventId, mEvent) => { diff --git a/src/app/organisms/room/message/UrlPreviewCard.tsx b/src/app/organisms/room/message/UrlPreviewCard.tsx new file mode 100644 index 00000000..9ae4d298 --- /dev/null +++ b/src/app/organisms/room/message/UrlPreviewCard.tsx @@ -0,0 +1,183 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { IPreviewUrlResponse } from 'matrix-js-sdk'; +import { Box, Icon, IconButton, Icons, Scroll, Spinner, Text, as, color, config } from 'folds'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { + UrlPreview, + UrlPreviewContent, + UrlPreviewDescription, + UrlPreviewImg, +} from '../../../components/url-preview'; +import { + getIntersectionObserverEntry, + useIntersectionObserver, +} from '../../../hooks/useIntersectionObserver'; +import * as css from './styles.css'; + +const linkStyles = { color: color.Success.Main }; + +export const UrlPreviewCard = as<'div', { url: string; ts: number }>( + ({ url, ts, ...props }, ref) => { + const mx = useMatrixClient(); + const [previewStatus, loadPreview] = useAsyncCallback( + useCallback(() => mx.getUrlPreview(url, ts), [url, ts, mx]) + ); + if (previewStatus.status === AsyncStatus.Idle) loadPreview(); + + if (previewStatus.status === AsyncStatus.Error) return null; + + const renderContent = (prev: IPreviewUrlResponse) => { + const imgUrl = mx.mxcUrlToHttp(prev['og:image'] || '', 256, 256, 'scale', false); + + return ( + <> + {imgUrl && } + + + {typeof prev['og:site_name'] === 'string' && `${prev['og:site_name']} | `} + {decodeURIComponent(url)} + + + {prev['og:title']} + + + {prev['og:description']} + + + + ); + }; + + return ( + + {previewStatus.status === AsyncStatus.Success ? ( + renderContent(previewStatus.data) + ) : ( + + + + )} + + ); + } +); + +export const UrlPreviewHolder = as<'div'>(({ children, ...props }, ref) => { + const scrollRef = useRef(null); + const backAnchorRef = useRef(null); + const frontAnchorRef = useRef(null); + const [backVisible, setBackVisible] = useState(true); + const [frontVisible, setFrontVisible] = useState(true); + + const intersectionObserver = useIntersectionObserver( + useCallback((entries) => { + const backAnchor = backAnchorRef.current; + const frontAnchor = frontAnchorRef.current; + const backEntry = backAnchor && getIntersectionObserverEntry(backAnchor, entries); + const frontEntry = frontAnchor && getIntersectionObserverEntry(frontAnchor, entries); + if (backEntry) { + setBackVisible(backEntry.isIntersecting); + } + if (frontEntry) { + setFrontVisible(frontEntry.isIntersecting); + } + }, []), + useCallback( + () => ({ + root: scrollRef.current, + rootMargin: '10px', + }), + [] + ) + ); + + useEffect(() => { + const backAnchor = backAnchorRef.current; + const frontAnchor = frontAnchorRef.current; + if (backAnchor) intersectionObserver?.observe(backAnchor); + if (frontAnchor) intersectionObserver?.observe(frontAnchor); + return () => { + if (backAnchor) intersectionObserver?.unobserve(backAnchor); + if (frontAnchor) intersectionObserver?.unobserve(frontAnchor); + }; + }, [intersectionObserver]); + + const handleScrollBack = () => { + const scroll = scrollRef.current; + if (!scroll) return; + const { offsetWidth, scrollLeft } = scroll; + scroll.scrollTo({ + left: scrollLeft - offsetWidth / 1.3, + behavior: 'smooth', + }); + }; + const handleScrollFront = () => { + const scroll = scrollRef.current; + if (!scroll) return; + const { offsetWidth, scrollLeft } = scroll; + scroll.scrollTo({ + left: scrollLeft + offsetWidth / 1.3, + behavior: 'smooth', + }); + }; + + return ( + + + +
        + {!backVisible && ( + <> +
        + + + + + )} + + {children} + + {!frontVisible && ( + <> +
        + + + + + )} +
        + + + + + ); +}); diff --git a/src/app/organisms/room/message/styles.css.ts b/src/app/organisms/room/message/styles.css.ts index 801f698d..d42cf05b 100644 --- a/src/app/organisms/room/message/styles.css.ts +++ b/src/app/organisms/room/message/styles.css.ts @@ -1,5 +1,6 @@ import { style } from '@vanilla-extract/css'; -import { DefaultReset, config, toRem } from 'folds'; +import { recipe } from '@vanilla-extract/recipes'; +import { DefaultReset, color, config, toRem } from 'folds'; export const RelativeBase = style([ DefaultReset, @@ -83,3 +84,48 @@ export const ReactionsContainer = style({ export const ReactionsTooltipText = style({ wordBreak: 'break-word', }); + +export const UrlPreviewHolderGradient = recipe({ + base: [ + DefaultReset, + { + position: 'absolute', + height: '100%', + width: toRem(10), + zIndex: 1, + }, + ], + variants: { + position: { + Left: { + left: 0, + background: `linear-gradient(to right,${color.Surface.Container} , rgba(116,116,116,0))`, + }, + Right: { + right: 0, + background: `linear-gradient(to left,${color.Surface.Container} , rgba(116,116,116,0))`, + }, + }, + }, +}); +export const UrlPreviewHolderBtn = recipe({ + base: [ + DefaultReset, + { + position: 'absolute', + zIndex: 1, + }, + ], + variants: { + position: { + Left: { + left: 0, + transform: 'translateX(-25%)', + }, + Right: { + right: 0, + transform: 'translateX(25%)', + }, + }, + }, +}); diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 1b04669c..47abb45c 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -59,6 +59,8 @@ function AppearanceSection() { const [hideMembershipEvents, setHideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); const [mediaAutoLoad, setMediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); + const [urlPreview, setUrlPreview] = useSetting(settingsAtom, 'urlPreview'); + const [encUrlPreview, setEncUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); const [showHiddenEvents, setShowHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); const spacings = ['0', '100', '200', '300', '400', '500'] @@ -191,6 +193,26 @@ function AppearanceSection() { )} content={Prevent images and videos from auto loading to save bandwidth.} /> + setUrlPreview(!urlPreview)} + /> + )} + content={Show url preview for link in messages.} + /> + setEncUrlPreview(!encUrlPreview)} + /> + )} + content={Show url preview for link in encrypted messages.} + /> Date: Mon, 30 Oct 2023 16:58:30 +1100 Subject: [PATCH 519/824] Fix grammer in membership event messages (#1520) --- src/app/hooks/useMemberEventParser.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/hooks/useMemberEventParser.tsx b/src/app/hooks/useMemberEventParser.tsx index 367e76d9..6ceca1b1 100644 --- a/src/app/hooks/useMemberEventParser.tsx +++ b/src/app/hooks/useMemberEventParser.tsx @@ -90,13 +90,13 @@ export const useMemberEventParser = (): MemberEventParser => { senderId === userId ? ( <> {userName} - {' reject the invitation '} + {' rejected the invitation '} {content.reason} ) : ( <> {senderName} - {' reject '} + {' rejected '} {userName} {`'s join request `} {content.reason} From c854c7f9d2167e1e38baf90d17afa0ee1f77033b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 30 Oct 2023 16:58:47 +1100 Subject: [PATCH 520/824] Timeline Perf Improvement (#1521) * emojify msg txt find&replace instead of recursion * move findAndReplace func in its own file * improve find and replace * move markdown file to plugins * make find and replace work without g flag regex * fix pagination stop on msg arrive * render blurhash in small size --- src/app/components/editor/output.ts | 19 ++++++------ src/app/organisms/room/RoomTimeline.tsx | 2 -- .../organisms/room/message/ImageContent.tsx | 8 ++++- .../organisms/room/message/VideoContent.tsx | 8 ++++- src/app/{utils => plugins}/markdown.ts | 0 src/app/plugins/react-custom-html-parser.tsx | 30 ++++++++----------- src/app/utils/findAndReplace.ts | 28 +++++++++++++++++ 7 files changed, 65 insertions(+), 30 deletions(-) rename src/app/{utils => plugins}/markdown.ts (100%) create mode 100644 src/app/utils/findAndReplace.ts diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 9a03604c..53ee6ddf 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -3,7 +3,8 @@ import { Descendant, Text } from 'slate'; import { sanitizeText } from '../../utils/sanitize'; import { BlockType } from './types'; import { CustomElement } from './slate'; -import { parseBlockMD, parseInlineMD, replaceMatch } from '../../utils/markdown'; +import { parseBlockMD, parseInlineMD } from '../../plugins/markdown'; +import { findAndReplace } from '../../utils/findAndReplace'; export type OutputOptions = { allowTextFormatting?: boolean; @@ -69,14 +70,14 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { } }; -const HTML_TAG_REG = /<([\w-]+)(?: [^>]*)?(?:(?:\/>)|(?:>.*?<\/\1>))/; -const ignoreHTMLParseInlineMD = (text: string): string => { - if (text === '') return text; - const match = text.match(HTML_TAG_REG); - if (!match) return parseInlineMD(text); - const [matchedTxt] = match; - return replaceMatch((txt) => [ignoreHTMLParseInlineMD(txt)], text, match, matchedTxt).join(''); -}; +const HTML_TAG_REG_G = /<([\w-]+)(?: [^>]*)?(?:(?:\/>)|(?:>.*?<\/\1>))/g; +const ignoreHTMLParseInlineMD = (text: string): string => + findAndReplace( + text, + HTML_TAG_REG_G, + (match) => match[0], + (txt) => parseInlineMD(txt) + ).join(''); export const toMatrixCustomHTML = ( node: Descendant | Descendant[], diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 9603209d..0c74de52 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -345,7 +345,6 @@ const useTimelinePagination = ( return async (backwards: boolean) => { if (fetching) return; - const targetTimeline = timelineRef.current; const { linkedTimelines: lTimelines } = timelineRef.current; const timelinesEventsCount = lTimelines.map(timelineToEventsCount); @@ -385,7 +384,6 @@ const useTimelinePagination = ( } fetching = false; - if (targetTimeline !== timelineRef.current) return; if (alive()) { recalibratePagination(lTimelines, timelinesEventsCount, backwards); } diff --git a/src/app/organisms/room/message/ImageContent.tsx b/src/app/organisms/room/message/ImageContent.tsx index c8b32cc1..6e288026 100644 --- a/src/app/organisms/room/message/ImageContent.tsx +++ b/src/app/organisms/room/message/ImageContent.tsx @@ -98,7 +98,13 @@ export const ImageContent = as<'div', ImageContentProps>( )} {typeof blurHash === 'string' && !load && ( - + )} {!autoPlay && srcState.status === AsyncStatus.Idle && ( diff --git a/src/app/organisms/room/message/VideoContent.tsx b/src/app/organisms/room/message/VideoContent.tsx index 107d5f9a..8b3bd34d 100644 --- a/src/app/organisms/room/message/VideoContent.tsx +++ b/src/app/organisms/room/message/VideoContent.tsx @@ -88,7 +88,13 @@ export const VideoContent = as<'div', VideoContentProps>( return ( {typeof blurHash === 'string' && !load && ( - + )} {thumbSrcState.status === AsyncStatus.Success && !load && ( diff --git a/src/app/utils/markdown.ts b/src/app/plugins/markdown.ts similarity index 100% rename from src/app/utils/markdown.ts rename to src/app/plugins/markdown.ts diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index 928419c5..ee41687d 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -18,11 +18,11 @@ import { getMxIdLocalPart, getRoomWithCanonicalAlias } from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; -import { replaceMatch } from '../utils/markdown'; +import { findAndReplace } from '../utils/findAndReplace'; const ReactPrism = lazy(() => import('./react-prism/ReactPrism')); -const EMOJI_REG = new RegExp(`${URL_NEG_LB}(${EMOJI_PATTERN})`); +const EMOJI_REG_G = new RegExp(`${URL_NEG_LB}(${EMOJI_PATTERN})`, 'g'); export const LINKIFY_OPTS: LinkifyOpts = { attributes: { @@ -35,26 +35,22 @@ export const LINKIFY_OPTS: LinkifyOpts = { ignoreTags: ['span'], }; -const stringToEmojifyJSX = (text: string): (string | JSX.Element)[] => { - const match = text.match(EMOJI_REG); - if (!match) return [text]; - - const [emoji] = match; - - return replaceMatch( - stringToEmojifyJSX, +const textToEmojifyJSX = (text: string): (string | JSX.Element)[] => + findAndReplace( text, - match, - - - {emoji} + EMOJI_REG_G, + (match, pushIndex) => ( + + + {match[0]} + - + ), + (txt) => txt ); -}; export const emojifyAndLinkify = (text: string, linkify?: boolean) => { - const emojifyJSX = stringToEmojifyJSX(text); + const emojifyJSX = textToEmojifyJSX(text); if (linkify) { return {emojifyJSX}; diff --git a/src/app/utils/findAndReplace.ts b/src/app/utils/findAndReplace.ts new file mode 100644 index 00000000..a4bd1edb --- /dev/null +++ b/src/app/utils/findAndReplace.ts @@ -0,0 +1,28 @@ +export type ReplaceCallback = ( + match: RegExpExecArray | RegExpMatchArray, + pushIndex: number +) => R; +export type ConvertPartCallback = (text: string, pushIndex: number) => R; + +export const findAndReplace = ( + text: string, + regex: RegExp, + replace: ReplaceCallback, + convertPart: ConvertPartCallback +): Array => { + const result: Array = []; + let lastEnd = 0; + + let match: RegExpExecArray | RegExpMatchArray | null = regex.exec(text); + while (match !== null && typeof match.index === 'number') { + result.push(convertPart(text.slice(lastEnd, match.index), result.length)); + result.push(replace(match, result.length)); + + lastEnd = match.index + match[0].length; + if (regex.global) match = regex.exec(text); + } + + result.push(convertPart(text.slice(lastEnd), result.length)); + + return result; +}; From c3f564605fd9653a593d0685cc8b8e2addd1281e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 31 Oct 2023 14:17:57 +1100 Subject: [PATCH 521/824] Render reaction with string only key (#1522) --- src/app/organisms/room/message/Reactions.tsx | 3 +- .../room/reaction-viewer/ReactionViewer.tsx | 30 ++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/app/organisms/room/message/Reactions.tsx b/src/app/organisms/room/message/Reactions.tsx index 17b914e5..728cf810 100644 --- a/src/app/organisms/room/message/Reactions.tsx +++ b/src/app/organisms/room/message/Reactions.tsx @@ -43,7 +43,6 @@ export const Reactions = as<'div', ReactionsProps>( evt.stopPropagation(); evt.preventDefault(); const key = evt.currentTarget.getAttribute('data-reaction-key'); - console.log(key); if (!key) setViewer(true); else setViewer(key); }; @@ -58,7 +57,7 @@ export const Reactions = as<'div', ReactionsProps>( > {reactions.map(([key, events]) => { const rEvents = Array.from(events); - if (rEvents.length === 0) return null; + if (rEvents.length === 0 || typeof key !== 'string') return null; const myREvent = myUserId ? rEvents.find(factoryEventSentBy(myUserId)) : undefined; const isPressed = !!myREvent?.getRelation(); diff --git a/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx b/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx index 5626981e..7bcc0ccf 100644 --- a/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx +++ b/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx @@ -41,7 +41,12 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( relations, useCallback((rel) => [...(rel.getSortedAnnotationsByKey() ?? [])], []) ); - const [selectedKey, setSelectedKey] = useState(initialKey ?? reactions[0][0]); + + const [selectedKey, setSelectedKey] = useState(() => { + if (initialKey) return initialKey; + const defaultReaction = reactions.find((reaction) => typeof reaction[0] === 'string'); + return defaultReaction ? defaultReaction[0] : ''; + }); const getName = (member: RoomMember) => getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) ?? member.userId; @@ -68,16 +73,19 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( - {reactions.map(([key, evts]) => ( - setSelectedKey(key)} - /> - ))} + {reactions.map(([key, evts]) => { + if (typeof key !== 'string') return null; + return ( + setSelectedKey(key)} + /> + ); + })} From 687ad8d0f0b30146d4cad585d73e79dba57ed729 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 31 Oct 2023 14:18:30 +1100 Subject: [PATCH 522/824] Fix blockcode with empty lines not rendered (#1524) --- src/app/plugins/markdown.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/plugins/markdown.ts b/src/app/plugins/markdown.ts index c6bb3914..40427a7f 100644 --- a/src/app/plugins/markdown.ts +++ b/src/app/plugins/markdown.ts @@ -248,7 +248,7 @@ const HeadingRule: BlockMDRule = { }; const CODEBLOCK_MD_1 = '```'; -const CODEBLOCK_REG_1 = /^`{3}(\S*)\n((.+\n)+)`{3} *(?!.)\n?/m; +const CODEBLOCK_REG_1 = /^`{3}(\S*)\n((?:.*\n)+?)`{3} *(?!.)\n?/m; const CodeBlockRule: BlockMDRule = { match: (text) => text.match(CODEBLOCK_REG_1), html: (match) => { @@ -285,7 +285,7 @@ const O_LIST_ITEM_PREFIX = /^(-|[\da-zA-Z]\.) */; const O_LIST_START = /^([\d])\./; const O_LIST_TYPE = /^([aAiI])\./; const O_LIST_TRAILING_NEWLINE = /\n$/; -const ORDERED_LIST_REG_1 = /(^(-|[\da-zA-Z]\.) +.+\n?)+/m; +const ORDERED_LIST_REG_1 = /(^(?:-|[\da-zA-Z]\.) +.+\n?)+/m; const OrderedListRule: BlockMDRule = { match: (text) => text.match(ORDERED_LIST_REG_1), html: (match, parseInline) => { From 1db0a9eaa8349bb19b545c7827bc37dacbb1b868 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 31 Oct 2023 08:57:59 +0530 Subject: [PATCH 523/824] fix typo in codeblock markdown output --- src/app/plugins/markdown.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/plugins/markdown.ts b/src/app/plugins/markdown.ts index 40427a7f..9b3b82f7 100644 --- a/src/app/plugins/markdown.ts +++ b/src/app/plugins/markdown.ts @@ -254,7 +254,7 @@ const CodeBlockRule: BlockMDRule = { html: (match) => { const [, g1, g2] = match; const classNameAtt = g1 ? ` class="language-${g1}"` : ''; - return `
        ${g2}
        `; + return `
        ${g2}
        `; }, }; From 9ecb233763048c730d24ddacecc8c002d3c8fc89 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Tue, 31 Oct 2023 21:20:49 +1100 Subject: [PATCH 524/824] Release v3.2.0 (#1531) * Release v3.2.0 * Update cons.js --- package-lock.json | 4 ++-- package.json | 2 +- src/client/state/cons.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e581863..67784823 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "3.1.0", + "version": "3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "3.1.0", + "version": "3.2.0", "license": "AGPL-3.0-only", "dependencies": { "@fontsource/inter": "4.5.14", diff --git a/package.json b/package.json index 17fbf168..69bcd8f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "3.1.0", + "version": "3.2.0", "description": "Yet another matrix client", "main": "index.js", "engines": { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index b8074d90..62c0cacc 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '3.1.0', + version: '3.2.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From 2889a72b8171191b98eb3e4ef7bf98a2ba3b8781 Mon Sep 17 00:00:00 2001 From: Jan Jurzitza Date: Tue, 28 Nov 2023 15:52:20 +0100 Subject: [PATCH 525/824] Make small images not scale up in image viewer (#1554) Instead show them in real resolution --- src/app/components/image-viewer/ImageViewer.css.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/components/image-viewer/ImageViewer.css.ts b/src/app/components/image-viewer/ImageViewer.css.ts index fc2f5088..d688afcb 100644 --- a/src/app/components/image-viewer/ImageViewer.css.ts +++ b/src/app/components/image-viewer/ImageViewer.css.ts @@ -32,8 +32,10 @@ export const ImageViewerImg = style([ DefaultReset, { objectFit: 'contain', - width: '100%', - height: '100%', + width: 'auto', + height: 'auto', + maxWidth: '100%', + maxHeight: '100%', backgroundColor: color.Surface.Container, transition: 'transform 100ms linear', }, From 2a1bf4a42ad6ed887c7e1c47538e61a77d7c86f1 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:58:01 +1100 Subject: [PATCH 526/824] Update default server list (#1571) Remvoe 0wnz.at from list as it seems to need registeration token which we don't support. --- config.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.json b/config.json index ac7b1f32..0ff493a1 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,6 @@ { - "defaultHomeserver": 3, + "defaultHomeserver": 2, "homeserverList": [ - "0wnz.at", "converser.eu", "envs.net", "matrix.org", From bb88eb715484ffb46b9e56368f1d92651dc4c6bb Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 25 Dec 2023 01:08:17 +1100 Subject: [PATCH 527/824] Up-mx-js-sdk-29 (#1533) * update matrix-js-sdk * replace deprecated resolveRoomAlias --- package-lock.json | 58 +++++++++++++++------- package.json | 2 +- src/app/organisms/join-alias/JoinAlias.jsx | 2 +- src/util/matrixUtil.js | 2 +- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 67784823..6c944cea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", - "matrix-js-sdk": "24.1.0", + "matrix-js-sdk": "29.1.0", "millify": "6.1.0", "pdfjs-dist": "3.10.111", "prismjs": "1.29.0", @@ -1106,10 +1106,10 @@ "node": ">=10" } }, - "node_modules/@matrix-org/matrix-sdk-crypto-js": { - "version": "0.1.0-alpha.5", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.5.tgz", - "integrity": "sha512-2KjAgWNGfuGLNjJwsrs6gGX157vmcTfNrA4u249utgnMPbJl7QwuUqh1bGxQ0PpK06yvZjgPlkna0lTbuwtuQw==", + "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-2.2.0.tgz", + "integrity": "sha512-txmvaTiZpVV0/kWCRcE7tZvRESCEc1ynLJDVh9OUsFlaXfl13c7qdD3E6IJEJ8YiPMIn+PHogdfBZsO84reaMg==", "engines": { "node": ">= 10" } @@ -2712,9 +2712,9 @@ "dev": true }, "node_modules/@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.2.tgz", + "integrity": "sha512-v4Mr60wJuF069iZZCdY5DKhfj0l6eXNJtbSM/oMDNdRLoBEUsktmKnswkz0X3OAic5W8Qy/YU6owKE4A66Y46A==" }, "node_modules/@types/file-saver": { "version": "2.0.5", @@ -3843,6 +3843,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/css-what": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", @@ -5894,6 +5899,11 @@ "node": ">=4.0" } }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "node_modules/katex": { "version": "0.16.4", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", @@ -6098,31 +6108,33 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.1.0.tgz", - "integrity": "sha512-xEx2ZoNsS56dwgqLJ3rIv2SUpFxdQLrLKmJCpMatMUKCAg+NGuZfpQ3QXblIbGaqFNQZCH7fC7S48AeTMZp1Jw==", + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-29.1.0.tgz", + "integrity": "sha512-nF+ACFioDltGCf2KFfXK7QoJ70Ytnzm4Jse2UI+BDXeR9WCjtKefXJtboN2rmU4MFmLCTHcnBTmu6yig67YUqw==", "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.5", + "@matrix-org/matrix-sdk-crypto-wasm": "^2.0.0", "another-json": "^0.2.0", "bs58": "^5.0.0", "content-type": "^1.0.4", + "jwt-decode": "^3.1.2", "loglevel": "^1.7.1", "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.3.1", + "matrix-widget-api": "^1.6.0", + "oidc-client-ts": "^2.2.4", "p-retry": "4", "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6", "uuid": "9" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/matrix-widget-api": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.4.0.tgz", - "integrity": "sha512-dw0dRylGQzDUoiaY/g5xx1tBbS7aoov31PRtFMAvG58/4uerYllV9Gfou7w+I1aglwB6hihTREzKltVjARWV6A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.6.0.tgz", + "integrity": "sha512-VXIJyAZ/WnBmT4C7ePqevgMYGneKMCP/0JuCOqntSsaNlCRHJvwvTxmqUU+ufOpzIF5gYNyIrAjbgrEbK3iqJQ==", "dependencies": { "@types/events": "^3.0.0", "events": "^3.2.0" @@ -6462,6 +6474,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-client-ts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", + "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", + "dependencies": { + "crypto-js": "^4.2.0", + "jwt-decode": "^3.1.2" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/package.json b/package.json index 69bcd8f0..cb6111b5 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", - "matrix-js-sdk": "24.1.0", + "matrix-js-sdk": "29.1.0", "millify": "6.1.0", "pdfjs-dist": "3.10.111", "prismjs": "1.29.0", diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx index bb90bf35..bc0a8adb 100644 --- a/src/app/organisms/join-alias/JoinAlias.jsx +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -62,7 +62,7 @@ function JoinAliasContent({ term, requestClose }) { let via; if (alias.startsWith('#')) { try { - const aliasData = await mx.resolveRoomAlias(alias); + const aliasData = await mx.getRoomIdForAlias(alias); via = aliasData?.servers.slice(0, 3) || []; if (mountStore.getItem()) { setProcess(`Joining ${alias}...`); diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index 54ee31bb..a776fb2b 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -41,7 +41,7 @@ export function getUsernameOfRoomMember(roomMember) { export async function isRoomAliasAvailable(alias) { try { - const result = await initMatrix.matrixClient.resolveRoomAlias(alias); + const result = await initMatrix.matrixClient.getRoomIdForAlias(alias); if (result.room_id) return false; return false; } catch (e) { From 20db27fa7ef1cbb9682780ecb4dbdf96cc4540ec Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 21 Jan 2024 23:50:56 +1100 Subject: [PATCH 528/824] feat: URL navigation in auth (#1603) * bump to react 18 and install react-router-dom * Upgrade to react 18 root * update vite * add cs api's * convert state/auth to ts * add client config context * add auto discovery context * add spec version context * add auth flow context * add background dot pattern css * add promise utils * init url based routing * update auth route server path as effect * add auth server hook * always use server from discovery info in context * login - WIP * upgrade jotai to v2 * add atom with localStorage util * add multi account sessions atom * add default IGNORE res to auto discovery * add error type in async callback hook * handle password login error * fix async callback hook * allow password login * Show custom server not allowed error in mxId login * add sso login component * add token login * fix hardcoded m.login.password in login func * update server input on url change * Improve sso login labels * update folds * fix async callback batching state update in safari * wrap async callback set state in queueMicrotask * wip * wip - register * arrange auth file structure * add error codes * extract filed error component form password login * add register util function * handle register flow - WIP * update unsupported auth flow method reasons * improve password input styles * Improve UIA flow next stage calculation complete stages can have any order so we will look for first stage which is not in completed * process register UIA flow stages * Extract register UIA stages component * improve register error messages * add focus trap & step count in UIA stages * add reset password path and path utils * add path with origin hook * fix sso redirect url * rename register token query param to token * restyle auth screen header * add reset password component - WIP * add reset password form * add netlify rewrites * fix netlify file indentation * test netlify redirect * fix vite to include netlify toml * add more netlify redirects * add splat to public and assets path * fix vite base name * add option to use hash router in config and remove appVersion * add splash screen component * add client config loading and error screen * fix server picker bug * fix reset password email input type * make auth page small screen responsive * fix typo in reset password screen --- _redirects | 3 - build.config.ts | 3 + config.json | 7 +- index.html | 2 +- netlify.toml | 34 + package-lock.json | 1018 ++++++++++------- package.json | 22 +- src/app/components/AuthFlowsLoader.tsx | 64 ++ src/app/components/ClientConfigLoader.tsx | 38 + src/app/components/ConfirmPasswordMatch.tsx | 35 + src/app/components/SpecVersionsLoader.tsx | 32 + .../components/SupportedUIAFlowsLoader.tsx | 17 + src/app/components/UIAFlowOverlay.tsx | 72 ++ .../password-input/PasswordInput.tsx | 45 + .../splash-screen/SplashScreen.css.ts | 12 + .../components/splash-screen/SplashScreen.tsx | 29 + src/app/components/splash-screen/index.ts | 1 + src/app/components/uia-stages/DummyStage.tsx | 65 ++ src/app/components/uia-stages/EmailStage.tsx | 172 +++ .../components/uia-stages/ReCaptchaStage.tsx | 64 ++ .../uia-stages/RegistrationTokenStage.tsx | 117 ++ src/app/components/uia-stages/TermsStage.tsx | 69 ++ src/app/components/uia-stages/index.ts | 6 + src/app/components/uia-stages/types.ts | 8 + src/app/cs-api.ts | 115 ++ src/app/cs-errorcode.ts | 37 + src/app/hooks/types.ts | 12 + src/app/hooks/useAsyncCallback.ts | 48 +- src/app/hooks/useAuthFlows.ts | 59 + src/app/hooks/useAuthServer.ts | 14 + src/app/hooks/useAutoDiscoveryInfo.ts | 15 + src/app/hooks/useClientConfig.ts | 33 + src/app/hooks/useCrossSigningStatus.js | 2 +- src/app/hooks/useParsedLoginFlows.ts | 38 + src/app/hooks/usePasswordEmail.ts | 32 + src/app/hooks/usePathWithOrigin.ts | 26 + src/app/hooks/useRegisterEmail.ts | 32 + src/app/hooks/useSpecVersions.ts | 12 + src/app/hooks/useUIAFlows.ts | 96 ++ .../molecules/room-aliases/RoomAliases.jsx | 4 +- .../RoomHistoryVisibility.jsx | 4 +- .../room-notification/RoomNotification.jsx | 4 +- src/app/molecules/room-search/RoomSearch.jsx | 4 +- .../room-visibility/RoomVisibility.jsx | 4 +- .../emoji-verification/EmojiVerification.jsx | 2 +- .../organisms/room/message/UrlPreviewCard.tsx | 5 +- .../organisms/space-manage/SpaceManage.jsx | 4 +- src/app/pages/App.jsx | 17 - src/app/pages/App.tsx | 82 ++ src/app/pages/ConfigConfig.tsx | 53 + src/app/pages/auth/AuthFooter.tsx | 28 + src/app/pages/auth/AuthLayout.tsx | 215 ++++ src/app/pages/auth/FiledError.tsx | 13 + src/app/pages/auth/OrDivider.tsx | 12 + src/app/pages/auth/SSOLogin.tsx | 68 ++ src/app/pages/auth/ServerPicker.tsx | 140 +++ src/app/pages/auth/index.ts | 4 + src/app/pages/auth/login/Login.tsx | 73 ++ .../pages/auth/login/PasswordLoginForm.tsx | 272 +++++ src/app/pages/auth/login/TokenLogin.tsx | 94 ++ src/app/pages/auth/login/index.ts | 1 + src/app/pages/auth/login/loginUtil.ts | 118 ++ .../auth/register/PasswordRegisterForm.tsx | 420 +++++++ src/app/pages/auth/register/Register.tsx | 95 ++ src/app/pages/auth/register/index.ts | 1 + src/app/pages/auth/register/registerUtil.ts | 125 ++ .../auth/reset-password/PasswordResetForm.tsx | 274 +++++ .../auth/reset-password/ResetPassword.tsx | 36 + src/app/pages/auth/reset-password/index.ts | 1 + .../auth/reset-password/resetPasswordUtil.ts | 23 + src/app/pages/auth/styles.css.ts | 53 + src/app/pages/pathUtils.ts | 28 + src/app/pages/paths.ts | 17 + src/app/state/hooks/inviteList.ts | 37 +- src/app/state/hooks/roomList.ts | 34 +- src/app/state/hooks/settings.ts | 20 +- src/app/state/inviteList.ts | 4 +- src/app/state/list.ts | 2 +- src/app/state/mDirectList.ts | 9 +- src/app/state/mutedRoomList.ts | 9 +- src/app/state/roomList.ts | 9 +- src/app/state/roomToParents.ts | 6 +- src/app/state/roomToUnread.ts | 6 +- src/app/state/sessions.ts | 129 +++ src/app/state/settings.ts | 2 +- src/app/state/tabToRoom.ts | 2 +- src/app/state/typingMembers.ts | 6 +- src/app/state/upload.ts | 2 +- src/app/state/utils.ts | 2 +- src/app/state/utils/atomWithLocalStorage.ts | 51 + src/app/styles/Patterns.css.ts | 9 + src/app/utils/common.ts | 18 + src/app/utils/matrix-uia.ts | 84 ++ src/app/utils/regex.ts | 3 + src/client/action/auth.js | 2 +- src/client/initMatrix.js | 3 +- src/client/state/auth.js | 19 - src/client/state/auth.ts | 12 + src/ext.d.ts | 7 + src/{index.jsx => index.tsx} | 17 +- src/types/utils.ts | 3 + tsconfig.json | 1 + vite.config.js | 7 +- 103 files changed, 4772 insertions(+), 543 deletions(-) delete mode 100644 _redirects create mode 100644 build.config.ts create mode 100644 netlify.toml create mode 100644 src/app/components/AuthFlowsLoader.tsx create mode 100644 src/app/components/ClientConfigLoader.tsx create mode 100644 src/app/components/ConfirmPasswordMatch.tsx create mode 100644 src/app/components/SpecVersionsLoader.tsx create mode 100644 src/app/components/SupportedUIAFlowsLoader.tsx create mode 100644 src/app/components/UIAFlowOverlay.tsx create mode 100644 src/app/components/password-input/PasswordInput.tsx create mode 100644 src/app/components/splash-screen/SplashScreen.css.ts create mode 100644 src/app/components/splash-screen/SplashScreen.tsx create mode 100644 src/app/components/splash-screen/index.ts create mode 100644 src/app/components/uia-stages/DummyStage.tsx create mode 100644 src/app/components/uia-stages/EmailStage.tsx create mode 100644 src/app/components/uia-stages/ReCaptchaStage.tsx create mode 100644 src/app/components/uia-stages/RegistrationTokenStage.tsx create mode 100644 src/app/components/uia-stages/TermsStage.tsx create mode 100644 src/app/components/uia-stages/index.ts create mode 100644 src/app/components/uia-stages/types.ts create mode 100644 src/app/cs-api.ts create mode 100644 src/app/cs-errorcode.ts create mode 100644 src/app/hooks/types.ts create mode 100644 src/app/hooks/useAuthFlows.ts create mode 100644 src/app/hooks/useAuthServer.ts create mode 100644 src/app/hooks/useAutoDiscoveryInfo.ts create mode 100644 src/app/hooks/useClientConfig.ts create mode 100644 src/app/hooks/useParsedLoginFlows.ts create mode 100644 src/app/hooks/usePasswordEmail.ts create mode 100644 src/app/hooks/usePathWithOrigin.ts create mode 100644 src/app/hooks/useRegisterEmail.ts create mode 100644 src/app/hooks/useSpecVersions.ts create mode 100644 src/app/hooks/useUIAFlows.ts delete mode 100644 src/app/pages/App.jsx create mode 100644 src/app/pages/App.tsx create mode 100644 src/app/pages/ConfigConfig.tsx create mode 100644 src/app/pages/auth/AuthFooter.tsx create mode 100644 src/app/pages/auth/AuthLayout.tsx create mode 100644 src/app/pages/auth/FiledError.tsx create mode 100644 src/app/pages/auth/OrDivider.tsx create mode 100644 src/app/pages/auth/SSOLogin.tsx create mode 100644 src/app/pages/auth/ServerPicker.tsx create mode 100644 src/app/pages/auth/index.ts create mode 100644 src/app/pages/auth/login/Login.tsx create mode 100644 src/app/pages/auth/login/PasswordLoginForm.tsx create mode 100644 src/app/pages/auth/login/TokenLogin.tsx create mode 100644 src/app/pages/auth/login/index.ts create mode 100644 src/app/pages/auth/login/loginUtil.ts create mode 100644 src/app/pages/auth/register/PasswordRegisterForm.tsx create mode 100644 src/app/pages/auth/register/Register.tsx create mode 100644 src/app/pages/auth/register/index.ts create mode 100644 src/app/pages/auth/register/registerUtil.ts create mode 100644 src/app/pages/auth/reset-password/PasswordResetForm.tsx create mode 100644 src/app/pages/auth/reset-password/ResetPassword.tsx create mode 100644 src/app/pages/auth/reset-password/index.ts create mode 100644 src/app/pages/auth/reset-password/resetPasswordUtil.ts create mode 100644 src/app/pages/auth/styles.css.ts create mode 100644 src/app/pages/pathUtils.ts create mode 100644 src/app/pages/paths.ts create mode 100644 src/app/state/sessions.ts create mode 100644 src/app/state/utils/atomWithLocalStorage.ts create mode 100644 src/app/styles/Patterns.css.ts create mode 100644 src/app/utils/matrix-uia.ts delete mode 100644 src/client/state/auth.js create mode 100644 src/client/state/auth.ts rename src/{index.jsx => index.tsx} (57%) create mode 100644 src/types/utils.ts diff --git a/_redirects b/_redirects deleted file mode 100644 index 270cd338..00000000 --- a/_redirects +++ /dev/null @@ -1,3 +0,0 @@ -# Redirects from what the browser requests to what we serve -/login / -/register / diff --git a/build.config.ts b/build.config.ts new file mode 100644 index 00000000..ec8a41d0 --- /dev/null +++ b/build.config.ts @@ -0,0 +1,3 @@ +export default { + base: '/', +}; diff --git a/config.json b/config.json index 0ff493a1..484c7cd7 100644 --- a/config.json +++ b/config.json @@ -8,5 +8,10 @@ "mozilla.org", "xmr.se" ], - "allowCustomHomeservers": true + "allowCustomHomeservers": true, + + "hashRouter": { + "enabled": false, + "basename": "/" + } } diff --git a/index.html b/index.html index 6bc955c1..48f8e69e 100644 --- a/index.html +++ b/index.html @@ -96,6 +96,6 @@ - + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..e7d948e6 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,34 @@ +[[redirects]] + from = "/config.json" + to = "/config.json" + status = 200 + +[[redirects]] + from = "/manifest.json" + to = "/manifest.json" + status = 200 + +[[redirects]] + from = "/olm.wasm" + to = "/olm.wasm" + status = 200 + +[[redirects]] + from = "/pdf.worker.min.js" + to = "/pdf.worker.min.js" + status = 200 + +[[redirects]] + from = "/public/*" + to = "/public/:splat" + status = 200 + +[[redirects]] + from = "/assets/*" + to = "/assets/:splat" + status = 200 + +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6c944cea..fba4072e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,13 +29,13 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.5.0", + "folds": "1.5.1", "formik": "2.2.9", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", - "jotai": "1.12.0", + "jotai": "2.6.0", "katex": "0.16.4", "linkify-html": "4.0.2", "linkify-react": "4.1.1", @@ -45,17 +45,18 @@ "pdfjs-dist": "3.10.111", "prismjs": "1.29.0", "prop-types": "15.8.1", - "react": "17.0.2", + "react": "18.2.0", "react-aria": "3.29.1", "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", - "react-dnd": "15.1.2", - "react-dnd-html5-backend": "15.1.3", - "react-dom": "17.0.2", + "react-dnd": "16.0.1", + "react-dnd-html5-backend": "16.0.1", + "react-dom": "18.2.0", "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "react-range": "1.8.14", + "react-router-dom": "6.20.0", "sanitize-html": "2.8.0", "slate": "0.94.1", "slate-history": "0.93.0", @@ -71,13 +72,14 @@ "@types/file-saver": "2.0.5", "@types/node": "18.11.18", "@types/prismjs": "1.26.0", - "@types/react": "18.0.26", - "@types/react-dom": "18.0.9", + "@types/react": "18.2.39", + "@types/react-dom": "18.2.17", + "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", - "@vitejs/plugin-react": "3.0.0", + "@vitejs/plugin-react": "4.2.0", "buffer": "6.0.3", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", @@ -90,7 +92,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.3.9", + "vite": "5.0.8", "vite-plugin-static-copy": "0.13.0" }, "engines": { @@ -110,44 +112,45 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -158,12 +161,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -171,9 +175,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -184,21 +188,18 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { @@ -215,139 +216,139 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -355,9 +356,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -380,12 +381,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", - "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -395,12 +396,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -445,31 +446,31 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -478,12 +479,12 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1893,19 +1894,19 @@ } }, "node_modules/@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", + "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" }, "node_modules/@react-dnd/invariant": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-3.0.1.tgz", - "integrity": "sha512-blqduwV86oiKw2Gr44wbe3pj3Z/OsXirc7ybCv9F/pLAR+Aih8F3rjeJzK0ANgtYKv5lCpkGVoZAeKitKDaD/g==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", + "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" }, "node_modules/@react-dnd/shallowequal": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", - "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", + "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" }, "node_modules/@react-stately/calendar": { "version": "3.4.1", @@ -2583,6 +2584,14 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@remix-run/router": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.0.tgz", + "integrity": "sha512-5dMOnVnefRsl4uRnAdoWjtVTdh8e6aZqgM4puy9nmEADH72ck+uXwzpJLEKE9Q6F8ZljNewLgmTfkxUrBdv4WA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", @@ -2656,6 +2665,175 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz", + "integrity": "sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz", + "integrity": "sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz", + "integrity": "sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz", + "integrity": "sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz", + "integrity": "sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz", + "integrity": "sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz", + "integrity": "sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz", + "integrity": "sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz", + "integrity": "sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz", + "integrity": "sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz", + "integrity": "sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz", + "integrity": "sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz", + "integrity": "sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@swc/helpers": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", @@ -2705,6 +2883,47 @@ "react-dom": ">=16.8" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", @@ -2762,9 +2981,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "version": "18.2.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", + "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2772,9 +2991,18 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", - "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "version": "18.2.17", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", + "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-google-recaptcha": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.8.tgz", + "integrity": "sha512-nYI3ZDoteZ0g4FYusyKWqz7AZqRdu70R3wDkosCcN0peb2WLn57i0Alm4IPiCRIx59yTUVPTiOELZH08gV1wXA==", "dev": true, "dependencies": { "@types/react": "*" @@ -3208,22 +3436,22 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz", - "integrity": "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", + "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", "dev": true, "dependencies": { - "@babel/core": "^7.20.5", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", + "@babel/core": "^7.23.3", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.4", "react-refresh": "^0.14.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.0.0" + "vite": "^4.2.0 || ^5.0.0" } }, "node_modules/abbrev": { @@ -3550,9 +3778,9 @@ "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -3561,13 +3789,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -3631,9 +3863,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001446", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", - "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==", + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", "funding": [ { "type": "opencollective", @@ -3642,6 +3874,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -3806,9 +4042,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js-pure": { "version": "3.26.1", @@ -3997,13 +4233,13 @@ } }, "node_modules/dnd-core": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", - "integrity": "sha512-EOec1LyJUuGRFg0LDa55rSRAUe97uNVKVkUo8iyvzQlcECYTuPblVQfRWXWj1OyPseFIeebWpNmKFy0h6BcF1A==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", + "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", "dependencies": { - "@react-dnd/asap": "4.0.1", - "@react-dnd/invariant": "3.0.1", - "redux": "^4.1.2" + "@react-dnd/asap": "^5.0.1", + "@react-dnd/invariant": "^4.0.1", + "redux": "^4.2.0" } }, "node_modules/doctrine": { @@ -4070,9 +4306,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + "version": "1.4.596", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz", + "integrity": "sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4959,9 +5195,9 @@ } }, "node_modules/folds": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/folds/-/folds-1.5.0.tgz", - "integrity": "sha512-1QNHzD57OxFZT5SOe0nWcrKQvWmfMRv1f5sTF8xhGtwx9rajjv36T9SwCcj9Fh58PbERqOdBiwvpdhu+BQTVjg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/folds/-/folds-1.5.1.tgz", + "integrity": "sha512-2QxyA+FRKjPKXDTMDoD7NmOUiReWrKYO0Msg44QqlzTkTrRVEzJgyPIfC/Ia4/u0ByQpk6dbq8UQxomKmneJ/g==", "peerDependencies": { "@vanilla-extract/css": "^1.9.2", "@vanilla-extract/recipes": "^0.3.0", @@ -5045,9 +5281,9 @@ "devOptional": 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==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -5762,54 +5998,21 @@ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" }, "node_modules/jotai": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.12.0.tgz", - "integrity": "sha512-IhyBmjxU1sE2Ni/MUK7gQAb8QvCM6yd1/K5jtQzgQBmmjCjgfXZkkk1rYlQAIRp2KoQk0Y+yzhm1f5cZ7kegnw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.6.0.tgz", + "integrity": "sha512-Vt6hsc04Km4j03l+Ax+Sc+FVft5cRJhqgxt6GTz6GM2eM3DyX3CdBdzcG0z2FrlZToL1/0OAkqDghIyARWnSuQ==", "engines": { "node": ">=12.20.0" }, "peerDependencies": { - "@babel/core": "*", - "@babel/template": "*", - "jotai-immer": "*", - "jotai-optics": "*", - "jotai-redux": "*", - "jotai-tanstack-query": "*", - "jotai-urql": "*", - "jotai-valtio": "*", - "jotai-xstate": "*", - "jotai-zustand": "*", - "react": ">=16.8" + "@types/react": ">=17.0.0", + "react": ">=17.0.0" }, "peerDependenciesMeta": { - "@babel/core": { + "@types/react": { "optional": true }, - "@babel/template": { - "optional": true - }, - "jotai-immer": { - "optional": true - }, - "jotai-optics": { - "optional": true - }, - "jotai-redux": { - "optional": true - }, - "jotai-tanstack-query": { - "optional": true - }, - "jotai-urql": { - "optional": true - }, - "jotai-valtio": { - "optional": true - }, - "jotai-xstate": { - "optional": true - }, - "jotai-zustand": { + "react": { "optional": true } } @@ -6281,9 +6484,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -6329,9 +6532,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/nopt": { "version": "5.0.0", @@ -6654,9 +6857,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "funding": [ { "type": "opencollective", @@ -6672,7 +6875,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6788,12 +6991,11 @@ ] }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -6882,13 +7084,13 @@ } }, "node_modules/react-dnd": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.1.2.tgz", - "integrity": "sha512-EaSbMD9iFJDY/o48T3c8wn3uWU+2uxfFojhesZN3LhigJoAIvH2iOjxofSA9KbqhAKP6V9P853G6XG8JngKVtA==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", + "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", "dependencies": { - "@react-dnd/invariant": "3.0.1", - "@react-dnd/shallowequal": "3.0.1", - "dnd-core": "15.1.2", + "@react-dnd/invariant": "^4.0.1", + "@react-dnd/shallowequal": "^4.0.1", + "dnd-core": "^16.0.1", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" }, @@ -6911,24 +7113,23 @@ } }, "node_modules/react-dnd-html5-backend": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-15.1.3.tgz", - "integrity": "sha512-HH/8nOEmrrcRGHMqJR91FOwhnLlx5SRLXmsQwZT3IPcBjx88WT+0pWC5A4tDOYDdoooh9k+KMPvWfxooR5TcOA==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", + "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", "dependencies": { - "dnd-core": "15.1.2" + "dnd-core": "^16.0.1" } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-error-boundary": { @@ -7010,6 +7211,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.0.tgz", + "integrity": "sha512-pVvzsSsgUxxtuNfTHC4IxjATs10UaAtvLGVSA1tbUE4GDaOSU1Esu2xF5nWLz7KPiMuW8BJWuPFdlGYJ7/rW0w==", + "dependencies": { + "@remix-run/router": "1.13.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.0.tgz", + "integrity": "sha512-CbcKjEyiSVpA6UtCHOIYLUYn/UJfwzp55va4yEfpk7JBN3GPqWfHrdLkAvNCcpXr8QoihcDMuk0dzWZxtlB/mQ==", + "dependencies": { + "@remix-run/router": "1.13.0", + "react-router": "6.20.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7037,9 +7268,9 @@ } }, "node_modules/redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -7149,18 +7380,31 @@ } }, "node_modules/rollup": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", - "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", + "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.8.0", + "@rollup/rollup-android-arm64": "4.8.0", + "@rollup/rollup-darwin-arm64": "4.8.0", + "@rollup/rollup-darwin-x64": "4.8.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", + "@rollup/rollup-linux-arm64-gnu": "4.8.0", + "@rollup/rollup-linux-arm64-musl": "4.8.0", + "@rollup/rollup-linux-riscv64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-musl": "4.8.0", + "@rollup/rollup-win32-arm64-msvc": "4.8.0", + "@rollup/rollup-win32-ia32-msvc": "4.8.0", + "@rollup/rollup-win32-x64-msvc": "4.8.0", "fsevents": "~2.3.2" } }, @@ -7271,12 +7515,11 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/scroll-into-view-if-needed": { @@ -7296,9 +7539,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -7810,9 +8053,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -7821,6 +8064,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -7828,7 +8075,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -7858,27 +8105,31 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.8.tgz", + "integrity": "sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -7891,6 +8142,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -7959,9 +8213,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -7975,9 +8229,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -7991,9 +8245,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -8007,9 +8261,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -8023,9 +8277,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -8039,9 +8293,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -8055,9 +8309,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -8071,9 +8325,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -8087,9 +8341,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -8103,9 +8357,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -8119,9 +8373,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -8135,9 +8389,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -8151,9 +8405,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -8167,9 +8421,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -8183,9 +8437,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -8199,9 +8453,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -8215,9 +8469,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -8231,9 +8485,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -8247,9 +8501,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -8263,9 +8517,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -8279,9 +8533,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -8295,9 +8549,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -8311,9 +8565,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "dev": true, "hasInstallScript": true, "bin": { @@ -8323,28 +8577,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/warning": { diff --git a/package.json b/package.json index cb6111b5..56e7b8c0 100644 --- a/package.json +++ b/package.json @@ -39,13 +39,13 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.5.0", + "folds": "1.5.1", "formik": "2.2.9", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", "is-hotkey": "0.2.0", - "jotai": "1.12.0", + "jotai": "2.6.0", "katex": "0.16.4", "linkify-html": "4.0.2", "linkify-react": "4.1.1", @@ -55,17 +55,18 @@ "pdfjs-dist": "3.10.111", "prismjs": "1.29.0", "prop-types": "15.8.1", - "react": "17.0.2", + "react": "18.2.0", "react-aria": "3.29.1", "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", - "react-dnd": "15.1.2", - "react-dnd-html5-backend": "15.1.3", - "react-dom": "17.0.2", + "react-dnd": "16.0.1", + "react-dnd-html5-backend": "16.0.1", + "react-dom": "18.2.0", "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "react-range": "1.8.14", + "react-router-dom": "6.20.0", "sanitize-html": "2.8.0", "slate": "0.94.1", "slate-history": "0.93.0", @@ -81,13 +82,14 @@ "@types/file-saver": "2.0.5", "@types/node": "18.11.18", "@types/prismjs": "1.26.0", - "@types/react": "18.0.26", - "@types/react-dom": "18.0.9", + "@types/react": "18.2.39", + "@types/react-dom": "18.2.17", + "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", - "@vitejs/plugin-react": "3.0.0", + "@vitejs/plugin-react": "4.2.0", "buffer": "6.0.3", "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", @@ -100,7 +102,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "4.3.9", + "vite": "5.0.8", "vite-plugin-static-copy": "0.13.0" } } diff --git a/src/app/components/AuthFlowsLoader.tsx b/src/app/components/AuthFlowsLoader.tsx new file mode 100644 index 00000000..f21bad04 --- /dev/null +++ b/src/app/components/AuthFlowsLoader.tsx @@ -0,0 +1,64 @@ +import { ReactNode, useCallback, useEffect, useMemo } from 'react'; +import { MatrixError, createClient } from 'matrix-js-sdk'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { useAutoDiscoveryInfo } from '../hooks/useAutoDiscoveryInfo'; +import { promiseFulfilledResult, promiseRejectedResult } from '../utils/common'; +import { + AuthFlows, + RegisterFlowStatus, + RegisterFlowsResponse, + parseRegisterErrResp, +} from '../hooks/useAuthFlows'; + +type AuthFlowsLoaderProps = { + fallback?: () => ReactNode; + error?: (err: unknown) => ReactNode; + children: (authFlows: AuthFlows) => ReactNode; +}; +export function AuthFlowsLoader({ fallback, error, children }: AuthFlowsLoaderProps) { + const autoDiscoveryInfo = useAutoDiscoveryInfo(); + const baseUrl = autoDiscoveryInfo['m.homeserver'].base_url; + + const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); + + const [state, load] = useAsyncCallback( + useCallback(async () => { + const result = await Promise.allSettled([mx.loginFlows(), mx.registerRequest({})]); + const loginFlows = promiseFulfilledResult(result[0]); + const registerResp = promiseRejectedResult(result[1]) as MatrixError | undefined; + let registerFlows: RegisterFlowsResponse = { status: RegisterFlowStatus.InvalidRequest }; + + if (typeof registerResp === 'object' && registerResp.httpStatus) { + registerFlows = parseRegisterErrResp(registerResp); + } + + if (!loginFlows) { + throw new Error('Missing auth flow!'); + } + if ('errcode' in loginFlows) { + throw new Error('Failed to load auth flow!'); + } + + const authFlows: AuthFlows = { + loginFlows, + registerFlows, + }; + + return authFlows; + }, [mx]) + ); + + useEffect(() => { + load(); + }, [load]); + + if (state.status === AsyncStatus.Idle || state.status === AsyncStatus.Loading) { + return fallback?.(); + } + + if (state.status === AsyncStatus.Error) { + return error?.(state.error); + } + + return children(state.data); +} diff --git a/src/app/components/ClientConfigLoader.tsx b/src/app/components/ClientConfigLoader.tsx new file mode 100644 index 00000000..72d367c0 --- /dev/null +++ b/src/app/components/ClientConfigLoader.tsx @@ -0,0 +1,38 @@ +import { ReactNode, useCallback, useEffect, useState } from 'react'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { ClientConfig } from '../hooks/useClientConfig'; +import { trimTrailingSlash } from '../utils/common'; + +const getClientConfig = async (): Promise => { + const url = `${trimTrailingSlash(import.meta.env.BASE_URL)}/config.json`; + const config = await fetch(url, { method: 'GET' }); + return config.json(); +}; + +type ClientConfigLoaderProps = { + fallback?: () => ReactNode; + error?: (err: unknown, retry: () => void, ignore: () => void) => ReactNode; + children: (config: ClientConfig) => ReactNode; +}; +export function ClientConfigLoader({ fallback, error, children }: ClientConfigLoaderProps) { + const [state, load] = useAsyncCallback(getClientConfig); + const [ignoreError, setIgnoreError] = useState(false); + + const ignoreCallback = useCallback(() => setIgnoreError(true), []); + + useEffect(() => { + load(); + }, [load]); + + if (state.status === AsyncStatus.Idle || state.status === AsyncStatus.Loading) { + return fallback?.(); + } + + if (!ignoreError && state.status === AsyncStatus.Error) { + return error?.(state.error, load, ignoreCallback); + } + + const config: ClientConfig = state.status === AsyncStatus.Success ? state.data : {}; + + return children(config); +} diff --git a/src/app/components/ConfirmPasswordMatch.tsx b/src/app/components/ConfirmPasswordMatch.tsx new file mode 100644 index 00000000..bb50eb60 --- /dev/null +++ b/src/app/components/ConfirmPasswordMatch.tsx @@ -0,0 +1,35 @@ +import { ReactNode, RefObject, useCallback, useRef, useState } from 'react'; +import { useDebounce } from '../hooks/useDebounce'; + +type ConfirmPasswordMatchProps = { + initialValue: boolean; + children: ( + match: boolean, + doMatch: () => void, + passRef: RefObject, + confPassRef: RefObject + ) => ReactNode; +}; +export function ConfirmPasswordMatch({ initialValue, children }: ConfirmPasswordMatchProps) { + const [match, setMatch] = useState(initialValue); + const passRef = useRef(null); + const confPassRef = useRef(null); + + const doMatch = useDebounce( + useCallback(() => { + const pass = passRef.current?.value; + const confPass = confPassRef.current?.value; + if (!confPass) { + setMatch(initialValue); + return; + } + setMatch(pass === confPass); + }, [initialValue]), + { + wait: 500, + immediate: false, + } + ); + + return children(match, doMatch, passRef, confPassRef); +} diff --git a/src/app/components/SpecVersionsLoader.tsx b/src/app/components/SpecVersionsLoader.tsx new file mode 100644 index 00000000..56d7f8b0 --- /dev/null +++ b/src/app/components/SpecVersionsLoader.tsx @@ -0,0 +1,32 @@ +import { ReactNode, useCallback, useEffect } from 'react'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { SpecVersions, specVersions } from '../cs-api'; +import { useAutoDiscoveryInfo } from '../hooks/useAutoDiscoveryInfo'; + +type SpecVersionsLoaderProps = { + fallback?: () => ReactNode; + error?: (err: unknown) => ReactNode; + children: (versions: SpecVersions) => ReactNode; +}; +export function SpecVersionsLoader({ fallback, error, children }: SpecVersionsLoaderProps) { + const autoDiscoveryInfo = useAutoDiscoveryInfo(); + const baseUrl = autoDiscoveryInfo['m.homeserver'].base_url; + + const [state, load] = useAsyncCallback( + useCallback(() => specVersions(fetch, baseUrl), [baseUrl]) + ); + + useEffect(() => { + load(); + }, [load]); + + if (state.status === AsyncStatus.Idle || state.status === AsyncStatus.Loading) { + return fallback?.(); + } + + if (state.status === AsyncStatus.Error) { + return error?.(state.error); + } + + return children(state.data); +} diff --git a/src/app/components/SupportedUIAFlowsLoader.tsx b/src/app/components/SupportedUIAFlowsLoader.tsx new file mode 100644 index 00000000..442eb572 --- /dev/null +++ b/src/app/components/SupportedUIAFlowsLoader.tsx @@ -0,0 +1,17 @@ +import { ReactNode } from 'react'; +import { UIAFlow } from 'matrix-js-sdk'; +import { useSupportedUIAFlows } from '../hooks/useUIAFlows'; + +export function SupportedUIAFlowsLoader({ + flows, + supportedStages, + children, +}: { + supportedStages: string[]; + flows: UIAFlow[]; + children: (supportedFlows: UIAFlow[]) => ReactNode; +}) { + const supportedFlows = useSupportedUIAFlows(flows, supportedStages); + + return children(supportedFlows); +} diff --git a/src/app/components/UIAFlowOverlay.tsx b/src/app/components/UIAFlowOverlay.tsx new file mode 100644 index 00000000..f788eb0f --- /dev/null +++ b/src/app/components/UIAFlowOverlay.tsx @@ -0,0 +1,72 @@ +import React, { ReactNode } from 'react'; +import { + Overlay, + OverlayBackdrop, + Box, + config, + Text, + TooltipProvider, + Tooltip, + Icons, + Icon, + Chip, + IconButton, +} from 'folds'; +import FocusTrap from 'focus-trap-react'; + +export type UIAFlowOverlayProps = { + currentStep: number; + stepCount: number; + children: ReactNode; + onCancel: () => void; +}; +export function UIAFlowOverlay({ + currentStep, + stepCount, + children, + onCancel, +}: UIAFlowOverlayProps) { + return ( + }> + + + + {children} + + + + {`Step ${currentStep}/${stepCount}`} + + + Exit + + } + position="Top" + > + {(anchorRef) => ( + + + + )} + + + + + + ); +} diff --git a/src/app/components/password-input/PasswordInput.tsx b/src/app/components/password-input/PasswordInput.tsx new file mode 100644 index 00000000..184a097c --- /dev/null +++ b/src/app/components/password-input/PasswordInput.tsx @@ -0,0 +1,45 @@ +import React, { ComponentProps, forwardRef } from 'react'; +import { Icon, IconButton, Input, config, Icons } from 'folds'; +import { UseStateProvider } from '../UseStateProvider'; + +type PasswordInputProps = Omit, 'type' | 'size'> & { + size: '400' | '500'; +}; +export const PasswordInput = forwardRef( + ({ variant, size, style, after, ...props }, ref) => { + const paddingRight: string = size === '500' ? config.space.S300 : config.space.S200; + + return ( + + {(visible, setVisible) => ( + + {after} + setVisible(!visible)} + type="button" + variant={visible ? 'Warning' : variant} + size="300" + radii="300" + > + + + + } + /> + )} + + ); + } +); diff --git a/src/app/components/splash-screen/SplashScreen.css.ts b/src/app/components/splash-screen/SplashScreen.css.ts new file mode 100644 index 00000000..bd3c300a --- /dev/null +++ b/src/app/components/splash-screen/SplashScreen.css.ts @@ -0,0 +1,12 @@ +import { style } from '@vanilla-extract/css'; +import { color, config } from 'folds'; + +export const SplashScreen = style({ + minHeight: '100%', + backgroundColor: color.Background.Container, + color: color.Background.OnContainer, +}); + +export const SplashScreenFooter = style({ + padding: config.space.S400, +}); diff --git a/src/app/components/splash-screen/SplashScreen.tsx b/src/app/components/splash-screen/SplashScreen.tsx new file mode 100644 index 00000000..27adadba --- /dev/null +++ b/src/app/components/splash-screen/SplashScreen.tsx @@ -0,0 +1,29 @@ +import { Box, Text } from 'folds'; +import React, { ReactNode } from 'react'; +import classNames from 'classnames'; +import * as patternsCSS from '../../styles/Patterns.css'; +import * as css from './SplashScreen.css'; + +type SplashScreenProps = { + children: ReactNode; +}; +export function SplashScreen({ children }: SplashScreenProps) { + return ( + + {children} + + + Cinny + + + + ); +} diff --git a/src/app/components/splash-screen/index.ts b/src/app/components/splash-screen/index.ts new file mode 100644 index 00000000..e3e5dd34 --- /dev/null +++ b/src/app/components/splash-screen/index.ts @@ -0,0 +1 @@ +export * from './SplashScreen'; diff --git a/src/app/components/uia-stages/DummyStage.tsx b/src/app/components/uia-stages/DummyStage.tsx new file mode 100644 index 00000000..7e0f8586 --- /dev/null +++ b/src/app/components/uia-stages/DummyStage.tsx @@ -0,0 +1,65 @@ +import React, { useEffect, useCallback } from 'react'; +import { Dialog, Text, Box, Button, config } from 'folds'; +import { AuthType } from 'matrix-js-sdk'; +import { StageComponentProps } from './types'; + +function DummyErrorDialog({ + title, + message, + onRetry, + onCancel, +}: { + title: string; + message: string; + onRetry: () => void; + onCancel: () => void; +}) { + return ( + + + + {title} + {message} + + + + + + ); +} + +export function AutoDummyStageDialog({ stageData, submitAuthDict, onCancel }: StageComponentProps) { + const { errorCode, error, session } = stageData; + + const handleSubmit = useCallback(() => { + submitAuthDict({ + type: AuthType.Dummy, + session, + }); + }, [session, submitAuthDict]); + + useEffect(() => { + if (!errorCode) handleSubmit(); + }, [handleSubmit, errorCode]); + + if (errorCode) { + return ( + + ); + } + + return null; +} diff --git a/src/app/components/uia-stages/EmailStage.tsx b/src/app/components/uia-stages/EmailStage.tsx new file mode 100644 index 00000000..fdc2b61a --- /dev/null +++ b/src/app/components/uia-stages/EmailStage.tsx @@ -0,0 +1,172 @@ +import React, { useEffect, useCallback, FormEventHandler } from 'react'; +import { Dialog, Text, Box, Button, config, Input, color, Spinner } from 'folds'; +import { AuthType, MatrixError } from 'matrix-js-sdk'; +import { StageComponentProps } from './types'; +import { AsyncState, AsyncStatus } from '../../hooks/useAsyncCallback'; +import { RequestEmailTokenCallback, RequestEmailTokenResponse } from '../../hooks/types'; + +function EmailErrorDialog({ + title, + message, + defaultEmail, + onRetry, + onCancel, +}: { + title: string; + message: string; + defaultEmail?: string; + onRetry: (email: string) => void; + onCancel: () => void; +}) { + const handleFormSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { retryEmailInput } = evt.target as HTMLFormElement & { + retryEmailInput: HTMLInputElement; + }; + const t = retryEmailInput.value; + onRetry(t); + }; + + return ( + + + + {title} + {message} + + Email + + + + + + + + ); +} + +export function EmailStageDialog({ + email, + clientSecret, + stageData, + emailTokenState, + requestEmailToken, + submitAuthDict, + onCancel, +}: StageComponentProps & { + email?: string; + clientSecret: string; + emailTokenState: AsyncState; + requestEmailToken: RequestEmailTokenCallback; +}) { + const { errorCode, error, session } = stageData; + + const handleSubmit = useCallback( + (sessionId: string) => { + const threepIDCreds = { + sid: sessionId, + client_secret: clientSecret, + }; + submitAuthDict({ + type: AuthType.Email, + threepid_creds: threepIDCreds, + threepidCreds: threepIDCreds, + session, + }); + }, + [submitAuthDict, session, clientSecret] + ); + + const handleEmailSubmit = useCallback( + (userEmail: string) => { + requestEmailToken(userEmail, clientSecret); + }, + [clientSecret, requestEmailToken] + ); + + useEffect(() => { + if (email && !errorCode && emailTokenState.status === AsyncStatus.Idle) { + requestEmailToken(email, clientSecret); + } + }, [email, errorCode, clientSecret, emailTokenState, requestEmailToken]); + + if (emailTokenState.status === AsyncStatus.Loading) { + return ( + + + Sending verification email... + + ); + } + + if (emailTokenState.status === AsyncStatus.Error) { + return ( + + ); + } + + if (emailTokenState.status === AsyncStatus.Success) { + return ( + + + + Verification Request Sent + {`Please check your email "${emailTokenState.data.email}" and validate before continuing further.`} + + {errorCode && ( + {`${errorCode}: ${error}`} + )} + + + + + ); + } + + if (!email) { + return ( + + ); + } + + return null; +} diff --git a/src/app/components/uia-stages/ReCaptchaStage.tsx b/src/app/components/uia-stages/ReCaptchaStage.tsx new file mode 100644 index 00000000..68b3fcf4 --- /dev/null +++ b/src/app/components/uia-stages/ReCaptchaStage.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { Dialog, Text, Box, Button, config } from 'folds'; +import { AuthType } from 'matrix-js-sdk'; +import ReCAPTCHA from 'react-google-recaptcha'; +import { StageComponentProps } from './types'; + +function ReCaptchaErrorDialog({ + title, + message, + onCancel, +}: { + title: string; + message: string; + onCancel: () => void; +}) { + return ( + + + + {title} + {message} + + + + + ); +} + +export function ReCaptchaStageDialog({ stageData, submitAuthDict, onCancel }: StageComponentProps) { + const { info, session } = stageData; + + const publicKey = info?.public_key; + + const handleChange = (token: string | null) => { + submitAuthDict({ + type: AuthType.Recaptcha, + response: token, + session, + }); + }; + + if (typeof publicKey !== 'string' || !session) { + return ( + + ); + } + + return ( + + + Please check the box below to proceed. + + + + ); +} diff --git a/src/app/components/uia-stages/RegistrationTokenStage.tsx b/src/app/components/uia-stages/RegistrationTokenStage.tsx new file mode 100644 index 00000000..ed8a3045 --- /dev/null +++ b/src/app/components/uia-stages/RegistrationTokenStage.tsx @@ -0,0 +1,117 @@ +import React, { useEffect, useCallback, FormEventHandler } from 'react'; +import { Dialog, Text, Box, Button, config, Input } from 'folds'; +import { AuthType } from 'matrix-js-sdk'; +import { StageComponentProps } from './types'; + +function RegistrationTokenErrorDialog({ + title, + message, + defaultToken, + onRetry, + onCancel, +}: { + title: string; + message: string; + defaultToken?: string; + onRetry: (token: string) => void; + onCancel: () => void; +}) { + const handleFormSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { retryTokenInput } = evt.target as HTMLFormElement & { + retryTokenInput: HTMLInputElement; + }; + const t = retryTokenInput.value; + onRetry(t); + }; + + return ( + + + + {title} + {message} + + Registration Token + + + + + + + + ); +} + +export function RegistrationTokenStageDialog({ + token, + stageData, + submitAuthDict, + onCancel, +}: StageComponentProps & { + token?: string; +}) { + const { errorCode, error, session } = stageData; + + const handleSubmit = useCallback( + (t: string) => { + submitAuthDict({ + type: AuthType.RegistrationToken, + token: t, + session, + }); + }, + [session, submitAuthDict] + ); + + useEffect(() => { + if (token && !errorCode) handleSubmit(token); + }, [handleSubmit, token, errorCode]); + + if (errorCode) { + return ( + + ); + } + + if (!token) { + return ( + + ); + } + + return null; +} diff --git a/src/app/components/uia-stages/TermsStage.tsx b/src/app/components/uia-stages/TermsStage.tsx new file mode 100644 index 00000000..f6977053 --- /dev/null +++ b/src/app/components/uia-stages/TermsStage.tsx @@ -0,0 +1,69 @@ +import React, { useEffect, useCallback } from 'react'; +import { Dialog, Text, Box, Button, config } from 'folds'; +import { AuthType } from 'matrix-js-sdk'; +import { StageComponentProps } from './types'; + +function TermsErrorDialog({ + title, + message, + onRetry, + onCancel, +}: { + title: string; + message: string; + onRetry: () => void; + onCancel: () => void; +}) { + return ( + + + + {title} + {message} + + + + + + ); +} + +export function AutoTermsStageDialog({ stageData, submitAuthDict, onCancel }: StageComponentProps) { + const { errorCode, error, session } = stageData; + + const handleSubmit = useCallback( + () => + submitAuthDict({ + type: AuthType.Terms, + session, + }), + [session, submitAuthDict] + ); + + useEffect(() => { + if (!errorCode) { + handleSubmit(); + } + }, [session, errorCode, handleSubmit]); + + if (errorCode) { + return ( + + ); + } + + return null; +} diff --git a/src/app/components/uia-stages/index.ts b/src/app/components/uia-stages/index.ts new file mode 100644 index 00000000..95c19a79 --- /dev/null +++ b/src/app/components/uia-stages/index.ts @@ -0,0 +1,6 @@ +export * from './types'; +export * from './DummyStage'; +export * from './EmailStage'; +export * from './ReCaptchaStage'; +export * from './RegistrationTokenStage'; +export * from './TermsStage'; diff --git a/src/app/components/uia-stages/types.ts b/src/app/components/uia-stages/types.ts new file mode 100644 index 00000000..cc6674c5 --- /dev/null +++ b/src/app/components/uia-stages/types.ts @@ -0,0 +1,8 @@ +import { AuthDict } from 'matrix-js-sdk'; +import { AuthStageData } from '../../hooks/useUIAFlows'; + +export type StageComponentProps = { + stageData: AuthStageData; + submitAuthDict: (authDict: AuthDict) => void; + onCancel: () => void; +}; diff --git a/src/app/cs-api.ts b/src/app/cs-api.ts new file mode 100644 index 00000000..b9c67719 --- /dev/null +++ b/src/app/cs-api.ts @@ -0,0 +1,115 @@ +import to from 'await-to-js'; +import { trimTrailingSlash } from './utils/common'; + +export enum AutoDiscoveryAction { + PROMPT = 'PROMPT', + IGNORE = 'IGNORE', + FAIL_PROMPT = 'FAIL_PROMPT', + FAIL_ERROR = 'FAIL_ERROR', +} + +export type AutoDiscoveryError = { + host: string; + action: AutoDiscoveryAction; +}; + +export type AutoDiscoveryInfo = Record & { + 'm.homeserver': { + base_url: string; + }; + 'm.identity_server'?: { + base_url: string; + }; +}; + +export const autoDiscovery = async ( + request: typeof fetch, + server: string +): Promise<[AutoDiscoveryError, undefined] | [undefined, AutoDiscoveryInfo]> => { + const host = /^https?:\/\//.test(server) ? trimTrailingSlash(server) : `https://${server}`; + const autoDiscoveryUrl = `${host}/.well-known/matrix/client`; + + const [err, response] = await to(request(autoDiscoveryUrl, { method: 'GET' })); + + if (err || response.status === 404) { + // AutoDiscoveryAction.IGNORE + // We will use default value for IGNORE action + return [ + undefined, + { + 'm.homeserver': { + base_url: host, + }, + }, + ]; + } + if (response.status !== 200) { + return [ + { + host, + action: AutoDiscoveryAction.FAIL_PROMPT, + }, + undefined, + ]; + } + + const [contentErr, content] = await to(response.json()); + + if (contentErr || typeof content !== 'object') { + return [ + { + host, + action: AutoDiscoveryAction.FAIL_PROMPT, + }, + undefined, + ]; + } + + const baseUrl = content['m.homeserver']?.base_url; + if (typeof baseUrl !== 'string') { + return [ + { + host, + action: AutoDiscoveryAction.FAIL_PROMPT, + }, + undefined, + ]; + } + + if (/^https?:\/\//.test(baseUrl) === false) { + return [ + { + host, + action: AutoDiscoveryAction.FAIL_ERROR, + }, + undefined, + ]; + } + + content['m.homeserver'].base_url = trimTrailingSlash(baseUrl); + if (content['m.identity_server']) { + content['m.identity_server'].base_url = trimTrailingSlash( + content['m.identity_server'].base_url + ); + } + + return [undefined, content]; +}; + +export type SpecVersions = { + versions: string[]; + unstable_features?: Record; +}; +export const specVersions = async ( + request: typeof fetch, + baseUrl: string +): Promise => { + const res = await request(`${baseUrl}/_matrix/client/versions`); + + const data = (await res.json()) as unknown; + + if (data && typeof data === 'object' && 'versions' in data && Array.isArray(data.versions)) { + return data as SpecVersions; + } + throw new Error('Homeserver URL does not appear to be a valid Matrix homeserver'); +}; diff --git a/src/app/cs-errorcode.ts b/src/app/cs-errorcode.ts new file mode 100644 index 00000000..6c21d670 --- /dev/null +++ b/src/app/cs-errorcode.ts @@ -0,0 +1,37 @@ +export enum ErrorCode { + M_FORBIDDEN = 'M_FORBIDDEN', + M_UNKNOWN_TOKEN = 'M_UNKNOWN_TOKEN', + M_MISSING_TOKEN = 'M_MISSING_TOKEN', + M_BAD_JSON = 'M_BAD_JSON', + M_NOT_JSON = 'M_NOT_JSON', + M_NOT_FOUND = 'M_NOT_FOUND', + M_LIMIT_EXCEEDED = 'M_LIMIT_EXCEEDED', + M_UNRECOGNIZED = 'M_UNRECOGNIZED', + M_UNKNOWN = 'M_UNKNOWN', + + M_UNAUTHORIZED = 'M_UNAUTHORIZED', + M_USER_DEACTIVATED = 'M_USER_DEACTIVATED', + M_USER_IN_USE = 'M_USER_IN_USE', + M_INVALID_USERNAME = 'M_INVALID_USERNAME', + M_WEAK_PASSWORD = 'M_WEAK_PASSWORD', + M_PASSWORD_TOO_SHORT = 'M_PASSWORD_TOO_SHORT', + M_ROOM_IN_USE = 'M_ROOM_IN_USE', + M_INVALID_ROOM_STATE = 'M_INVALID_ROOM_STATE', + M_THREEPID_IN_USE = 'M_THREEPID_IN_USE', + M_THREEPID_NOT_FOUND = 'M_THREEPID_NOT_FOUND', + M_THREEPID_AUTH_FAILED = 'M_THREEPID_AUTH_FAILED', + M_THREEPID_DENIED = 'M_THREEPID_DENIED', + M_SERVER_NOT_TRUSTED = 'M_SERVER_NOT_TRUSTED', + M_UNSUPPORTED_ROOM_VERSION = 'M_UNSUPPORTED_ROOM_VERSION', + M_INCOMPATIBLE_ROOM_VERSION = 'M_INCOMPATIBLE_ROOM_VERSION', + M_BAD_STATE = 'M_BAD_STATE', + M_GUEST_ACCESS_FORBIDDEN = 'M_GUEST_ACCESS_FORBIDDEN', + M_CAPTCHA_NEEDED = 'M_CAPTCHA_NEEDED', + M_CAPTCHA_INVALID = 'M_CAPTCHA_INVALID', + M_MISSING_PARAM = 'M_MISSING_PARAM', + M_INVALID_PARAM = 'M_INVALID_PARAM', + M_TOO_LARGE = 'M_TOO_LARGE', + M_EXCLUSIVE = 'M_EXCLUSIVE', + M_RESOURCE_LIMIT_EXCEEDED = 'M_RESOURCE_LIMIT_EXCEEDED', + M_CANNOT_LEAVE_SERVER_NOTICE_ROOM = 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM', +} diff --git a/src/app/hooks/types.ts b/src/app/hooks/types.ts new file mode 100644 index 00000000..9aac2b31 --- /dev/null +++ b/src/app/hooks/types.ts @@ -0,0 +1,12 @@ +import { IRequestTokenResponse } from 'matrix-js-sdk'; + +export type RequestEmailTokenResponse = { + email: string; + clientSecret: string; + result: IRequestTokenResponse; +}; +export type RequestEmailTokenCallback = ( + email: string, + clientSecret: string, + nextLink?: string +) => Promise; diff --git a/src/app/hooks/useAsyncCallback.ts b/src/app/hooks/useAsyncCallback.ts index 18b63ecc..fc7dca63 100644 --- a/src/app/hooks/useAsyncCallback.ts +++ b/src/app/hooks/useAsyncCallback.ts @@ -1,4 +1,5 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useRef, useState } from 'react'; +import { flushSync } from 'react-dom'; import { useAlive } from './useAlive'; export enum AsyncStatus { @@ -16,36 +17,56 @@ export type AsyncLoading = { status: AsyncStatus.Loading; }; -export type AsyncSuccess = { +export type AsyncSuccess = { status: AsyncStatus.Success; - data: T; + data: D; }; -export type AsyncError = { +export type AsyncError = { status: AsyncStatus.Error; - error: unknown; + error: E; }; -export type AsyncState = AsyncIdle | AsyncLoading | AsyncSuccess | AsyncError; +export type AsyncState = AsyncIdle | AsyncLoading | AsyncSuccess | AsyncError; export type AsyncCallback = (...args: TArgs) => Promise; -export const useAsyncCallback = ( +export const useAsyncCallback = ( asyncCallback: AsyncCallback -): [AsyncState, AsyncCallback] => { - const [state, setState] = useState>({ +): [AsyncState, AsyncCallback] => { + const [state, setState] = useState>({ status: AsyncStatus.Idle, }); const alive = useAlive(); + // Tracks the request number. + // If two or more requests are made subsequently + // we will throw all old request's response after they resolved. + const reqNumberRef = useRef(0); + const callback: AsyncCallback = useCallback( async (...args) => { - setState({ - status: AsyncStatus.Loading, + queueMicrotask(() => { + // Warning: flushSync was called from inside a lifecycle method. + // React cannot flush when React is already rendering. + // Consider moving this call to a scheduler task or micro task. + flushSync(() => { + // flushSync because + // https://github.com/facebook/react/issues/26713#issuecomment-1872085134 + setState({ + status: AsyncStatus.Loading, + }); + }); }); + reqNumberRef.current += 1; + + const currentReqNumber = reqNumberRef.current; try { const data = await asyncCallback(...args); + if (currentReqNumber !== reqNumberRef.current) { + throw new Error('AsyncCallbackHook: Request replaced!'); + } if (alive()) { setState({ status: AsyncStatus.Success, @@ -54,10 +75,13 @@ export const useAsyncCallback = ( } return data; } catch (e) { + if (currentReqNumber !== reqNumberRef.current) { + throw new Error('AsyncCallbackHook: Request replaced!'); + } if (alive()) { setState({ status: AsyncStatus.Error, - error: e, + error: e as TError, }); } throw e; diff --git a/src/app/hooks/useAuthFlows.ts b/src/app/hooks/useAuthFlows.ts new file mode 100644 index 00000000..7bb7ddc5 --- /dev/null +++ b/src/app/hooks/useAuthFlows.ts @@ -0,0 +1,59 @@ +import { createContext, useContext } from 'react'; +import { IAuthData, MatrixError } from 'matrix-js-sdk'; +import { ILoginFlowsResponse } from 'matrix-js-sdk/lib/@types/auth'; + +export enum RegisterFlowStatus { + FlowRequired = 401, + InvalidRequest = 400, + RegistrationDisabled = 403, + RateLimited = 429, +} + +export type RegisterFlowsResponse = + | { + status: RegisterFlowStatus.FlowRequired; + data: IAuthData; + } + | { + status: Exclude; + }; + +export const parseRegisterErrResp = (matrixError: MatrixError): RegisterFlowsResponse => { + switch (matrixError.httpStatus) { + case RegisterFlowStatus.InvalidRequest: { + return { status: RegisterFlowStatus.InvalidRequest }; + } + case RegisterFlowStatus.RateLimited: { + return { status: RegisterFlowStatus.RateLimited }; + } + case RegisterFlowStatus.RegistrationDisabled: { + return { status: RegisterFlowStatus.RegistrationDisabled }; + } + case RegisterFlowStatus.FlowRequired: { + return { + status: RegisterFlowStatus.FlowRequired, + data: matrixError.data as IAuthData, + }; + } + default: { + return { status: RegisterFlowStatus.InvalidRequest }; + } + } +}; + +export type AuthFlows = { + loginFlows: ILoginFlowsResponse; + registerFlows: RegisterFlowsResponse; +}; + +const AuthFlowsContext = createContext(null); + +export const AuthFlowsProvider = AuthFlowsContext.Provider; + +export const useAuthFlows = (): AuthFlows => { + const authFlows = useContext(AuthFlowsContext); + if (!authFlows) { + throw new Error('Auth Flow info is not loaded!'); + } + return authFlows; +}; diff --git a/src/app/hooks/useAuthServer.ts b/src/app/hooks/useAuthServer.ts new file mode 100644 index 00000000..f77566f5 --- /dev/null +++ b/src/app/hooks/useAuthServer.ts @@ -0,0 +1,14 @@ +import { createContext, useContext } from 'react'; + +const AuthServerContext = createContext(null); + +export const AuthServerProvider = AuthServerContext.Provider; + +export const useAuthServer = (): string => { + const server = useContext(AuthServerContext); + if (server === null) { + throw new Error('Auth server is not provided!'); + } + + return server; +}; diff --git a/src/app/hooks/useAutoDiscoveryInfo.ts b/src/app/hooks/useAutoDiscoveryInfo.ts new file mode 100644 index 00000000..b2f8bcb5 --- /dev/null +++ b/src/app/hooks/useAutoDiscoveryInfo.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from 'react'; +import { AutoDiscoveryInfo } from '../cs-api'; + +const AutoDiscoverInfoContext = createContext(null); + +export const AutoDiscoveryInfoProvider = AutoDiscoverInfoContext.Provider; + +export const useAutoDiscoveryInfo = (): AutoDiscoveryInfo => { + const autoDiscoveryInfo = useContext(AutoDiscoverInfoContext); + if (!autoDiscoveryInfo) { + throw new Error('Auto Discovery Info not loaded'); + } + + return autoDiscoveryInfo; +}; diff --git a/src/app/hooks/useClientConfig.ts b/src/app/hooks/useClientConfig.ts new file mode 100644 index 00000000..8406668d --- /dev/null +++ b/src/app/hooks/useClientConfig.ts @@ -0,0 +1,33 @@ +import { createContext, useContext } from 'react'; + +export type ClientConfig = { + defaultHomeserver?: number; + homeserverList?: string[]; + allowCustomHomeservers?: boolean; + + hashRouter?: { + enabled?: boolean; + basename?: string; + }; +}; + +const ClientConfigContext = createContext(null); + +export const ClientConfigProvider = ClientConfigContext.Provider; + +export function useClientConfig(): ClientConfig { + const config = useContext(ClientConfigContext); + if (!config) throw new Error('Client config are not provided!'); + return config; +} + +export const clientDefaultServer = (clientConfig: ClientConfig): string => + clientConfig.homeserverList?.[clientConfig.defaultHomeserver ?? 0] ?? 'matrix.org'; + +export const clientAllowedServer = (clientConfig: ClientConfig, server: string): boolean => { + const { homeserverList, allowCustomHomeservers } = clientConfig; + + if (allowCustomHomeservers) return true; + + return homeserverList?.includes(server) === true; +}; diff --git a/src/app/hooks/useCrossSigningStatus.js b/src/app/hooks/useCrossSigningStatus.js index 61b69d1d..845c5462 100644 --- a/src/app/hooks/useCrossSigningStatus.js +++ b/src/app/hooks/useCrossSigningStatus.js @@ -9,7 +9,7 @@ export function useCrossSigningStatus() { const [isCSEnabled, setIsCSEnabled] = useState(hasCrossSigningAccountData()); useEffect(() => { - if (isCSEnabled) return null; + if (isCSEnabled) return undefined; const handleAccountData = (event) => { if (event.getType() === 'm.cross_signing.master') { setIsCSEnabled(true); diff --git a/src/app/hooks/useParsedLoginFlows.ts b/src/app/hooks/useParsedLoginFlows.ts new file mode 100644 index 00000000..14ecfb9d --- /dev/null +++ b/src/app/hooks/useParsedLoginFlows.ts @@ -0,0 +1,38 @@ +import { useMemo } from 'react'; +import { ILoginFlow, IPasswordFlow, ISSOFlow, LoginFlow } from 'matrix-js-sdk/lib/@types/auth'; +import { WithRequiredProp } from '../../types/utils'; + +export type Required_SSOFlow = WithRequiredProp; +export const getSSOFlow = (loginFlows: LoginFlow[]): Required_SSOFlow | undefined => + loginFlows.find( + (flow) => + (flow.type === 'm.login.sso' || flow.type === 'm.login.cas') && + 'identity_providers' in flow && + Array.isArray(flow.identity_providers) && + flow.identity_providers.length > 0 + ) as Required_SSOFlow | undefined; + +export const getPasswordFlow = (loginFlows: LoginFlow[]): IPasswordFlow | undefined => + loginFlows.find((flow) => flow.type === 'm.login.password') as IPasswordFlow; +export const getTokenFlow = (loginFlows: LoginFlow[]): LoginFlow | undefined => + loginFlows.find((flow) => flow.type === 'm.login.token') as ILoginFlow & { + type: 'm.login.token'; + }; + +export type ParsedLoginFlows = { + password?: LoginFlow; + token?: LoginFlow; + sso?: Required_SSOFlow; +}; +export const useParsedLoginFlows = (loginFlows: LoginFlow[]) => { + const parsedFlow: ParsedLoginFlows = useMemo( + () => ({ + password: getPasswordFlow(loginFlows), + token: getTokenFlow(loginFlows), + sso: getSSOFlow(loginFlows), + }), + [loginFlows] + ); + + return parsedFlow; +}; diff --git a/src/app/hooks/usePasswordEmail.ts b/src/app/hooks/usePasswordEmail.ts new file mode 100644 index 00000000..37e96433 --- /dev/null +++ b/src/app/hooks/usePasswordEmail.ts @@ -0,0 +1,32 @@ +import { MatrixClient, MatrixError } from 'matrix-js-sdk'; +import { useCallback, useRef } from 'react'; +import { AsyncState, useAsyncCallback } from './useAsyncCallback'; +import { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types'; + +export const usePasswordEmail = ( + mx: MatrixClient +): [AsyncState, RequestEmailTokenCallback] => { + const sendAttemptRef = useRef(1); + + const passwordEmailCallback: RequestEmailTokenCallback = useCallback( + async (email, clientSecret, nextLink) => { + const sendAttempt = sendAttemptRef.current; + sendAttemptRef.current += 1; + const result = await mx.requestPasswordEmailToken(email, clientSecret, sendAttempt, nextLink); + return { + email, + clientSecret, + result, + }; + }, + [mx] + ); + + const [passwordEmailState, passwordEmail] = useAsyncCallback< + RequestEmailTokenResponse, + MatrixError, + Parameters + >(passwordEmailCallback); + + return [passwordEmailState, passwordEmail]; +}; diff --git a/src/app/hooks/usePathWithOrigin.ts b/src/app/hooks/usePathWithOrigin.ts new file mode 100644 index 00000000..4430d06c --- /dev/null +++ b/src/app/hooks/usePathWithOrigin.ts @@ -0,0 +1,26 @@ +import { useMemo } from 'react'; +import { useClientConfig } from './useClientConfig'; +import { trimLeadingSlash, trimSlash, trimTrailingSlash } from '../utils/common'; + +export const usePathWithOrigin = (path: string): string => { + const { hashRouter } = useClientConfig(); + const { origin } = window.location; + + const pathWithOrigin = useMemo(() => { + let url: string = trimSlash(origin); + + url += `/${trimSlash(import.meta.env.BASE_URL ?? '')}`; + url = trimTrailingSlash(url); + + if (hashRouter?.enabled) { + url += `/#/${trimSlash(hashRouter.basename ?? '')}`; + url = trimTrailingSlash(url); + } + + url += `/${trimLeadingSlash(path)}`; + + return url; + }, [path, hashRouter, origin]); + + return pathWithOrigin; +}; diff --git a/src/app/hooks/useRegisterEmail.ts b/src/app/hooks/useRegisterEmail.ts new file mode 100644 index 00000000..d29c9e6d --- /dev/null +++ b/src/app/hooks/useRegisterEmail.ts @@ -0,0 +1,32 @@ +import { MatrixClient, MatrixError } from 'matrix-js-sdk'; +import { useCallback, useRef } from 'react'; +import { AsyncState, useAsyncCallback } from './useAsyncCallback'; +import { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types'; + +export const useRegisterEmail = ( + mx: MatrixClient +): [AsyncState, RequestEmailTokenCallback] => { + const sendAttemptRef = useRef(1); + + const registerEmailCallback: RequestEmailTokenCallback = useCallback( + async (email, clientSecret, nextLink) => { + const sendAttempt = sendAttemptRef.current; + sendAttemptRef.current += 1; + const result = await mx.requestRegisterEmailToken(email, clientSecret, sendAttempt, nextLink); + return { + email, + clientSecret, + result, + }; + }, + [mx] + ); + + const [registerEmailState, registerEmail] = useAsyncCallback< + RequestEmailTokenResponse, + MatrixError, + Parameters + >(registerEmailCallback); + + return [registerEmailState, registerEmail]; +}; diff --git a/src/app/hooks/useSpecVersions.ts b/src/app/hooks/useSpecVersions.ts new file mode 100644 index 00000000..42403c61 --- /dev/null +++ b/src/app/hooks/useSpecVersions.ts @@ -0,0 +1,12 @@ +import { createContext, useContext } from 'react'; +import { SpecVersions } from '../cs-api'; + +const SpecVersionsContext = createContext(null); + +export const SpecVersionsProvider = SpecVersionsContext.Provider; + +export function useSpecVersions(): SpecVersions { + const versions = useContext(SpecVersionsContext); + if (!versions) throw new Error('Server versions are not provided!'); + return versions; +} diff --git a/src/app/hooks/useUIAFlows.ts b/src/app/hooks/useUIAFlows.ts new file mode 100644 index 00000000..22acd6ba --- /dev/null +++ b/src/app/hooks/useUIAFlows.ts @@ -0,0 +1,96 @@ +import { AuthType, IAuthData, UIAFlow } from 'matrix-js-sdk'; +import { useCallback, useMemo } from 'react'; +import { + getSupportedUIAFlows, + getUIACompleted, + getUIAError, + getUIAErrorCode, + getUIAParams, + getUIASession, +} from '../utils/matrix-uia'; + +export const SUPPORTED_FLOW_TYPES = [ + AuthType.Dummy, + AuthType.Password, + AuthType.Email, + AuthType.Terms, + AuthType.Recaptcha, + AuthType.RegistrationToken, +] as const; + +export const useSupportedUIAFlows = (uiaFlows: UIAFlow[], supportedStages: string[]): UIAFlow[] => + useMemo(() => getSupportedUIAFlows(uiaFlows, supportedStages), [uiaFlows, supportedStages]); + +export const useUIACompleted = (authData: IAuthData): string[] => + useMemo(() => getUIACompleted(authData), [authData]); + +export const useUIAParams = (authData: IAuthData) => + useMemo(() => getUIAParams(authData), [authData]); + +export const useUIASession = (authData: IAuthData) => + useMemo(() => getUIASession(authData), [authData]); + +export const useUIAErrorCode = (authData: IAuthData) => + useMemo(() => getUIAErrorCode(authData), [authData]); + +export const useUIAError = (authData: IAuthData) => + useMemo(() => getUIAError(authData), [authData]); + +export type StageInfo = Record; +export type AuthStageData = { + type: string; + info?: StageInfo; + session?: string; + errorCode?: string; + error?: string; +}; +export type AuthStageDataGetter = () => AuthStageData | undefined; + +export type UIAFlowInterface = { + getStageToComplete: AuthStageDataGetter; + hasStage: (stageType: string) => boolean; + getStageInfo: (stageType: string) => StageInfo | undefined; +}; +export const useUIAFlow = (authData: IAuthData, uiaFlow: UIAFlow): UIAFlowInterface => { + const completed = useUIACompleted(authData); + const params = useUIAParams(authData); + const session = useUIASession(authData); + const errorCode = useUIAErrorCode(authData); + const error = useUIAError(authData); + + const getStageToComplete: AuthStageDataGetter = useCallback(() => { + const { stages } = uiaFlow; + const nextStage = stages.find((stage) => !completed.includes(stage)); + if (!nextStage) return undefined; + + const info = params[nextStage]; + + return { + type: nextStage, + info, + session, + errorCode, + error, + }; + }, [uiaFlow, completed, params, errorCode, error, session]); + + const hasStage = useCallback( + (stageType: string): boolean => uiaFlow.stages.includes(stageType), + [uiaFlow] + ); + + const getStageInfo = useCallback( + (stageType: string): StageInfo | undefined => { + if (!hasStage(stageType)) return undefined; + + return params[stageType]; + }, + [hasStage, params] + ); + + return { + getStageToComplete, + hasStage, + getStageInfo, + }; +}; diff --git a/src/app/molecules/room-aliases/RoomAliases.jsx b/src/app/molecules/room-aliases/RoomAliases.jsx index 201c523a..d573f7d6 100644 --- a/src/app/molecules/room-aliases/RoomAliases.jsx +++ b/src/app/molecules/room-aliases/RoomAliases.jsx @@ -110,7 +110,9 @@ function RoomAliases({ roomId }) { const canPublishAlias = room.currentState.maySendStateEvent('m.room.canonical_alias', userId); - useEffect(() => isMountedStore.setItem(true), []); + useEffect(() => { + isMountedStore.setItem(true) + }, []); useEffect(() => { let isUnmounted = false; diff --git a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx index 6a72a99b..d9dd9540 100644 --- a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx +++ b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx @@ -49,7 +49,9 @@ function useVisibility(roomId) { const room = mx.getRoom(roomId); const [activeType, setActiveType] = useState(room.getHistoryVisibility()); - useEffect(() => setActiveType(room.getHistoryVisibility()), [roomId]); + useEffect(() => { + setActiveType(room.getHistoryVisibility()); + }, [roomId]); const setVisibility = useCallback((item) => { if (item.type === activeType.type) return; diff --git a/src/app/molecules/room-notification/RoomNotification.jsx b/src/app/molecules/room-notification/RoomNotification.jsx index 1c088e5f..4adb1169 100644 --- a/src/app/molecules/room-notification/RoomNotification.jsx +++ b/src/app/molecules/room-notification/RoomNotification.jsx @@ -103,7 +103,9 @@ function setRoomNotifType(roomId, newType) { function useNotifications(roomId) { const { notifications } = initMatrix; const [activeType, setActiveType] = useState(notifications.getNotiType(roomId)); - useEffect(() => setActiveType(notifications.getNotiType(roomId)), [roomId]); + useEffect(() => { + setActiveType(notifications.getNotiType(roomId)); + }, [roomId]); const setNotification = useCallback((item) => { if (item.type === activeType.type) return; diff --git a/src/app/molecules/room-search/RoomSearch.jsx b/src/app/molecules/room-search/RoomSearch.jsx index 2612aed1..6009649f 100644 --- a/src/app/molecules/room-search/RoomSearch.jsx +++ b/src/app/molecules/room-search/RoomSearch.jsx @@ -29,7 +29,9 @@ function useRoomSearch(roomId) { const mountStore = useStore(roomId); const mx = initMatrix.matrixClient; - useEffect(() => mountStore.setItem(true), [roomId]); + useEffect(() => { + mountStore.setItem(true) + }, [roomId]); useEffect(() => { if (searchData?.results?.length > 0) { diff --git a/src/app/molecules/room-visibility/RoomVisibility.jsx b/src/app/molecules/room-visibility/RoomVisibility.jsx index 7a852876..a5e8e2d0 100644 --- a/src/app/molecules/room-visibility/RoomVisibility.jsx +++ b/src/app/molecules/room-visibility/RoomVisibility.jsx @@ -50,7 +50,9 @@ function useVisibility(roomId) { const room = mx.getRoom(roomId); const [activeType, setActiveType] = useState(room.getJoinRule()); - useEffect(() => setActiveType(room.getJoinRule()), [roomId]); + useEffect(() => { + setActiveType(room.getJoinRule()); + }, [roomId]); const setNotification = useCallback((item) => { if (item.type === activeType.type) return; diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 6fe81cdd..3ae1f294 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -80,7 +80,7 @@ function EmojiVerificationContent({ data, requestClose }) { } }; - if (request === null) return null; + if (request === null) return undefined; const req = request; req.on('change', handleChange); return () => { diff --git a/src/app/organisms/room/message/UrlPreviewCard.tsx b/src/app/organisms/room/message/UrlPreviewCard.tsx index 9ae4d298..b085e184 100644 --- a/src/app/organisms/room/message/UrlPreviewCard.tsx +++ b/src/app/organisms/room/message/UrlPreviewCard.tsx @@ -23,7 +23,10 @@ export const UrlPreviewCard = as<'div', { url: string; ts: number }>( const [previewStatus, loadPreview] = useAsyncCallback( useCallback(() => mx.getUrlPreview(url, ts), [url, ts, mx]) ); - if (previewStatus.status === AsyncStatus.Idle) loadPreview(); + + useEffect(() => { + loadPreview(); + }, [loadPreview]); if (previewStatus.status === AsyncStatus.Error) return null; diff --git a/src/app/organisms/space-manage/SpaceManage.jsx b/src/app/organisms/space-manage/SpaceManage.jsx index cf042da4..60f00ad3 100644 --- a/src/app/organisms/space-manage/SpaceManage.jsx +++ b/src/app/organisms/space-manage/SpaceManage.jsx @@ -302,7 +302,9 @@ function SpaceManageContent({ roomId, requestClose }) { }; }, [roomId]); - useEffect(() => setSelected([]), [spacePath]); + useEffect(() => { + setSelected([]); + }, [spacePath]); const handleSelected = (selectedRoomId) => { const newSelected = [...selected]; diff --git a/src/app/pages/App.jsx b/src/app/pages/App.jsx deleted file mode 100644 index 2828d7be..00000000 --- a/src/app/pages/App.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { StrictMode } from 'react'; -import { Provider } from 'jotai'; - -import { isAuthenticated } from '../../client/state/auth'; - -import Auth from '../templates/auth/Auth'; -import Client from '../templates/client/Client'; - -function App() { - return ( - - {isAuthenticated() ? : } - - ); -} - -export default App; diff --git a/src/app/pages/App.tsx b/src/app/pages/App.tsx new file mode 100644 index 00000000..6cefe999 --- /dev/null +++ b/src/app/pages/App.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { Provider as JotaiProvider } from 'jotai'; +import { + Route, + RouterProvider, + createBrowserRouter, + createHashRouter, + createRoutesFromElements, + redirect, +} from 'react-router-dom'; + +import { ClientConfigLoader } from '../components/ClientConfigLoader'; +import { ClientConfig, ClientConfigProvider } from '../hooks/useClientConfig'; +import { AuthLayout, Login, Register, ResetPassword, authLayoutLoader } from './auth'; +import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, ROOT_PATH } from './paths'; +import { isAuthenticated } from '../../client/state/auth'; +import Client from '../templates/client/Client'; +import { getLoginPath } from './pathUtils'; +import { ConfigConfigError, ConfigConfigLoading } from './ConfigConfig'; + +const createRouter = (clientConfig: ClientConfig) => { + const { hashRouter } = clientConfig; + + const routes = createRoutesFromElements( + + { + if (isAuthenticated()) return redirect('/home'); + return redirect(getLoginPath()); + }} + /> + }> + } /> + } /> + } /> + + + { + if (!isAuthenticated()) return redirect(getLoginPath()); + return null; + }} + > + } /> + direct

        } /> + :spaceIdOrAlias

        } /> + explore

        } /> +
        + Page not found

        } /> +
        + ); + + if (hashRouter?.enabled) { + return createHashRouter(routes, { basename: hashRouter.basename }); + } + return createBrowserRouter(routes, { + basename: import.meta.env.BASE_URL, + }); +}; + +// TODO: app crash boundary +function App() { + return ( + } + error={(err, retry, ignore) => ( + + )} + > + {(clientConfig) => ( + + + + + + )} + + ); +} + +export default App; diff --git a/src/app/pages/ConfigConfig.tsx b/src/app/pages/ConfigConfig.tsx new file mode 100644 index 00000000..dbcdca73 --- /dev/null +++ b/src/app/pages/ConfigConfig.tsx @@ -0,0 +1,53 @@ +import { Box, Button, Dialog, Spinner, Text, color, config } from 'folds'; +import React from 'react'; +import { SplashScreen } from '../components/splash-screen'; + +export function ConfigConfigLoading() { + return ( + + + + Heating up + + + ); +} + +type ConfigConfigErrorProps = { + error: unknown; + retry: () => void; + ignore: () => void; +}; +export function ConfigConfigError({ error, retry, ignore }: ConfigConfigErrorProps) { + return ( + + + + + + Failed to load client configuration file. + {typeof error === 'object' && + error && + 'message' in error && + typeof error.message === 'string' && ( + + {error.message} + + )} + + + + + + + + ); +} diff --git a/src/app/pages/auth/AuthFooter.tsx b/src/app/pages/auth/AuthFooter.tsx new file mode 100644 index 00000000..64541618 --- /dev/null +++ b/src/app/pages/auth/AuthFooter.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Box, Text } from 'folds'; +import * as css from './styles.css'; + +export function AuthFooter() { + return ( + + + About + + + v3.2.0 + + + Twitter + + + Powered by Matrix + + + ); +} diff --git a/src/app/pages/auth/AuthLayout.tsx b/src/app/pages/auth/AuthLayout.tsx new file mode 100644 index 00000000..c58ecdd5 --- /dev/null +++ b/src/app/pages/auth/AuthLayout.tsx @@ -0,0 +1,215 @@ +import React, { useCallback, useEffect } from 'react'; +import { Box, Header, Scroll, Spinner, Text, color } from 'folds'; +import { + LoaderFunction, + Outlet, + generatePath, + matchPath, + redirect, + useLocation, + useNavigate, + useParams, +} from 'react-router-dom'; +import classNames from 'classnames'; + +import { AuthFooter } from './AuthFooter'; +import * as css from './styles.css'; +import * as PatternsCss from '../../styles/Patterns.css'; +import { isAuthenticated } from '../../../client/state/auth'; +import { + clientAllowedServer, + clientDefaultServer, + useClientConfig, +} from '../../hooks/useClientConfig'; +import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; +import { LOGIN_PATH, REGISTER_PATH } from '../paths'; +import CinnySVG from '../../../../public/res/svg/cinny.svg'; +import { ServerPicker } from './ServerPicker'; +import { AutoDiscoveryAction, autoDiscovery } from '../../cs-api'; +import { SpecVersionsLoader } from '../../components/SpecVersionsLoader'; +import { SpecVersionsProvider } from '../../hooks/useSpecVersions'; +import { AutoDiscoveryInfoProvider } from '../../hooks/useAutoDiscoveryInfo'; +import { AuthFlowsLoader } from '../../components/AuthFlowsLoader'; +import { AuthFlowsProvider } from '../../hooks/useAuthFlows'; +import { AuthServerProvider } from '../../hooks/useAuthServer'; + +export const authLayoutLoader: LoaderFunction = () => { + if (isAuthenticated()) { + return redirect('/'); + } + + return null; +}; + +const currentAuthPath = (pathname: string): string => { + if (matchPath(LOGIN_PATH, pathname)) { + return LOGIN_PATH; + } + if (matchPath(REGISTER_PATH, pathname)) { + return REGISTER_PATH; + } + return LOGIN_PATH; +}; + +function AuthLayoutLoading({ message }: { message: string }) { + return ( + + + + {message} + + + ); +} + +function AuthLayoutError({ message }: { message: string }) { + return ( + + + {message} + + + ); +} + +export function AuthLayout() { + const navigate = useNavigate(); + const location = useLocation(); + const { server: urlEncodedServer } = useParams(); + + const clientConfig = useClientConfig(); + + const defaultServer = clientDefaultServer(clientConfig); + let server: string = urlEncodedServer ? decodeURIComponent(urlEncodedServer) : defaultServer; + + if (!clientAllowedServer(clientConfig, server)) { + server = defaultServer; + } + + const [discoveryState, discoverServer] = useAsyncCallback( + useCallback(async (serverName: string) => { + const response = await autoDiscovery(fetch, serverName); + return { + serverName, + response, + }; + }, []) + ); + + useEffect(() => { + if (server) discoverServer(server); + }, [discoverServer, server]); + + // if server is mismatches with path server, update path + useEffect(() => { + if (!urlEncodedServer || decodeURIComponent(urlEncodedServer) !== server) { + navigate( + generatePath(currentAuthPath(location.pathname), { + server: encodeURIComponent(server), + }), + { replace: true } + ); + } + }, [urlEncodedServer, navigate, location, server]); + + const selectServer = useCallback( + (newServer: string) => { + if (newServer === server) { + if (discoveryState.status === AsyncStatus.Loading) return; + discoverServer(server); + return; + } + navigate( + generatePath(currentAuthPath(location.pathname), { server: encodeURIComponent(newServer) }) + ); + }, + [navigate, location, discoveryState, server, discoverServer] + ); + + const [autoDiscoveryError, autoDiscoveryInfo] = + discoveryState.status === AsyncStatus.Success ? discoveryState.data.response : []; + + return ( + + + +
        + + Cinny Logo + Cinny + +
        + + + + Homeserver + + + + {discoveryState.status === AsyncStatus.Loading && ( + + )} + {discoveryState.status === AsyncStatus.Error && ( + + )} + {autoDiscoveryError?.action === AutoDiscoveryAction.FAIL_PROMPT && ( + + )} + {autoDiscoveryError?.action === AutoDiscoveryAction.FAIL_ERROR && ( + + )} + {discoveryState.status === AsyncStatus.Success && autoDiscoveryInfo && ( + + + ( + + )} + error={() => ( + + )} + > + {(specVersions) => ( + + ( + + )} + error={() => ( + + )} + > + {(authFlows) => ( + + + + )} + + + )} + + + + )} + +
        + +
        +
        + ); +} diff --git a/src/app/pages/auth/FiledError.tsx b/src/app/pages/auth/FiledError.tsx new file mode 100644 index 00000000..d96fc872 --- /dev/null +++ b/src/app/pages/auth/FiledError.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Box, Icon, Icons, color, Text } from 'folds'; + +export function FieldError({ message }: { message: string }) { + return ( + + + + {message} + + + ); +} diff --git a/src/app/pages/auth/OrDivider.tsx b/src/app/pages/auth/OrDivider.tsx new file mode 100644 index 00000000..629d3f52 --- /dev/null +++ b/src/app/pages/auth/OrDivider.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Box, Line, Text } from 'folds'; + +export function OrDivider() { + return ( + + + OR + + + ); +} diff --git a/src/app/pages/auth/SSOLogin.tsx b/src/app/pages/auth/SSOLogin.tsx new file mode 100644 index 00000000..a9c1c54b --- /dev/null +++ b/src/app/pages/auth/SSOLogin.tsx @@ -0,0 +1,68 @@ +import { Avatar, AvatarImage, Box, Button, Text } from 'folds'; +import { IIdentityProvider, createClient } from 'matrix-js-sdk'; +import React, { useMemo } from 'react'; +import { useAutoDiscoveryInfo } from '../../hooks/useAutoDiscoveryInfo'; + +type SSOLoginProps = { + providers: IIdentityProvider[]; + asIcons?: boolean; + redirectUrl: string; +}; +export function SSOLogin({ providers, redirectUrl, asIcons }: SSOLoginProps) { + const discovery = useAutoDiscoveryInfo(); + const baseUrl = discovery['m.homeserver'].base_url; + const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); + + const getSSOIdUrl = (ssoId: string): string => mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId); + + return ( + + {providers.map((provider) => { + const { id, name, icon } = provider; + const iconUrl = icon && mx.mxcUrlToHttp(icon, 96, 96, 'crop', false); + + const buttonTitle = `Continue with ${name}`; + + if (iconUrl && asIcons) { + return ( + + + + ); + } + + return ( + + ); + })} + + ); +} diff --git a/src/app/pages/auth/ServerPicker.tsx b/src/app/pages/auth/ServerPicker.tsx new file mode 100644 index 00000000..5f5dcf65 --- /dev/null +++ b/src/app/pages/auth/ServerPicker.tsx @@ -0,0 +1,140 @@ +import React, { + ChangeEventHandler, + KeyboardEventHandler, + MouseEventHandler, + useEffect, + useRef, + useState, +} from 'react'; +import { + Header, + Icon, + IconButton, + Icons, + Input, + Menu, + MenuItem, + PopOut, + Text, + config, +} from 'folds'; +import FocusTrap from 'focus-trap-react'; + +import { useDebounce } from '../../hooks/useDebounce'; + +export function ServerPicker({ + server, + serverList, + allowCustomServer, + onServerChange, +}: { + server: string; + serverList: string[]; + allowCustomServer?: boolean; + onServerChange: (server: string) => void; +}) { + const [serverMenu, setServerMenu] = useState(false); + const serverInputRef = useRef(null); + + useEffect(() => { + // sync input with it outside server changes + if (serverInputRef.current && serverInputRef.current.value !== server) { + serverInputRef.current.value = server; + } + }, [server]); + + const debounceServerSelect = useDebounce(onServerChange, { wait: 700 }); + + const handleServerChange: ChangeEventHandler = (evt) => { + const inputServer = evt.target.value.trim(); + if (inputServer) debounceServerSelect(inputServer); + }; + + const handleKeyDown: KeyboardEventHandler = (evt) => { + if (evt.key === 'ArrowDown') { + evt.preventDefault(); + setServerMenu(true); + } + if (evt.key === 'Enter') { + evt.preventDefault(); + const inputServer = evt.currentTarget.value.trim(); + if (inputServer) onServerChange(inputServer); + } + }; + + const handleServerSelect: MouseEventHandler = (evt) => { + const selectedServer = evt.currentTarget.getAttribute('data-server'); + if (selectedServer) { + onServerChange(selectedServer); + } + setServerMenu(false); + }; + + return ( + setServerMenu(true)} + after={ + serverList.length === 0 || (serverList.length === 1 && !allowCustomServer) ? undefined : ( + setServerMenu(false), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + +
        + Homeserver List +
        +
        + {serverList?.map((serverName) => ( + + {serverName} + + ))} +
        +
        + + } + > + {(anchorRef) => ( + setServerMenu(true)} + variant={allowCustomServer ? 'Background' : 'Surface'} + size="300" + aria-pressed={serverMenu} + radii="300" + > + + + )} +
        + ) + } + /> + ); +} diff --git a/src/app/pages/auth/index.ts b/src/app/pages/auth/index.ts new file mode 100644 index 00000000..c4bd0476 --- /dev/null +++ b/src/app/pages/auth/index.ts @@ -0,0 +1,4 @@ +export * from './AuthLayout'; +export * from './login'; +export * from './register'; +export * from './reset-password'; diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx new file mode 100644 index 00000000..29a7b0ce --- /dev/null +++ b/src/app/pages/auth/login/Login.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { Box, Text, color } from 'folds'; +import { Link, useSearchParams } from 'react-router-dom'; +import { useAuthFlows } from '../../../hooks/useAuthFlows'; +import { useAuthServer } from '../../../hooks/useAuthServer'; +import { useParsedLoginFlows } from '../../../hooks/useParsedLoginFlows'; +import { PasswordLoginForm } from './PasswordLoginForm'; +import { SSOLogin } from '../SSOLogin'; +import { TokenLogin } from './TokenLogin'; +import { OrDivider } from '../OrDivider'; +import { getLoginPath, getRegisterPath } from '../../pathUtils'; +import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin'; +import { LoginPathSearchParams } from '../../paths'; + +const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => ({ + username: searchParams.get('username') ?? undefined, + email: searchParams.get('email') ?? undefined, + loginToken: searchParams.get('loginToken') ?? undefined, +}); + +export function Login() { + const server = useAuthServer(); + const { loginFlows } = useAuthFlows(); + const [searchParams] = useSearchParams(); + const loginSearchParams = getLoginSearchParams(searchParams); + const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server)); + + const parsedFlows = useParsedLoginFlows(loginFlows.flows); + + return ( + + + Login + + {parsedFlows.token && loginSearchParams.loginToken && ( + + )} + {parsedFlows.password && ( + <> + + + {parsedFlows.sso && } + + )} + {parsedFlows.sso && ( + <> + 2 + } + /> + + + )} + {!parsedFlows.password && !parsedFlows.sso && ( + <> + + {`This client does not support login on "${server}" homeserver. Password and SSO based login method not found.`} + + + + )} + + Do not have an account? Register + + + ); +} diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx new file mode 100644 index 00000000..ea52aad8 --- /dev/null +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -0,0 +1,272 @@ +import React, { FormEventHandler, useCallback, useState } from 'react'; +import { + Box, + Button, + Header, + Icon, + IconButton, + Icons, + Input, + Menu, + Overlay, + OverlayBackdrop, + OverlayCenter, + PopOut, + Spinner, + Text, + config, +} from 'folds'; +import FocusTrap from 'focus-trap-react'; +import { Link } from 'react-router-dom'; +import { MatrixError } from 'matrix-js-sdk'; +import { getMxIdLocalPart, getMxIdServer, isUserId } from '../../../utils/matrix'; +import { EMAIL_REGEX } from '../../../utils/regex'; +import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useAuthServer } from '../../../hooks/useAuthServer'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { + CustomLoginResponse, + LoginError, + factoryGetBaseUrl, + login, + useLoginComplete, +} from './loginUtil'; +import { PasswordInput } from '../../../components/password-input/PasswordInput'; +import { FieldError } from '../FiledError'; +import { getResetPasswordPath } from '../../pathUtils'; + +function UsernameHint({ server }: { server: string }) { + const [open, setOpen] = useState(false); + return ( + setOpen(false), + clickOutsideDeactivates: true, + }} + > + +
        + Hint +
        + + + + Username: + {' '} + johndoe + + + + Matrix ID: + + {` @johndoe:${server}`} + + + + Email: + + {` johndoe@${server}`} + + +
        + + } + > + {(targetRef) => ( + setOpen(true)} + ref={targetRef} + type="button" + variant="Background" + size="300" + radii="300" + aria-pressed={open} + > + + + )} +
        + ); +} + +type PasswordLoginFormProps = { + defaultUsername?: string; + defaultEmail?: string; +}; +export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLoginFormProps) { + const server = useAuthServer(); + const clientConfig = useClientConfig(); + + const serverDiscovery = useAutoDiscoveryInfo(); + const baseUrl = serverDiscovery['m.homeserver'].base_url; + + const [loginState, startLogin] = useAsyncCallback< + CustomLoginResponse, + MatrixError, + Parameters + >(useCallback(login, [])); + + useLoginComplete(loginState.status === AsyncStatus.Success ? loginState.data : undefined); + + const handleUsernameLogin = (username: string, password: string) => { + startLogin(baseUrl, { + type: 'm.login.password', + identifier: { + type: 'm.id.user', + user: username, + }, + password, + initial_device_display_name: 'Cinny Web', + }); + }; + + const handleMxIdLogin = async (mxId: string, password: string) => { + const mxIdServer = getMxIdServer(mxId); + const mxIdUsername = getMxIdLocalPart(mxId); + if (!mxIdServer || !mxIdUsername) return; + + const getBaseUrl = factoryGetBaseUrl(clientConfig, mxIdServer); + + startLogin(getBaseUrl, { + type: 'm.login.password', + identifier: { + type: 'm.id.user', + user: mxIdUsername, + }, + password, + initial_device_display_name: 'Cinny Web', + }); + }; + const handleEmailLogin = (email: string, password: string) => { + startLogin(baseUrl, { + type: 'm.login.password', + identifier: { + type: 'm.id.thirdparty', + medium: 'email', + address: email, + }, + password, + initial_device_display_name: 'Cinny Web', + }); + }; + + const handleSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { usernameInput, passwordInput } = evt.target as HTMLFormElement & { + usernameInput: HTMLInputElement; + passwordInput: HTMLInputElement; + }; + + const username = usernameInput.value.trim(); + const password = passwordInput.value; + if (!username) { + usernameInput.focus(); + return; + } + if (!password) { + passwordInput.focus(); + return; + } + + if (isUserId(username)) { + handleMxIdLogin(username, password); + return; + } + if (EMAIL_REGEX.test(username)) { + handleEmailLogin(username, password); + return; + } + handleUsernameLogin(username, password); + }; + + return ( + + + + Username + + } + /> + {loginState.status === AsyncStatus.Error && ( + <> + {loginState.error.errcode === LoginError.ServerNotAllowed && ( + + )} + {loginState.error.errcode === LoginError.InvalidServer && ( + + )} + + )} + + + + Password + + + + {loginState.status === AsyncStatus.Error && ( + <> + {loginState.error.errcode === LoginError.Forbidden && ( + + )} + {loginState.error.errcode === LoginError.UserDeactivated && ( + + )} + {loginState.error.errcode === LoginError.InvalidRequest && ( + + )} + {loginState.error.errcode === LoginError.RateLimited && ( + + )} + {loginState.error.errcode === LoginError.Unknown && ( + + )} + + )} + + + Forget Password? + + + + + + + } + > + + + + + + ); +} diff --git a/src/app/pages/auth/login/TokenLogin.tsx b/src/app/pages/auth/login/TokenLogin.tsx new file mode 100644 index 00000000..761d5dc5 --- /dev/null +++ b/src/app/pages/auth/login/TokenLogin.tsx @@ -0,0 +1,94 @@ +import { + Box, + Icon, + Icons, + Overlay, + OverlayBackdrop, + OverlayCenter, + Spinner, + Text, + color, + config, +} from 'folds'; +import React, { useCallback, useEffect } from 'react'; +import { MatrixError } from 'matrix-js-sdk'; +import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { CustomLoginResponse, LoginError, login, useLoginComplete } from './loginUtil'; + +function LoginTokenError({ message }: { message: string }) { + return ( + + + + Token Login + + {message} + + + + ); +} + +type TokenLoginProps = { + token: string; +}; +export function TokenLogin({ token }: TokenLoginProps) { + const discovery = useAutoDiscoveryInfo(); + const baseUrl = discovery['m.homeserver'].base_url; + + const [loginState, startLogin] = useAsyncCallback< + CustomLoginResponse, + MatrixError, + Parameters + >(useCallback(login, [])); + + useEffect(() => { + startLogin(baseUrl, { + type: 'm.login.token', + token, + initial_device_display_name: 'Cinny Web', + }); + }, [baseUrl, token, startLogin]); + + useLoginComplete(loginState.status === AsyncStatus.Success ? loginState.data : undefined); + + return ( + <> + {loginState.status === AsyncStatus.Error && ( + <> + {loginState.error.errcode === LoginError.Forbidden && ( + + )} + {loginState.error.errcode === LoginError.UserDeactivated && ( + + )} + {loginState.error.errcode === LoginError.InvalidRequest && ( + + )} + {loginState.error.errcode === LoginError.RateLimited && ( + + )} + {loginState.error.errcode === LoginError.Unknown && ( + + )} + + )} + }> + + + + + + ); +} diff --git a/src/app/pages/auth/login/index.ts b/src/app/pages/auth/login/index.ts new file mode 100644 index 00000000..a10c3a83 --- /dev/null +++ b/src/app/pages/auth/login/index.ts @@ -0,0 +1 @@ +export * from './Login'; diff --git a/src/app/pages/auth/login/loginUtil.ts b/src/app/pages/auth/login/loginUtil.ts new file mode 100644 index 00000000..b2fd3870 --- /dev/null +++ b/src/app/pages/auth/login/loginUtil.ts @@ -0,0 +1,118 @@ +import to from 'await-to-js'; +import { LoginRequest, LoginResponse, MatrixError, createClient } from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ClientConfig, clientAllowedServer } from '../../../hooks/useClientConfig'; +import { autoDiscovery, specVersions } from '../../../cs-api'; +import { updateLocalStore } from '../../../../client/action/auth'; +import { ROOT_PATH } from '../../paths'; +import { ErrorCode } from '../../../cs-errorcode'; + +export enum GetBaseUrlError { + NotAllow = 'NotAllow', + NotFound = 'NotFound', +} +export const factoryGetBaseUrl = (clientConfig: ClientConfig, server: string) => { + const getBaseUrl = async (): Promise => { + if (!clientAllowedServer(clientConfig, server)) { + throw new Error(GetBaseUrlError.NotAllow); + } + + const [, discovery] = await to(autoDiscovery(fetch, server)); + + let mxIdBaseUrl: string | undefined; + const [, discoveryInfo] = discovery ?? []; + + if (discoveryInfo) { + mxIdBaseUrl = discoveryInfo['m.homeserver'].base_url; + } + + if (!mxIdBaseUrl) { + throw new Error(GetBaseUrlError.NotFound); + } + const [, versions] = await to(specVersions(fetch, mxIdBaseUrl)); + if (!versions) { + throw new Error(GetBaseUrlError.NotFound); + } + return mxIdBaseUrl; + }; + return getBaseUrl; +}; + +export enum LoginError { + ServerNotAllowed = 'ServerNotAllowed', + InvalidServer = 'InvalidServer', + Forbidden = 'Forbidden', + UserDeactivated = 'UserDeactivated', + InvalidRequest = 'InvalidRequest', + RateLimited = 'RateLimited', + Unknown = 'Unknown', +} + +export type CustomLoginResponse = { + baseUrl: string; + response: LoginResponse; +}; +export const login = async ( + serverBaseUrl: string | (() => Promise), + data: LoginRequest +): Promise => { + const [urlError, url] = + typeof serverBaseUrl === 'function' ? await to(serverBaseUrl()) : [undefined, serverBaseUrl]; + if (urlError) { + throw new MatrixError({ + errcode: + urlError.message === GetBaseUrlError.NotAllow + ? LoginError.ServerNotAllowed + : LoginError.InvalidServer, + }); + } + + const mx = createClient({ baseUrl: url }); + const [err, res] = await to(mx.login(data.type, data)); + + if (err) { + if (err.httpStatus === 400) { + throw new MatrixError({ + errcode: LoginError.InvalidRequest, + }); + } + if (err.httpStatus === 429) { + throw new MatrixError({ + errcode: LoginError.RateLimited, + }); + } + if (err.errcode === ErrorCode.M_USER_DEACTIVATED) { + throw new MatrixError({ + errcode: LoginError.UserDeactivated, + }); + } + + if (err.httpStatus === 403) { + throw new MatrixError({ + errcode: LoginError.Forbidden, + }); + } + + throw new MatrixError({ + errcode: LoginError.Unknown, + }); + } + return { + baseUrl: url, + response: res, + }; +}; + +export const useLoginComplete = (data?: CustomLoginResponse) => { + const navigate = useNavigate(); + + useEffect(() => { + if (data) { + const { response: loginRes, baseUrl: loginBaseUrl } = data; + updateLocalStore(loginRes.access_token, loginRes.device_id, loginRes.user_id, loginBaseUrl); + // TODO: add after login redirect url + navigate(ROOT_PATH, { replace: true }); + } + }, [data, navigate]); +}; diff --git a/src/app/pages/auth/register/PasswordRegisterForm.tsx b/src/app/pages/auth/register/PasswordRegisterForm.tsx new file mode 100644 index 00000000..f4439dd6 --- /dev/null +++ b/src/app/pages/auth/register/PasswordRegisterForm.tsx @@ -0,0 +1,420 @@ +import { + Box, + Button, + Checkbox, + Input, + Overlay, + OverlayBackdrop, + OverlayCenter, + Spinner, + Text, + color, +} from 'folds'; +import React, { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; +import { + AuthDict, + AuthType, + IAuthData, + MatrixError, + RegisterRequest, + UIAFlow, + createClient, +} from 'matrix-js-sdk'; +import { PasswordInput } from '../../../components/password-input/PasswordInput'; +import { + getLoginTermUrl, + getUIAFlowForStages, + hasStageInFlows, + requiredStageInFlows, +} from '../../../utils/matrix-uia'; +import { useUIACompleted, useUIAFlow, useUIAParams } from '../../../hooks/useUIAFlows'; +import { AsyncState, AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo'; +import { RegisterError, RegisterResult, register, useRegisterComplete } from './registerUtil'; +import { FieldError } from '../FiledError'; +import { + AutoDummyStageDialog, + AutoTermsStageDialog, + EmailStageDialog, + ReCaptchaStageDialog, + RegistrationTokenStageDialog, +} from '../../../components/uia-stages'; +import { useRegisterEmail } from '../../../hooks/useRegisterEmail'; +import { ConfirmPasswordMatch } from '../../../components/ConfirmPasswordMatch'; +import { UIAFlowOverlay } from '../../../components/UIAFlowOverlay'; +import { RequestEmailTokenCallback, RequestEmailTokenResponse } from '../../../hooks/types'; + +export const SUPPORTED_REGISTER_STAGES = [ + AuthType.RegistrationToken, + AuthType.Terms, + AuthType.Recaptcha, + AuthType.Email, + AuthType.Dummy, +]; +type RegisterFormInputs = { + usernameInput: HTMLInputElement; + passwordInput: HTMLInputElement; + confirmPasswordInput: HTMLInputElement; + tokenInput?: HTMLInputElement; + emailInput?: HTMLInputElement; + termsInput?: HTMLInputElement; +}; + +type FormData = { + username: string; + password: string; + token?: string; + email?: string; + terms?: boolean; + clientSecret: string; +}; + +const pickStages = (uiaFlows: UIAFlow[], formData: FormData): string[] => { + const pickedStages: string[] = []; + if (formData.token) pickedStages.push(AuthType.RegistrationToken); + if (formData.email) pickedStages.push(AuthType.Email); + if (formData.terms) pickedStages.push(AuthType.Terms); + if (hasStageInFlows(uiaFlows, AuthType.Recaptcha)) { + pickedStages.push(AuthType.Recaptcha); + } + + return pickedStages; +}; + +type RegisterUIAFlowProps = { + formData: FormData; + flow: UIAFlow; + authData: IAuthData; + registerEmailState: AsyncState; + registerEmail: RequestEmailTokenCallback; + onRegister: (registerReqData: RegisterRequest) => void; +}; +function RegisterUIAFlow({ + formData, + flow, + authData, + registerEmailState, + registerEmail, + onRegister, +}: RegisterUIAFlowProps) { + const completed = useUIACompleted(authData); + const { getStageToComplete } = useUIAFlow(authData, flow); + + const stageToComplete = getStageToComplete(); + + const handleAuthDict = useCallback( + (authDict: AuthDict) => { + const { password, username } = formData; + onRegister({ + auth: authDict, + password, + username, + initial_device_display_name: 'Cinny Web', + }); + }, + [onRegister, formData] + ); + + const handleCancel = useCallback(() => { + window.location.reload(); + }, []); + + if (!stageToComplete) return null; + return ( + + {stageToComplete.type === AuthType.RegistrationToken && ( + + )} + {stageToComplete.type === AuthType.Terms && ( + + )} + {stageToComplete.type === AuthType.Recaptcha && ( + + )} + {stageToComplete.type === AuthType.Email && ( + + )} + {stageToComplete.type === AuthType.Dummy && ( + + )} + + ); +} + +type PasswordRegisterFormProps = { + authData: IAuthData; + uiaFlows: UIAFlow[]; + defaultUsername?: string; + defaultEmail?: string; + defaultRegisterToken?: string; +}; +export function PasswordRegisterForm({ + authData, + uiaFlows, + defaultUsername, + defaultEmail, + defaultRegisterToken, +}: PasswordRegisterFormProps) { + const serverDiscovery = useAutoDiscoveryInfo(); + const baseUrl = serverDiscovery['m.homeserver'].base_url; + const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); + const params = useUIAParams(authData); + const termUrl = getLoginTermUrl(params); + const [formData, setFormData] = useState(); + + const [ongoingFlow, setOngoingFlow] = useState(); + + const [registerEmailState, registerEmail] = useRegisterEmail(mx); + + const [registerState, handleRegister] = useAsyncCallback< + RegisterResult, + MatrixError, + [RegisterRequest] + >(useCallback(async (registerReqData) => register(mx, registerReqData), [mx])); + const [ongoingAuthData, customRegisterResp] = + registerState.status === AsyncStatus.Success ? registerState.data : []; + const registerError = + registerState.status === AsyncStatus.Error ? registerState.error : undefined; + + useRegisterComplete(customRegisterResp); + + const handleSubmit: ChangeEventHandler = (evt) => { + evt.preventDefault(); + const { + usernameInput, + passwordInput, + confirmPasswordInput, + emailInput, + tokenInput, + termsInput, + } = evt.target as HTMLFormElement & RegisterFormInputs; + const token = tokenInput?.value.trim(); + const username = usernameInput.value.trim(); + const password = passwordInput.value; + const confirmPassword = confirmPasswordInput.value; + if (password !== confirmPassword) { + return; + } + const email = emailInput?.value.trim(); + const terms = termsInput?.value === 'on'; + + if (!username) { + usernameInput.focus(); + return; + } + + const fData: FormData = { + username, + password, + token, + email, + terms, + clientSecret: mx.generateClientSecret(), + }; + const pickedStages = pickStages(uiaFlows, fData); + const pickedFlow = getUIAFlowForStages(uiaFlows, pickedStages); + setOngoingFlow(pickedFlow); + setFormData(fData); + handleRegister({ + username, + password, + auth: { + session: authData.session, + }, + initial_device_display_name: 'Cinny Web', + }); + }; + + return ( + <> + + + + Username + + + {registerError?.errcode === RegisterError.UserTaken && ( + + )} + {registerError?.errcode === RegisterError.UserInvalid && ( + + )} + {registerError?.errcode === RegisterError.UserExclusive && ( + + )} + + + {(match, doMatch, passRef, confPassRef) => ( + <> + + + Password + + + {registerError?.errcode === RegisterError.PasswordWeak && ( + + )} + {registerError?.errcode === RegisterError.PasswordShort && ( + + )} + + + + Confirm Password + + + + + )} + + {hasStageInFlows(uiaFlows, AuthType.RegistrationToken) && ( + + + {requiredStageInFlows(uiaFlows, AuthType.RegistrationToken) + ? 'Registration Token' + : 'Registration Token (Optional)'} + + + + )} + {hasStageInFlows(uiaFlows, AuthType.Email) && ( + + + {requiredStageInFlows(uiaFlows, AuthType.Email) ? 'Email' : 'Email (Optional)'} + + + + )} + + {hasStageInFlows(uiaFlows, AuthType.Terms) && termUrl && ( + + + + I accept server{' '} + + Terms and Conditions + + . + + + )} + {registerError?.errcode === RegisterError.RateLimited && ( + + )} + {registerError?.errcode === RegisterError.Forbidden && ( + + )} + {registerError?.errcode === RegisterError.InvalidRequest && ( + + )} + {registerError?.errcode === RegisterError.Unknown && ( + + )} + + + + {registerState.status === AsyncStatus.Success && + formData && + ongoingFlow && + ongoingAuthData && ( + + )} + {registerState.status === AsyncStatus.Loading && ( + }> + + + + + )} + + ); +} diff --git a/src/app/pages/auth/register/Register.tsx b/src/app/pages/auth/register/Register.tsx new file mode 100644 index 00000000..756b13b3 --- /dev/null +++ b/src/app/pages/auth/register/Register.tsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { Box, Text, color } from 'folds'; +import { Link, useSearchParams } from 'react-router-dom'; +import { useAuthServer } from '../../../hooks/useAuthServer'; +import { RegisterFlowStatus, useAuthFlows } from '../../../hooks/useAuthFlows'; +import { useParsedLoginFlows } from '../../../hooks/useParsedLoginFlows'; +import { PasswordRegisterForm, SUPPORTED_REGISTER_STAGES } from '../register/PasswordRegisterForm'; +import { OrDivider } from '../OrDivider'; +import { SSOLogin } from '../SSOLogin'; +import { SupportedUIAFlowsLoader } from '../../../components/SupportedUIAFlowsLoader'; +import { getLoginPath } from '../../pathUtils'; +import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin'; +import { RegisterPathSearchParams } from '../../paths'; + +const getRegisterSearchParams = (searchParams: URLSearchParams): RegisterPathSearchParams => ({ + username: searchParams.get('username') ?? undefined, + email: searchParams.get('email') ?? undefined, + token: searchParams.get('token') ?? undefined, +}); + +export function Register() { + const server = useAuthServer(); + const { loginFlows, registerFlows } = useAuthFlows(); + const [searchParams] = useSearchParams(); + const registerSearchParams = getRegisterSearchParams(searchParams); + const { sso } = useParsedLoginFlows(loginFlows.flows); + + // redirect to /login because only that path handle m.login.token + const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server)); + + return ( + + + Register + + {registerFlows.status === RegisterFlowStatus.RegistrationDisabled && !sso && ( + + Registration has been disabled on this homeserver. + + )} + {registerFlows.status === RegisterFlowStatus.RateLimited && !sso && ( + + You have been rate-limited! Please try after some time. + + )} + {registerFlows.status === RegisterFlowStatus.InvalidRequest && !sso && ( + + Invalid Request! Failed to get any registration options. + + )} + {registerFlows.status === RegisterFlowStatus.FlowRequired && ( + <> + + {(supportedFlows) => + supportedFlows.length === 0 ? ( + + This application does not support registration on this homeserver. + + ) : ( + + ) + } + + + {sso && } + + )} + {sso && ( + <> + 2 + } + /> + + + )} + + Already have an account? Login + + + ); +} diff --git a/src/app/pages/auth/register/index.ts b/src/app/pages/auth/register/index.ts new file mode 100644 index 00000000..7eb55fd5 --- /dev/null +++ b/src/app/pages/auth/register/index.ts @@ -0,0 +1 @@ +export * from './Register'; diff --git a/src/app/pages/auth/register/registerUtil.ts b/src/app/pages/auth/register/registerUtil.ts new file mode 100644 index 00000000..23c3d6a1 --- /dev/null +++ b/src/app/pages/auth/register/registerUtil.ts @@ -0,0 +1,125 @@ +import to from 'await-to-js'; +import { + IAuthData, + MatrixClient, + MatrixError, + RegisterRequest, + RegisterResponse, +} from 'matrix-js-sdk'; +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { updateLocalStore } from '../../../../client/action/auth'; +import { ROOT_PATH } from '../../paths'; +import { ErrorCode } from '../../../cs-errorcode'; + +export enum RegisterError { + UserTaken = 'UserTaken', + UserInvalid = 'UserInvalid', + UserExclusive = 'UserExclusive', + PasswordWeak = 'PasswordWeak', + PasswordShort = 'PasswordShort', + InvalidRequest = 'InvalidRequest', + Forbidden = 'Forbidden', + RateLimited = 'RateLimited', + Unknown = 'Unknown', +} + +export type CustomRegisterResponse = { + baseUrl: string; + response: RegisterResponse; +}; +export type RegisterResult = [IAuthData, undefined] | [undefined, CustomRegisterResponse]; +export const register = async ( + mx: MatrixClient, + requestData: RegisterRequest +): Promise => { + const [err, res] = await to(mx.registerRequest(requestData)); + + if (err) { + if (err.httpStatus === 401) { + const authData = err.data as IAuthData; + return [authData, undefined]; + } + + if (err.errcode === ErrorCode.M_USER_IN_USE) { + throw new MatrixError({ + errcode: RegisterError.UserTaken, + }); + } + if (err.errcode === ErrorCode.M_INVALID_USERNAME) { + throw new MatrixError({ + errcode: RegisterError.UserInvalid, + }); + } + if (err.errcode === ErrorCode.M_EXCLUSIVE) { + throw new MatrixError({ + errcode: RegisterError.UserExclusive, + }); + } + if (err.errcode === ErrorCode.M_WEAK_PASSWORD) { + throw new MatrixError({ + errcode: RegisterError.PasswordWeak, + error: err.data.error, + }); + } + if (err.errcode === ErrorCode.M_PASSWORD_TOO_SHORT) { + throw new MatrixError({ + errcode: RegisterError.PasswordShort, + error: err.data.error, + }); + } + + if (err.httpStatus === 429) { + throw new MatrixError({ + errcode: RegisterError.RateLimited, + }); + } + + if (err.httpStatus === 400) { + throw new MatrixError({ + errcode: RegisterError.InvalidRequest, + }); + } + + if (err.httpStatus === 403) { + throw new MatrixError({ + errcode: RegisterError.Forbidden, + }); + } + + throw new MatrixError({ + errcode: RegisterError.Unknown, + error: err.data.error, + }); + } + return [ + undefined, + { + baseUrl: mx.baseUrl, + response: res, + }, + ]; +}; + +export const useRegisterComplete = (data?: CustomRegisterResponse) => { + const navigate = useNavigate(); + + useEffect(() => { + if (data) { + const { response, baseUrl } = data; + + const userId = response.user_id; + const accessToken = response.access_token; + const deviceId = response.device_id; + + if (accessToken && deviceId) { + updateLocalStore(accessToken, deviceId, userId, baseUrl); + // TODO: add after register redirect url + navigate(ROOT_PATH, { replace: true }); + } else { + // TODO: navigate to login with userId + navigate(ROOT_PATH, { replace: true }); + } + } + }, [data, navigate]); +}; diff --git a/src/app/pages/auth/reset-password/PasswordResetForm.tsx b/src/app/pages/auth/reset-password/PasswordResetForm.tsx new file mode 100644 index 00000000..7c71de02 --- /dev/null +++ b/src/app/pages/auth/reset-password/PasswordResetForm.tsx @@ -0,0 +1,274 @@ +import React, { FormEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; +import { + Box, + Button, + Dialog, + Input, + Overlay, + OverlayBackdrop, + OverlayCenter, + Spinner, + Text, + color, + config, +} from 'folds'; +import { useNavigate } from 'react-router-dom'; +import FocusTrap from 'focus-trap-react'; +import { AuthDict, AuthType, MatrixError, createClient } from 'matrix-js-sdk'; +import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useAuthServer } from '../../../hooks/useAuthServer'; +import { usePasswordEmail } from '../../../hooks/usePasswordEmail'; +import { PasswordInput } from '../../../components/password-input/PasswordInput'; +import { ConfirmPasswordMatch } from '../../../components/ConfirmPasswordMatch'; +import { FieldError } from '../FiledError'; +import { UIAFlowOverlay } from '../../../components/UIAFlowOverlay'; +import { EmailStageDialog } from '../../../components/uia-stages'; +import { ResetPasswordResult, resetPassword } from './resetPasswordUtil'; +import { getLoginPath, withSearchParam } from '../../pathUtils'; +import { LoginPathSearchParams } from '../../paths'; +import { getUIAError, getUIAErrorCode } from '../../../utils/matrix-uia'; + +type FormData = { + email: string; + password: string; + clientSecret: string; +}; + +function ResetPasswordComplete({ email }: { email?: string }) { + const server = useAuthServer(); + + const navigate = useNavigate(); + + const handleClick = () => { + const path = getLoginPath(server); + if (email) { + navigate(withSearchParam(path, { email })); + return; + } + navigate(path); + }; + + return ( + }> + + + + + + Password has been reset successfully. Please login with your new password. + + + + + + + + ); +} + +type PasswordResetFormProps = { + defaultEmail?: string; +}; +export function PasswordResetForm({ defaultEmail }: PasswordResetFormProps) { + const server = useAuthServer(); + + const serverDiscovery = useAutoDiscoveryInfo(); + const baseUrl = serverDiscovery['m.homeserver'].base_url; + const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); + + const [formData, setFormData] = useState(); + + const [passwordEmailState, passwordEmail] = usePasswordEmail(mx); + + const [resetPasswordState, handleResetPassword] = useAsyncCallback< + ResetPasswordResult, + MatrixError, + [AuthDict, string] + >(useCallback(async (authDict, newPassword) => resetPassword(mx, authDict, newPassword), [mx])); + + const [ongoingAuthData, resetPasswordResult] = + resetPasswordState.status === AsyncStatus.Success ? resetPasswordState.data : []; + const resetPasswordError = + resetPasswordState.status === AsyncStatus.Error ? resetPasswordState.error : undefined; + + const flowErrorCode = ongoingAuthData && getUIAErrorCode(ongoingAuthData); + const flowError = ongoingAuthData && getUIAError(ongoingAuthData); + + let waitingToVerifyEmail = true; + if (resetPasswordResult) waitingToVerifyEmail = false; + if (ongoingAuthData && flowErrorCode === undefined) waitingToVerifyEmail = false; + if (resetPasswordError) waitingToVerifyEmail = false; + if (resetPasswordState.status === AsyncStatus.Loading) waitingToVerifyEmail = false; + + // We only support UIA m.login.password stage for reset password + // So we will assume to process it as soon as + // we have 401 with no error on initial request. + useEffect(() => { + if (formData && ongoingAuthData && !flowErrorCode) { + handleResetPassword( + { + type: AuthType.Password, + identifier: { + type: 'm.id.thirdparty', + medium: 'email', + address: formData.email, + }, + password: formData.password, + }, + formData.password + ); + } + }, [ongoingAuthData, flowErrorCode, formData, handleResetPassword]); + + const handleSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { emailInput, passwordInput, confirmPasswordInput } = evt.target as HTMLFormElement & { + emailInput: HTMLInputElement; + passwordInput: HTMLInputElement; + confirmPasswordInput: HTMLInputElement; + }; + + const email = emailInput.value.trim(); + const password = passwordInput.value; + const confirmPassword = confirmPasswordInput.value; + if (!email) { + emailInput.focus(); + return; + } + if (password !== confirmPassword) return; + + const clientSecret = mx.generateClientSecret(); + passwordEmail(email, clientSecret); + setFormData({ + email, + password, + clientSecret, + }); + }; + + const handleCancel = () => { + window.location.reload(); + }; + + const handleSubmitRequest = useCallback( + (authDict: AuthDict) => { + if (!formData) return; + const { password } = formData; + handleResetPassword(authDict, password); + }, + [formData, handleResetPassword] + ); + + return ( + + + Homeserver {server} will send you an email to let you reset your password. + + + + Email + + + {passwordEmailState.status === AsyncStatus.Error && ( + + )} + + + {(match, doMatch, passRef, confPassRef) => ( + <> + + + New Password + + + + + + Confirm Password + + + + + )} + + {resetPasswordError && ( + + )} + + + + {resetPasswordResult && } + + {passwordEmailState.status === AsyncStatus.Success && formData && waitingToVerifyEmail && ( + + + + )} + + } + > + + + + + + ); +} diff --git a/src/app/pages/auth/reset-password/ResetPassword.tsx b/src/app/pages/auth/reset-password/ResetPassword.tsx new file mode 100644 index 00000000..1ada9afd --- /dev/null +++ b/src/app/pages/auth/reset-password/ResetPassword.tsx @@ -0,0 +1,36 @@ +import { Box, Text } from 'folds'; +import React from 'react'; +import { Link, useSearchParams } from 'react-router-dom'; +import { getLoginPath } from '../../pathUtils'; +import { useAuthServer } from '../../../hooks/useAuthServer'; +import { PasswordResetForm } from './PasswordResetForm'; + +export type ResetPasswordSearchParams = { + email?: string; +}; + +const getResetPasswordSearchParams = ( + searchParams: URLSearchParams +): ResetPasswordSearchParams => ({ + email: searchParams.get('email') ?? undefined, +}); + +export function ResetPassword() { + const server = useAuthServer(); + const [searchParams] = useSearchParams(); + const resetPasswordSearchParams = getResetPasswordSearchParams(searchParams); + + return ( + + + Reset Password + + + + + + Remember your password? Login + + + ); +} diff --git a/src/app/pages/auth/reset-password/index.ts b/src/app/pages/auth/reset-password/index.ts new file mode 100644 index 00000000..0e85ecf3 --- /dev/null +++ b/src/app/pages/auth/reset-password/index.ts @@ -0,0 +1 @@ +export * from './ResetPassword'; diff --git a/src/app/pages/auth/reset-password/resetPasswordUtil.ts b/src/app/pages/auth/reset-password/resetPasswordUtil.ts new file mode 100644 index 00000000..5eb436fa --- /dev/null +++ b/src/app/pages/auth/reset-password/resetPasswordUtil.ts @@ -0,0 +1,23 @@ +import to from 'await-to-js'; +import { AuthDict, IAuthData, MatrixClient, MatrixError } from 'matrix-js-sdk'; + +export type ResetPasswordResponse = Record; +export type ResetPasswordResult = [IAuthData, undefined] | [undefined, ResetPasswordResponse]; +export const resetPassword = async ( + mx: MatrixClient, + authDict: AuthDict, + newPassword: string +): Promise => { + const [err, res] = await to( + mx.setPassword(authDict, newPassword, false) + ); + + if (err) { + if (err.httpStatus === 401) { + const authData = err.data as IAuthData; + return [authData, undefined]; + } + throw err; + } + return [undefined, res]; +}; diff --git a/src/app/pages/auth/styles.css.ts b/src/app/pages/auth/styles.css.ts new file mode 100644 index 00000000..5834ad84 --- /dev/null +++ b/src/app/pages/auth/styles.css.ts @@ -0,0 +1,53 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, color, config, toRem } from 'folds'; + +export const AuthLayout = style({ + minHeight: '100%', + backgroundColor: color.Background.Container, + color: color.Background.OnContainer, + padding: config.space.S400, + paddingRight: config.space.S200, + paddingBottom: 0, + position: 'relative', +}); + +export const AuthCard = style({ + marginTop: '1vh', + maxWidth: toRem(460), + width: '100%', + backgroundColor: color.Surface.Container, + color: color.Surface.OnContainer, + borderRadius: config.radii.R400, + boxShadow: config.shadow.E100, + border: `${config.borderWidth.B300} solid ${color.Surface.ContainerLine}`, + overflow: 'hidden', +}); + +export const AuthLogo = style([ + DefaultReset, + { + width: toRem(26), + height: toRem(26), + + borderRadius: '50%', + }, +]); + +export const AuthHeader = style({ + padding: `0 ${config.space.S400}`, + borderBottomWidth: config.borderWidth.B300, +}); + +export const AuthCardContent = style({ + maxWidth: toRem(402), + width: '100%', + margin: 'auto', + padding: config.space.S400, + paddingTop: config.space.S700, + paddingBottom: toRem(44), + gap: toRem(44), +}); + +export const AuthFooter = style({ + padding: config.space.S200, +}); diff --git a/src/app/pages/pathUtils.ts b/src/app/pages/pathUtils.ts new file mode 100644 index 00000000..db39ce39 --- /dev/null +++ b/src/app/pages/pathUtils.ts @@ -0,0 +1,28 @@ +import { generatePath } from 'react-router-dom'; +import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, ROOT_PATH } from './paths'; + +export const withSearchParam = >( + path: string, + searchParam: T +): string => { + const params = new URLSearchParams(searchParam); + + return `${path}?${params}`; +}; + +export const getRootPath = (): string => ROOT_PATH; + +export const getLoginPath = (server?: string): string => { + const params = server ? { server: encodeURIComponent(server) } : undefined; + return generatePath(LOGIN_PATH, params); +}; + +export const getRegisterPath = (server?: string): string => { + const params = server ? { server: encodeURIComponent(server) } : undefined; + return generatePath(REGISTER_PATH, params); +}; + +export const getResetPasswordPath = (server?: string): string => { + const params = server ? { server: encodeURIComponent(server) } : undefined; + return generatePath(RESET_PASSWORD_PATH, params); +}; diff --git a/src/app/pages/paths.ts b/src/app/pages/paths.ts new file mode 100644 index 00000000..cd622641 --- /dev/null +++ b/src/app/pages/paths.ts @@ -0,0 +1,17 @@ +export const ROOT_PATH = '/'; + +export type LoginPathSearchParams = { + username?: string; + email?: string; + loginToken?: string; +}; +export const LOGIN_PATH = '/login/:server?/'; + +export type RegisterPathSearchParams = { + username?: string; + email?: string; + token?: string; +}; +export const REGISTER_PATH = '/register/:server?/'; + +export const RESET_PASSWORD_PATH = '/reset-password/:server?/'; diff --git a/src/app/state/hooks/inviteList.ts b/src/app/state/hooks/inviteList.ts index f8b7e057..ffe44445 100644 --- a/src/app/state/hooks/inviteList.ts +++ b/src/app/state/hooks/inviteList.ts @@ -1,28 +1,26 @@ -import { useAtomValue, WritableAtom } from 'jotai'; +import { useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { MatrixClient } from 'matrix-js-sdk'; import { useCallback } from 'react'; import { isDirectInvite, isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; -import { compareRoomsEqual, RoomsAction } from '../utils'; -import { MDirectAction } from '../mDirectList'; +import { compareRoomsEqual } from '../utils'; +import { mDirectAtom } from '../mDirectList'; +import { allInvitesAtom } from '../inviteList'; -export const useSpaceInvites = ( - mx: MatrixClient, - allInvitesAtom: WritableAtom -) => { +export const useSpaceInvites = (mx: MatrixClient, invitesAtom: typeof allInvitesAtom) => { const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))), [mx] ); - return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(invitesAtom, selector, compareRoomsEqual)); }; export const useRoomInvites = ( mx: MatrixClient, - allInvitesAtom: WritableAtom, - mDirectAtom: WritableAtom, MDirectAction> + invitesAtom: typeof allInvitesAtom, + directAtom: typeof mDirectAtom ) => { - const mDirects = useAtomValue(mDirectAtom); + const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter( @@ -32,15 +30,15 @@ export const useRoomInvites = ( ), [mx, mDirects] ); - return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(invitesAtom, selector, compareRoomsEqual)); }; export const useDirectInvites = ( mx: MatrixClient, - allInvitesAtom: WritableAtom, - mDirectAtom: WritableAtom, MDirectAction> + invitesAtom: typeof allInvitesAtom, + directAtom: typeof mDirectAtom ) => { - const mDirects = useAtomValue(mDirectAtom); + const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter( @@ -48,16 +46,13 @@ export const useDirectInvites = ( ), [mx, mDirects] ); - return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(invitesAtom, selector, compareRoomsEqual)); }; -export const useUnsupportedInvites = ( - mx: MatrixClient, - allInvitesAtom: WritableAtom -) => { +export const useUnsupportedInvites = (mx: MatrixClient, invitesAtom: typeof allInvitesAtom) => { const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))), [mx] ); - return useAtomValue(selectAtom(allInvitesAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(invitesAtom, selector, compareRoomsEqual)); }; diff --git a/src/app/state/hooks/roomList.ts b/src/app/state/hooks/roomList.ts index 5d0890bd..c0a7bfb8 100644 --- a/src/app/state/hooks/roomList.ts +++ b/src/app/state/hooks/roomList.ts @@ -1,54 +1,52 @@ -import { useAtomValue, WritableAtom } from 'jotai'; +import { useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { MatrixClient } from 'matrix-js-sdk'; import { useCallback } from 'react'; import { isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; -import { compareRoomsEqual, RoomsAction } from '../utils'; -import { MDirectAction } from '../mDirectList'; +import { compareRoomsEqual } from '../utils'; +import { mDirectAtom } from '../mDirectList'; +import { allRoomsAtom } from '../roomList'; -export const useSpaces = (mx: MatrixClient, allRoomsAtom: WritableAtom) => { +export const useSpaces = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => { const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))), [mx] ); - return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); }; export const useRooms = ( mx: MatrixClient, - allRoomsAtom: WritableAtom, - mDirectAtom: WritableAtom, MDirectAction> + roomsAtom: typeof allRoomsAtom, + directAtom: typeof mDirectAtom ) => { - const mDirects = useAtomValue(mDirectAtom); + const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId)), [mx, mDirects] ); - return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); }; export const useDirects = ( mx: MatrixClient, - allRoomsAtom: WritableAtom, - mDirectAtom: WritableAtom, MDirectAction> + roomsAtom: typeof allRoomsAtom, + directAtom: typeof mDirectAtom ) => { - const mDirects = useAtomValue(mDirectAtom); + const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId)), [mx, mDirects] ); - return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); }; -export const useUnsupportedRooms = ( - mx: MatrixClient, - allRoomsAtom: WritableAtom -) => { +export const useUnsupportedRooms = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => { const selector = useCallback( (rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))), [mx] ); - return useAtomValue(selectAtom(allRoomsAtom, selector, compareRoomsEqual)); + return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); }; diff --git a/src/app/state/hooks/settings.ts b/src/app/state/hooks/settings.ts index 43b56553..d90c7664 100644 --- a/src/app/state/hooks/settings.ts +++ b/src/app/state/hooks/settings.ts @@ -1,16 +1,16 @@ -import { atom, useAtomValue, useSetAtom, WritableAtom } from 'jotai'; -import { SetAtom } from 'jotai/core/atom'; +import { atom, useAtomValue, useSetAtom } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { useMemo } from 'react'; -import { Settings } from '../settings'; +import { Settings, settingsAtom as sAtom } from '../settings'; -export const useSetSetting = ( - settingsAtom: WritableAtom, - key: K -) => { +export type SettingSetter = + | Settings[K] + | ((s: Settings[K]) => Settings[K]); + +export const useSetSetting = (settingsAtom: typeof sAtom, key: K) => { const setterAtom = useMemo( () => - atom Settings[K])>(null, (get, set, value) => { + atom], undefined>(null, (get, set, value) => { const s = { ...get(settingsAtom) }; s[key] = typeof value === 'function' ? value(s[key]) : value; set(settingsAtom, s); @@ -22,9 +22,9 @@ export const useSetSetting = ( }; export const useSetting = ( - settingsAtom: WritableAtom, + settingsAtom: typeof sAtom, key: K -): [Settings[K], SetAtom Settings[K]), void>] => { +): [Settings[K], ReturnType>] => { const selector = useMemo(() => (s: Settings) => s[key], [key]); const setting = useAtomValue(selectAtom(settingsAtom, selector)); diff --git a/src/app/state/inviteList.ts b/src/app/state/inviteList.ts index 463fd352..a6dc7966 100644 --- a/src/app/state/inviteList.ts +++ b/src/app/state/inviteList.ts @@ -5,7 +5,7 @@ import { Membership } from '../../types/matrix/room'; import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); -export const allInvitesAtom = atom( +export const allInvitesAtom = atom( (get) => get(baseRoomsAtom), (get, set, action) => { if (action.type === 'INITIALIZE') { @@ -22,7 +22,7 @@ export const allInvitesAtom = atom( export const useBindAllInvitesAtom = ( mx: MatrixClient, - allRooms: WritableAtom + allRooms: WritableAtom ) => { useBindRoomsWithMembershipsAtom( mx, diff --git a/src/app/state/list.ts b/src/app/state/list.ts index 4f5a6191..670e6db1 100644 --- a/src/app/state/list.ts +++ b/src/app/state/list.ts @@ -12,7 +12,7 @@ export type ListAction = export const createListAtom = () => { const baseListAtom = atom([]); - return atom>( + return atom], undefined>( (get) => get(baseListAtom), (get, set, action) => { const items = get(baseListAtom); diff --git a/src/app/state/mDirectList.ts b/src/app/state/mDirectList.ts index 96e2f0d0..1fa8311f 100644 --- a/src/app/state/mDirectList.ts +++ b/src/app/state/mDirectList.ts @@ -1,4 +1,4 @@ -import { atom, useSetAtom, WritableAtom } from 'jotai'; +import { atom, useSetAtom } from 'jotai'; import { ClientEvent, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; import { useEffect } from 'react'; import { AccountDataEvent } from '../../types/matrix/accountData'; @@ -10,17 +10,14 @@ export type MDirectAction = { }; const baseMDirectAtom = atom(new Set()); -export const mDirectAtom = atom, MDirectAction>( +export const mDirectAtom = atom, [MDirectAction], undefined>( (get) => get(baseMDirectAtom), (get, set, action) => { set(baseMDirectAtom, action.rooms); } ); -export const useBindMDirectAtom = ( - mx: MatrixClient, - mDirect: WritableAtom, MDirectAction> -) => { +export const useBindMDirectAtom = (mx: MatrixClient, mDirect: typeof mDirectAtom) => { const setMDirect = useSetAtom(mDirect); useEffect(() => { diff --git a/src/app/state/mutedRoomList.ts b/src/app/state/mutedRoomList.ts index d456f853..f818450b 100644 --- a/src/app/state/mutedRoomList.ts +++ b/src/app/state/mutedRoomList.ts @@ -1,4 +1,4 @@ -import { atom, WritableAtom, useSetAtom } from 'jotai'; +import { atom, useSetAtom } from 'jotai'; import { ClientEvent, IPushRule, IPushRules, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; import { useEffect } from 'react'; import { MuteChanges } from '../../types/matrix/room'; @@ -21,7 +21,7 @@ export const muteChangesAtom = atom({ }); const baseMutedRoomsAtom = atom(new Set()); -export const mutedRoomsAtom = atom, MutedRoomsUpdate>( +export const mutedRoomsAtom = atom, [MutedRoomsUpdate], undefined>( (get) => get(baseMutedRoomsAtom), (get, set, action) => { const mutedRooms = new Set([...get(mutedRoomsAtom)]); @@ -45,10 +45,7 @@ export const mutedRoomsAtom = atom, MutedRoomsUpdate>( } ); -export const useBindMutedRoomsAtom = ( - mx: MatrixClient, - mutedAtom: WritableAtom, MutedRoomsUpdate> -) => { +export const useBindMutedRoomsAtom = (mx: MatrixClient, mutedAtom: typeof mutedRoomsAtom) => { const setMuted = useSetAtom(mutedAtom); useEffect(() => { diff --git a/src/app/state/roomList.ts b/src/app/state/roomList.ts index 7a793d8c..e0fa170f 100644 --- a/src/app/state/roomList.ts +++ b/src/app/state/roomList.ts @@ -1,11 +1,11 @@ -import { atom, WritableAtom } from 'jotai'; +import { atom } from 'jotai'; import { MatrixClient } from 'matrix-js-sdk'; import { useMemo } from 'react'; import { Membership } from '../../types/matrix/room'; import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); -export const allRoomsAtom = atom( +export const allRoomsAtom = atom( (get) => get(baseRoomsAtom), (get, set, action) => { if (action.type === 'INITIALIZE') { @@ -19,10 +19,7 @@ export const allRoomsAtom = atom( }); } ); -export const useBindAllRoomsAtom = ( - mx: MatrixClient, - allRooms: WritableAtom -) => { +export const useBindAllRoomsAtom = (mx: MatrixClient, allRooms: typeof allRoomsAtom) => { useBindRoomsWithMembershipsAtom( mx, allRooms, diff --git a/src/app/state/roomToParents.ts b/src/app/state/roomToParents.ts index 374ddd57..1e2ef18c 100644 --- a/src/app/state/roomToParents.ts +++ b/src/app/state/roomToParents.ts @@ -1,5 +1,5 @@ import produce from 'immer'; -import { atom, useSetAtom, WritableAtom } from 'jotai'; +import { atom, useSetAtom } from 'jotai'; import { ClientEvent, MatrixClient, @@ -34,7 +34,7 @@ export type RoomToParentsAction = }; const baseRoomToParents = atom(new Map()); -export const roomToParentsAtom = atom( +export const roomToParentsAtom = atom( (get) => get(baseRoomToParents), (get, set, action) => { if (action.type === 'INITIALIZE') { @@ -69,7 +69,7 @@ export const roomToParentsAtom = atom( export const useBindRoomToParentsAtom = ( mx: MatrixClient, - roomToParents: WritableAtom + roomToParents: typeof roomToParentsAtom ) => { const setRoomToParents = useSetAtom(roomToParents); diff --git a/src/app/state/roomToUnread.ts b/src/app/state/roomToUnread.ts index 0c7b6bd6..ad388763 100644 --- a/src/app/state/roomToUnread.ts +++ b/src/app/state/roomToUnread.ts @@ -1,5 +1,5 @@ import produce from 'immer'; -import { atom, useSetAtom, PrimitiveAtom, WritableAtom, useAtomValue } from 'jotai'; +import { atom, useSetAtom, PrimitiveAtom, useAtomValue } from 'jotai'; import { IRoomTimelineData, MatrixClient, MatrixEvent, Room, RoomEvent } from 'matrix-js-sdk'; import { ReceiptContent, ReceiptType } from 'matrix-js-sdk/lib/@types/read_receipts'; import { useEffect } from 'react'; @@ -82,7 +82,7 @@ const deleteUnreadInfo = (roomToUnread: RoomToUnread, allParents: Set, r }; const baseRoomToUnread = atom(new Map()); -export const roomToUnreadAtom = atom( +export const roomToUnreadAtom = atom( (get) => get(baseRoomToUnread), (get, set, action) => { if (action.type === 'RESET') { @@ -127,7 +127,7 @@ export const roomToUnreadAtom = atom( export const useBindRoomToUnreadAtom = ( mx: MatrixClient, - unreadAtom: WritableAtom, + unreadAtom: typeof roomToUnreadAtom, muteChangesAtom: PrimitiveAtom ) => { const setUnreadAtom = useSetAtom(unreadAtom); diff --git a/src/app/state/sessions.ts b/src/app/state/sessions.ts new file mode 100644 index 00000000..85bcd10e --- /dev/null +++ b/src/app/state/sessions.ts @@ -0,0 +1,129 @@ +import { atom } from 'jotai'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +export type Session = { + baseUrl: string; + userId: string; + deviceId: string; + accessToken: string; + expiresInMs?: number; + refreshToken?: string; + fallbackSdkStores?: boolean; +}; + +export type Sessions = Session[]; +export type SessionStoreName = { + sync: string; + crypto: string; +}; + +/** + * Migration code for old session + */ +const FALLBACK_STORE_NAME: SessionStoreName = { + sync: 'web-sync-store', + crypto: 'crypto-store', +} as const; + +const removeFallbackSession = () => { + localStorage.removeItem('cinny_hs_base_url'); + localStorage.removeItem('cinny_user_id'); + localStorage.removeItem('cinny_device_id'); + localStorage.removeItem('cinny_access_token'); +}; +const getFallbackSession = (): Session | undefined => { + const baseUrl = localStorage.getItem('cinny_hs_base_url'); + const userId = localStorage.getItem('cinny_user_id'); + const deviceId = localStorage.getItem('cinny_device_id'); + const accessToken = localStorage.getItem('cinny_access_token'); + + if (baseUrl && userId && deviceId && accessToken) { + const session: Session = { + baseUrl, + userId, + deviceId, + accessToken, + fallbackSdkStores: true, + }; + + return session; + } + + return undefined; +}; +/** + * End of migration code for old session + */ + +export const getSessionStoreName = (session: Session): SessionStoreName => { + if (session.fallbackSdkStores) { + return FALLBACK_STORE_NAME; + } + + return { + sync: `sync${session.userId}`, + crypto: `crypto${session.userId}`, + }; +}; + +export const MATRIX_SESSIONS_KEY = 'matrixSessions'; +const baseSessionsAtom = atomWithLocalStorage( + MATRIX_SESSIONS_KEY, + (key) => { + const defaultSessions: Sessions = []; + const sessions = getLocalStorageItem(key, defaultSessions); + + // Before multi account support session was stored + // as multiple item in local storage. + // So we need these migration code. + const fallbackSession = getFallbackSession(); + if (fallbackSession) { + removeFallbackSession(); + sessions.push(fallbackSession); + setLocalStorageItem(key, sessions); + } + return sessions; + }, + (key, value) => { + setLocalStorageItem(key, value); + } +); + +export type SessionsAction = + | { + type: 'PUT'; + session: Session; + } + | { + type: 'DELETE'; + session: Session; + }; + +export const sessionsAtom = atom( + (get) => get(baseSessionsAtom), + (get, set, action) => { + if (action.type === 'PUT') { + const sessions = [...get(baseSessionsAtom)]; + const sessionIndex = sessions.findIndex( + (session) => session.userId === action.session.userId + ); + if (sessionIndex === -1) { + sessions.push(action.session); + } else { + sessions.splice(sessionIndex, 1, action.session); + } + set(baseSessionsAtom, sessions); + return; + } + if (action.type === 'DELETE') { + const sessions = get(baseSessionsAtom).filter( + (session) => session.userId !== action.session.userId + ); + set(baseSessionsAtom, sessions); + } + } +); diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index 92d40ff8..061931ea 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -64,7 +64,7 @@ export const setSettings = (settings: Settings) => { }; const baseSettings = atom(getSettings()); -export const settingsAtom = atom( +export const settingsAtom = atom( (get) => get(baseSettings), (get, set, update) => { set(baseSettings, update); diff --git a/src/app/state/tabToRoom.ts b/src/app/state/tabToRoom.ts index 2f4ee92a..b9472d9f 100644 --- a/src/app/state/tabToRoom.ts +++ b/src/app/state/tabToRoom.ts @@ -14,7 +14,7 @@ type TabToRoomAction = { }; const baseTabToRoom = atom(new Map()); -export const tabToRoomAtom = atom( +export const tabToRoomAtom = atom( (get) => get(baseTabToRoom), (get, set, action) => { if (action.type === 'PUT') { diff --git a/src/app/state/typingMembers.ts b/src/app/state/typingMembers.ts index b87817d1..c77c91be 100644 --- a/src/app/state/typingMembers.ts +++ b/src/app/state/typingMembers.ts @@ -23,7 +23,11 @@ export type IRoomIdToTypingMembersAction = }; const baseRoomIdToTypingMembersAtom = atom(new Map()); -export const roomIdToTypingMembersAtom = atom( +export const roomIdToTypingMembersAtom = atom< + IRoomIdToTypingMembers, + [IRoomIdToTypingMembersAction], + undefined +>( (get) => get(baseRoomIdToTypingMembersAtom), (get, set, action) => { const roomIdToTypingMembers = get(baseRoomIdToTypingMembersAtom); diff --git a/src/app/state/upload.ts b/src/app/state/upload.ts index d92b93d3..13869afb 100644 --- a/src/app/state/upload.ts +++ b/src/app/state/upload.ts @@ -57,7 +57,7 @@ export const createUploadAtom = (file: TUploadContent) => { file, status: UploadStatus.Idle, }); - return atom( + return atom( (get) => get(baseUploadAtom), (get, set, update) => { const uploadState = get(baseUploadAtom); diff --git a/src/app/state/utils.ts b/src/app/state/utils.ts index 355c9411..4c4caa5c 100644 --- a/src/app/state/utils.ts +++ b/src/app/state/utils.ts @@ -15,7 +15,7 @@ export type RoomsAction = export const useBindRoomsWithMembershipsAtom = ( mx: MatrixClient, - roomsAtom: WritableAtom, + roomsAtom: WritableAtom, memberships: Membership[] ) => { const setRoomsAtom = useSetAtom(roomsAtom); diff --git a/src/app/state/utils/atomWithLocalStorage.ts b/src/app/state/utils/atomWithLocalStorage.ts new file mode 100644 index 00000000..f17d3a3d --- /dev/null +++ b/src/app/state/utils/atomWithLocalStorage.ts @@ -0,0 +1,51 @@ +import { atom } from 'jotai'; + +export const getLocalStorageItem = (key: string, defaultValue: T): T => { + const item = localStorage.getItem(key); + if (item === null) return defaultValue; + if (item === 'undefined') return undefined as T; + try { + return JSON.parse(item) as T; + } catch { + return defaultValue; + } +}; + +export const setLocalStorageItem = (key: string, value: T) => { + localStorage.setItem(key, JSON.stringify(value)); +}; + +export type GetLocalStorageItem = (key: string) => T; +export type SetLocalStorageItem = (key: string, value: T) => void; + +export const atomWithLocalStorage = ( + key: string, + getItem: GetLocalStorageItem, + setItem: SetLocalStorageItem +) => { + const value = getItem(key); + + const baseAtom = atom(value); + + baseAtom.onMount = (setAtom) => { + const handleChange = (evt: StorageEvent) => { + if (evt.key !== key) return; + setAtom(getItem(key)); + }; + + window.addEventListener('storage', handleChange); + return () => { + window.removeEventListener('storage', handleChange); + }; + }; + + const localStorageAtom = atom( + (get) => get(baseAtom), + (get, set, newValue) => { + set(baseAtom, newValue); + setItem(key, newValue); + } + ); + + return localStorageAtom; +}; diff --git a/src/app/styles/Patterns.css.ts b/src/app/styles/Patterns.css.ts new file mode 100644 index 00000000..e4559416 --- /dev/null +++ b/src/app/styles/Patterns.css.ts @@ -0,0 +1,9 @@ +import { style } from '@vanilla-extract/css'; +import { color, toRem } from 'folds'; + +export const BackgroundDotPattern = style({ + backgroundImage: `radial-gradient(${color.Background.ContainerActive} ${toRem(2)}, ${ + color.Background.Container + } ${toRem(2)})`, + backgroundSize: `${toRem(40)} ${toRem(40)}`, +}); diff --git a/src/app/utils/common.ts b/src/app/utils/common.ts index e007f222..5cbe3806 100644 --- a/src/app/utils/common.ts +++ b/src/app/utils/common.ts @@ -44,6 +44,17 @@ export const fulfilledPromiseSettledResult = (prs: PromiseSettledResult[]) return values; }, []); +export const promiseFulfilledResult = ( + settledResult: PromiseSettledResult +): T | undefined => { + if (settledResult.status === 'fulfilled') return settledResult.value; + return undefined; +}; +export const promiseRejectedResult = (settledResult: PromiseSettledResult): any => { + if (settledResult.status === 'rejected') return settledResult.reason; + return undefined; +}; + export const binarySearch = (items: T[], match: (item: T) => -1 | 0 | 1): T | undefined => { const search = (start: number, end: number): T | undefined => { if (start > end) return undefined; @@ -77,3 +88,10 @@ export const parseGeoUri = (location: string) => { longitude, }; }; + +const START_SLASHES_REG = /^\/+/g; +const END_SLASHES_REG = /\/+$/g; +export const trimLeadingSlash = (str: string): string => str.replace(START_SLASHES_REG, ''); +export const trimTrailingSlash = (str: string): string => str.replace(END_SLASHES_REG, ''); + +export const trimSlash = (str: string): string => trimLeadingSlash(trimTrailingSlash(str)); diff --git a/src/app/utils/matrix-uia.ts b/src/app/utils/matrix-uia.ts new file mode 100644 index 00000000..15c5799c --- /dev/null +++ b/src/app/utils/matrix-uia.ts @@ -0,0 +1,84 @@ +import { AuthType, IAuthData, UIAFlow } from 'matrix-js-sdk'; + +export const getSupportedUIAFlows = (uiaFlows: UIAFlow[], supportedStages: string[]): UIAFlow[] => { + const supportedUIAFlows = uiaFlows.filter((flow) => + flow.stages.every((stage) => supportedStages.includes(stage)) + ); + + return supportedUIAFlows; +}; + +export const getUIACompleted = (authData: IAuthData): string[] => { + const completed = authData.completed ?? []; + return completed; +}; + +export type UIAParams = Record>; +export const getUIAParams = (authData: IAuthData): UIAParams => { + const params = authData.params ?? {}; + return params; +}; + +export const getUIASession = (authData: IAuthData): string | undefined => { + const session = authData.session ?? undefined; + return session; +}; + +export const getUIAErrorCode = (authData: IAuthData): string | undefined => { + const errorCode = + 'errcode' in authData && typeof authData.errcode === 'string' ? authData.errcode : undefined; + + return errorCode; +}; + +export const getUIAError = (authData: IAuthData): string | undefined => { + const errorCode = + 'error' in authData && typeof authData.error === 'string' ? authData.error : undefined; + + return errorCode; +}; + +export const getUIAFlowForStages = (uiaFlows: UIAFlow[], stages: string[]): UIAFlow | undefined => { + const matchedFlows = uiaFlows + .filter((flow) => { + if (flow.stages.length < stages.length) return false; + if (flow.stages.length > stages.length) { + // As a valid flow can also have m.login.dummy type, + // we will pick one extra length flow only if it has dummy + if (flow.stages.length > stages.length + 1) return false; + if (stages.includes(AuthType.Dummy)) return false; + if (flow.stages.includes(AuthType.Dummy)) return true; + return false; + } + return true; + }) + .filter((flow) => stages.every((stage) => flow.stages.includes(stage))); + + if (matchedFlows.length === 0) return undefined; + + matchedFlows.sort((a, b) => a.stages.length - b.stages.length); + return matchedFlows[0]; +}; + +export const hasStageInFlows = (uiaFlows: UIAFlow[], stage: string) => + uiaFlows.some((flow) => flow.stages.includes(stage)); + +export const requiredStageInFlows = (uiaFlows: UIAFlow[], stage: string) => + uiaFlows.every((flow) => flow.stages.includes(stage)); + +export const getLoginTermUrl = (params: UIAParams): string | undefined => { + const terms = params[AuthType.Terms]; + if (terms && 'policies' in terms && typeof terms.policies === 'object') { + if (terms.policies === null) return undefined; + if ('privacy_policy' in terms.policies && typeof terms.policies.privacy_policy === 'object') { + if (terms.policies.privacy_policy === null) return undefined; + const langToPolicy = terms.policies.privacy_policy as Record; + const url = langToPolicy.en?.url; + if (typeof url === 'string') return url; + + const firstKey = Object.keys(langToPolicy)[0]; + return langToPolicy[firstKey]?.url; + } + } + return undefined; +}; diff --git a/src/app/utils/regex.ts b/src/app/utils/regex.ts index 5188bef0..281f1200 100644 --- a/src/app/utils/regex.ts +++ b/src/app/utils/regex.ts @@ -1,5 +1,8 @@ export const HTTP_URL_PATTERN = `https?:\\/\\/(?:www\\.)?(?:[^\\s)]*)(?()[\]\\.,;:\s@\\"]+(\.[^<>()[\]\\.,;:\s@\\"]+)*)|(\\".+\\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + export const URL_NEG_LB = '(? getSecret(cons.secretKey.ACCESS_TOKEN) !== null; - -const secret = { - accessToken: getSecret(cons.secretKey.ACCESS_TOKEN), - deviceId: getSecret(cons.secretKey.DEVICE_ID), - userId: getSecret(cons.secretKey.USER_ID), - baseUrl: getSecret(cons.secretKey.BASE_URL), -}; - -export { - isAuthenticated, - secret, -}; diff --git a/src/client/state/auth.ts b/src/client/state/auth.ts new file mode 100644 index 00000000..9536a927 --- /dev/null +++ b/src/client/state/auth.ts @@ -0,0 +1,12 @@ +import cons from './cons'; + +const isAuthenticated = () => localStorage.getItem(cons.secretKey.ACCESS_TOKEN) !== null; + +const getSecret = () => ({ + accessToken: localStorage.getItem(cons.secretKey.ACCESS_TOKEN), + deviceId: localStorage.getItem(cons.secretKey.DEVICE_ID), + userId: localStorage.getItem(cons.secretKey.USER_ID), + baseUrl: localStorage.getItem(cons.secretKey.BASE_URL), +}); + +export { isAuthenticated, getSecret }; diff --git a/src/ext.d.ts b/src/ext.d.ts index 5593b6e7..72acc587 100644 --- a/src/ext.d.ts +++ b/src/ext.d.ts @@ -1,3 +1,5 @@ +/// + declare module 'browser-encrypt-attachment' { export interface EncryptedAttachmentInfo { v: string; @@ -26,3 +28,8 @@ declare module 'browser-encrypt-attachment' { info: EncryptedAttachmentInfo ): Promise; } + +declare module '*.svg' { + const content: string; + export default content; +} diff --git a/src/index.jsx b/src/index.tsx similarity index 57% rename from src/index.jsx rename to src/index.tsx index a8a76570..1d864203 100644 --- a/src/index.jsx +++ b/src/index.tsx @@ -1,6 +1,6 @@ /* eslint-disable import/first */ import React from 'react'; -import ReactDom from 'react-dom'; +import { createRoot } from 'react-dom/client'; import { enableMapSet } from 'immer'; import '@fontsource/inter/variable.css'; import 'folds/dist/style.css'; @@ -15,7 +15,18 @@ import settings from './client/state/settings'; import App from './app/pages/App'; document.body.classList.add(configClass, varsClass); - settings.applyTheme(); -ReactDom.render(, document.getElementById('root')); +const mountApp = () => { + const rootContainer = document.getElementById('root'); + + if (rootContainer === null) { + console.error('Root container element not found!'); + return; + } + + const root = createRoot(rootContainer); + root.render(); +}; + +mountApp(); diff --git a/src/types/utils.ts b/src/types/utils.ts new file mode 100644 index 00000000..353ace6e --- /dev/null +++ b/src/types/utils.ts @@ -0,0 +1,3 @@ +export type WithRequiredProp = Type & { + [Property in Key]-?: Type[Property]; +}; diff --git a/tsconfig.json b/tsconfig.json index d2f1e8a1..60ff1853 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "strict": true, "esModuleInterop": true, "moduleResolution": "Node", + "resolveJsonModule": true, "outDir": "dist", "skipLibCheck": true }, diff --git a/vite.config.js b/vite.config.js index 83573398..20c7765c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -5,7 +5,8 @@ import { viteStaticCopy } from 'vite-plugin-static-copy'; import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import inject from '@rollup/plugin-inject'; -import { svgLoader } from './viteSvgLoader'; +import { svgLoader } from './viteSvgLoader' +import buildConfig from "./build.config" const copyFiles = { targets: [ @@ -18,7 +19,7 @@ const copyFiles = { dest: '', }, { - src: '_redirects', + src: 'netlify.toml', dest: '', }, { @@ -39,7 +40,7 @@ const copyFiles = { export default defineConfig({ appType: 'spa', publicDir: false, - base: "", + base: buildConfig.base, server: { port: 8080, host: true, From ef2733df4803aeedd6ff34832c62144cc6de0ca0 Mon Sep 17 00:00:00 2001 From: aceArt-GmbH <33117017+aceArt-GmbH@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:05:50 +0100 Subject: [PATCH 529/824] Load assets from relative path (#1588) --- public/manifest.json | 20 ++++++++++---------- src/app/plugins/pdfjs-dist.ts | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index f1d4a882..acdcd004 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -6,52 +6,52 @@ "lang": "en-US", "display": "standalone", "orientation": "portrait", - "start_url": "/", + "start_url": "./", "background_color": "#fff", "theme_color": "#fff", "icons": [ { - "src": "/public/android/android-chrome-36x36.png", + "src": "./public/android/android-chrome-36x36.png", "sizes": "36x36", "type": "image/png" }, { - "src": "/public/android/android-chrome-48x48.png", + "src": "./public/android/android-chrome-48x48.png", "sizes": "48x48", "type": "image/png" }, { - "src": "/public/android/android-chrome-72x72.png", + "src": "./public/android/android-chrome-72x72.png", "sizes": "72x72", "type": "image/png" }, { - "src": "/public/android/android-chrome-96x96.png", + "src": "./public/android/android-chrome-96x96.png", "sizes": "96x96", "type": "image/png" }, { - "src": "/public/android/android-chrome-144x144.png", + "src": "./public/android/android-chrome-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "/public/android/android-chrome-192x192.png", + "src": "./public/android/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/public/android/android-chrome-256x256.png", + "src": "./public/android/android-chrome-256x256.png", "sizes": "256x256", "type": "image/png" }, { - "src": "/public/android/android-chrome-384x384.png", + "src": "./public/android/android-chrome-384x384.png", "sizes": "384x384", "type": "image/png" }, { - "src": "/public/android/android-chrome-512x512.png", + "src": "./public/android/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } diff --git a/src/app/plugins/pdfjs-dist.ts b/src/app/plugins/pdfjs-dist.ts index ccdef5e5..5412ea45 100644 --- a/src/app/plugins/pdfjs-dist.ts +++ b/src/app/plugins/pdfjs-dist.ts @@ -7,7 +7,7 @@ export const usePdfJSLoader = () => useAsyncCallback( useCallback(async () => { const pdf = await import('pdfjs-dist'); - pdf.GlobalWorkerOptions.workerSrc = '/pdf.worker.min.js'; + pdf.GlobalWorkerOptions.workerSrc = 'pdf.worker.min.js'; return pdf; }, []) ); From 983d533452b337b4dc4c9e496a08791193b2818f Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:06:55 +1100 Subject: [PATCH 530/824] feat: check IndexedDB support (#1630) * check indexed db support and display message * fix typo --- src/app/pages/App.tsx | 31 +++++++++++++------------ src/app/pages/FeatureCheck.tsx | 42 ++++++++++++++++++++++++++++++++++ src/app/utils/featureCheck.ts | 21 +++++++++++++++++ 3 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 src/app/pages/FeatureCheck.tsx create mode 100644 src/app/utils/featureCheck.ts diff --git a/src/app/pages/App.tsx b/src/app/pages/App.tsx index 6cefe999..62c173f9 100644 --- a/src/app/pages/App.tsx +++ b/src/app/pages/App.tsx @@ -17,6 +17,7 @@ import { isAuthenticated } from '../../client/state/auth'; import Client from '../templates/client/Client'; import { getLoginPath } from './pathUtils'; import { ConfigConfigError, ConfigConfigLoading } from './ConfigConfig'; +import { FeatureCheck } from './FeatureCheck'; const createRouter = (clientConfig: ClientConfig) => { const { hashRouter } = clientConfig; @@ -62,20 +63,22 @@ const createRouter = (clientConfig: ClientConfig) => { // TODO: app crash boundary function App() { return ( - } - error={(err, retry, ignore) => ( - - )} - > - {(clientConfig) => ( - - - - - - )} - + + } + error={(err, retry, ignore) => ( + + )} + > + {(clientConfig) => ( + + + + + + )} + + ); } diff --git a/src/app/pages/FeatureCheck.tsx b/src/app/pages/FeatureCheck.tsx new file mode 100644 index 00000000..abb366a8 --- /dev/null +++ b/src/app/pages/FeatureCheck.tsx @@ -0,0 +1,42 @@ +import React, { ReactNode, useEffect } from 'react'; +import { Box, Dialog, Text, config } from 'folds'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { checkIndexedDBSupport } from '../utils/featureCheck'; +import { SplashScreen } from '../components/splash-screen'; + +export function FeatureCheck({ children }: { children: ReactNode }) { + const [idbSupportState, checkIDBSupport] = useAsyncCallback(checkIndexedDBSupport); + + useEffect(() => { + checkIDBSupport(); + }, [checkIDBSupport]); + + if (idbSupportState.status === AsyncStatus.Success && idbSupportState.data === false) { + return ( + + + + + Missing Browser Feature + + No IndexedDB support found. This application requires IndexedDB to store session + data locally. Please make sure your browser support IndexedDB and have it enabled. + + + + What is IndexedDB? + + + + + + + ); + } + + return children; +} diff --git a/src/app/utils/featureCheck.ts b/src/app/utils/featureCheck.ts new file mode 100644 index 00000000..a9474c31 --- /dev/null +++ b/src/app/utils/featureCheck.ts @@ -0,0 +1,21 @@ +export const checkIndexedDBSupport = async (): Promise => { + const ts = new Date().getTime(); + const dbName = `checkIndexedDBSupport-${ts}`; + return new Promise((resolve) => { + let db; + try { + db = indexedDB.open(dbName); + } catch { + resolve(false); + return; + } + db.onsuccess = () => { + resolve(true); + indexedDB.deleteDatabase(dbName); + }; + db.onerror = () => { + resolve(false); + indexedDB.deleteDatabase(dbName); + }; + }); +}; From 689adde8ae148d2de76bab0d11d7e0e8f35b7439 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:07:22 +1100 Subject: [PATCH 531/824] fix: login with sso when app using hash router (#1631) * fix login with sso when app using hash router * disable hash router --- src/app/pages/auth/login/Login.tsx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx index 29a7b0ce..901b19cb 100644 --- a/src/app/pages/auth/login/Login.tsx +++ b/src/app/pages/auth/login/Login.tsx @@ -8,9 +8,20 @@ import { PasswordLoginForm } from './PasswordLoginForm'; import { SSOLogin } from '../SSOLogin'; import { TokenLogin } from './TokenLogin'; import { OrDivider } from '../OrDivider'; -import { getLoginPath, getRegisterPath } from '../../pathUtils'; +import { getLoginPath, getRegisterPath, withSearchParam } from '../../pathUtils'; import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin'; import { LoginPathSearchParams } from '../../paths'; +import { useClientConfig } from '../../../hooks/useClientConfig'; + +const getLoginTokenSearchParam = () => { + // when using hasRouter query params in existing route + // gets ignored by react-router, so we need to read it ourself + // we only need to read loginToken as it's the only param that + // is provided by external entity. example: SSO login + const parmas = new URLSearchParams(window.location.search); + const loginToken = parmas.get('loginToken'); + return loginToken ?? undefined; +}; const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => ({ username: searchParams.get('username') ?? undefined, @@ -20,10 +31,21 @@ const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchPar export function Login() { const server = useAuthServer(); + const { hashRouter } = useClientConfig(); const { loginFlows } = useAuthFlows(); const [searchParams] = useSearchParams(); const loginSearchParams = getLoginSearchParams(searchParams); const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server)); + const loginTokenForHashRouter = getLoginTokenSearchParam(); + const absoluteLoginPath = usePathWithOrigin(getLoginPath(server)); + + if (hashRouter?.enabled && loginTokenForHashRouter) { + window.location.replace( + withSearchParam(absoluteLoginPath, { + loginToken: loginTokenForHashRouter, + }) + ); + } const parsedFlows = useParsedLoginFlows(loginFlows.flows); From b0796f72d3d1c746825e728ff0e5369f78ed1e1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:57:56 +1100 Subject: [PATCH 532/824] fix(deps): update dependency katex to v0.16.10 [security] (#1654) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index fba4072e..d3578935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "katex": "0.16.4", + "katex": "0.16.10", "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", @@ -4005,6 +4005,14 @@ "color-support": "bin.js" } }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -6108,28 +6116,20 @@ "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" }, "node_modules/katex": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", - "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], "dependencies": { - "commander": "^8.0.0" + "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", diff --git a/package.json b/package.json index 56e7b8c0..84b1868d 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "katex": "0.16.4", + "katex": "0.16.10", "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", From 372d4d5c3455b5c61e9a82ec8d64780e3d9caf49 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 15:18:29 +1000 Subject: [PATCH 533/824] chore(deps): update dependency vite to v5.0.13 [security] (#1680) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 207 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 113 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index d3578935..5b3ebdc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "5.0.8", + "vite": "5.0.13", "vite-plugin-static-copy": "0.13.0" }, "engines": { @@ -505,6 +505,22 @@ "esbuild": "*" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.16.9", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.9.tgz", @@ -8105,9 +8121,9 @@ } }, "node_modules/vite": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.8.tgz", - "integrity": "sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.13.tgz", + "integrity": "sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -8213,9 +8229,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -8229,9 +8245,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -8245,9 +8261,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -8261,9 +8277,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -8277,9 +8293,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -8293,9 +8309,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -8309,9 +8325,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -8325,9 +8341,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -8341,9 +8357,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -8357,9 +8373,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -8373,9 +8389,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -8389,9 +8405,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -8405,9 +8421,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -8421,9 +8437,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -8437,9 +8453,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -8453,9 +8469,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -8469,9 +8485,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -8485,9 +8501,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -8501,9 +8517,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -8517,9 +8533,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -8533,9 +8549,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -8549,9 +8565,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -8565,9 +8581,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -8577,28 +8593,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/warning": { diff --git a/package.json b/package.json index 84b1868d..7660b174 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", - "vite": "5.0.8", + "vite": "5.0.13", "vite-plugin-static-copy": "0.13.0" } } From 8c5a1d15cb899cbac78641d5027390c1e40f9747 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:12:52 +0530 Subject: [PATCH 534/824] fix negative audio duration info crash react-range (#1701) --- src/app/organisms/room/message/AudioContent.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/organisms/room/message/AudioContent.tsx b/src/app/organisms/room/message/AudioContent.tsx index eae5447b..83e5dc01 100644 --- a/src/app/organisms/room/message/AudioContent.tsx +++ b/src/app/organisms/room/message/AudioContent.tsx @@ -45,7 +45,8 @@ export const AudioContent = as<'div', AudioContentProps>( const [currentTime, setCurrentTime] = useState(0); // duration in seconds. (NOTE: info.duration is in milliseconds) - const [duration, setDuration] = useState((info.duration ?? 0) / 1000); + const infoDuration = info.duration ?? 0; + const [duration, setDuration] = useState((infoDuration >= 0 ? infoDuration : 0) / 1000); const getAudioRef = useCallback(() => audioRef.current, []); const { loading } = useMediaLoading(getAudioRef); From 743e916d12ba14cba5b2ee75cc02a7a65dd37db1 Mon Sep 17 00:00:00 2001 From: Arnaldo Gabriel <5076526+agmm@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:44:32 -0400 Subject: [PATCH 535/824] Fix placement of emoji/sticker buttons (#1693) --- src/app/components/emoji-board/EmojiBoard.tsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 5452722f..408ce85d 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -174,18 +174,6 @@ function EmojiBoardTabs({ }) { return ( - onTabChange(EmojiBoardTab.Emoji)} - > - - Emoji - - + onTabChange(EmojiBoardTab.Emoji)} + > + + Emoji + + ); } From 3025133d18057075f34d0b7b7f20a75b55924bb8 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Thu, 25 Apr 2024 00:31:01 +1000 Subject: [PATCH 536/824] Update node to latest LTS (#1687) * Update node to latest LTS * Update node in Dockerfile --- .github/workflows/build-pull-request.yml | 6 +++--- .github/workflows/netlify-dev.yml | 10 +++++----- .github/workflows/prod-deploy.yml | 8 ++++---- Dockerfile | 2 +- README.md | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index f2f93feb..5346a762 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -16,13 +16,13 @@ jobs: - name: Setup node uses: actions/setup-node@v3.8.1 with: - node-version: 18.12.1 - cache: "npm" + node-version: 20.12.2 + cache: 'npm' - name: Install dependencies run: npm ci - name: Build app env: - NODE_OPTIONS: "--max_old_space_size=4096" + NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Upload artifact uses: actions/upload-artifact@v3.1.2 diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 411b6e3e..c3de8811 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -3,7 +3,7 @@ name: Deploy to Netlify (dev) on: push: branches: - - dev + - dev jobs: deploy-to-netlify: @@ -15,19 +15,19 @@ jobs: - name: Setup node uses: actions/setup-node@v3.8.1 with: - node-version: 18.12.1 - cache: "npm" + node-version: 20.12.2 + cache: 'npm' - name: Install dependencies run: npm ci - name: Build app env: - NODE_OPTIONS: "--max_old_space_size=4096" + NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Deploy to Netlify uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 with: publish-dir: dist - deploy-message: "Dev deploy ${{ github.sha }}" + deploy-message: 'Dev deploy ${{ github.sha }}' enable-commit-comment: false github-token: ${{ secrets.GITHUB_TOKEN }} production-deploy: true diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 63fc342c..83e6ed8f 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -14,19 +14,19 @@ jobs: - name: Setup node uses: actions/setup-node@v3.8.1 with: - node-version: 18.12.1 - cache: "npm" + node-version: 20.12.2 + cache: 'npm' - name: Install dependencies run: npm ci - name: Build app env: - NODE_OPTIONS: "--max_old_space_size=4096" + NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Deploy to Netlify uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 with: publish-dir: dist - deploy-message: "Prod deploy ${{ github.ref_name }}" + deploy-message: 'Prod deploy ${{ github.ref_name }}' enable-commit-comment: false github-token: ${{ secrets.GITHUB_TOKEN }} production-deploy: true diff --git a/Dockerfile b/Dockerfile index da04492c..b0d2a935 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Builder -FROM node:18.12.1-alpine3.15 as builder +FROM node:20.12.2-alpine3.18 as builder WORKDIR /src diff --git a/README.md b/README.md index 0910dfbb..0fc928b6 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ UeGsouhyuITLwEhScounZDqop+Dx ## Local development > We recommend using a version manager as versions change very quickly. You will likely need to switch -between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Also recommended nodejs version Hydrogen LTS (v18). +between multiple Node.js versions based on the needs of different projects you're working on. [NVM on windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) on Windows and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are pretty good choices. Recommended nodejs version is Iron LTS (v20). Execute the following commands to start a development server: ```sh From a18c2e5be18eb37bdd63a0edb61d1f0faa125605 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 00:32:24 +1000 Subject: [PATCH 537/824] Bump actions/checkout from 3.5.3 to 4.1.3 (#1699) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.3 to 4.1.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.5.3...v4.1.3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 5346a762..72ffd0e4 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: Setup node uses: actions/setup-node@v3.8.1 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 30235157..7d1f2b8d 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: Build Docker image uses: docker/build-push-action@v4.1.1 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index 30d00760..1b116b5a 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index c3de8811..0eb4ed72 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: Setup node uses: actions/setup-node@v3.8.1 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 83e6ed8f..70e40c07 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: Setup node uses: actions/setup-node@v3.8.1 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.3 - name: Set up QEMU uses: docker/setup-qemu-action@v2.2.0 - name: Set up Docker Buildx From b97f410731847a4a82763b76483aa46dae3f6bc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 00:34:04 +1000 Subject: [PATCH 538/824] Bump nginx from 1.25.1-alpine to 1.25.5-alpine (#1700) Bumps nginx from 1.25.1-alpine to 1.25.5-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b0d2a935..6cd3ebf6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm run build ## App -FROM nginx:1.25.1-alpine +FROM nginx:1.25.5-alpine COPY --from=builder /src/dist /app From 1d799185d61f60c22903f55346c92548c862c411 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:26:46 +1000 Subject: [PATCH 539/824] Bump actions/upload-artifact from 3.1.2 to 4.3.3 (#1698) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.2 to 4.3.3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3.1.2...v4.3.3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 72ffd0e4..8163c6af 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -25,7 +25,7 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Upload artifact - uses: actions/upload-artifact@v3.1.2 + uses: actions/upload-artifact@v4.3.3 with: name: preview path: dist @@ -33,7 +33,7 @@ jobs: - name: Save pr number run: echo ${PR_NUMBER} > ./pr.txt - name: Upload pr number - uses: actions/upload-artifact@v3.1.2 + uses: actions/upload-artifact@v4.3.3 with: name: pr path: ./pr.txt From 71b2859440e8f0e95815e790af96284f90641357 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:28:46 +1000 Subject: [PATCH 540/824] Bump docker/setup-qemu-action from 2.2.0 to 3.0.0 (#1662) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.2.0 to 3.0.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2.2.0...v3.0.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 70e40c07..e6de54f9 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.3 - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.7.0 - name: Login to Docker Hub From 2c1e51a8b8caa9dbb1af32f97b50bc692ac7bf63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:30:16 +1000 Subject: [PATCH 541/824] Bump docker/login-action from 2.2.0 to 3.1.0 (#1661) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.2.0 to 3.1.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2.2.0...v3.1.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index e6de54f9..7f24295c 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -72,12 +72,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.7.0 - name: Login to Docker Hub - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.1.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to the Container registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.1.0 with: registry: ghcr.io username: ${{ github.actor }} From ca3535b1a5d3214b22b6d48d30889ea48a89bb3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:31:41 +1000 Subject: [PATCH 542/824] Bump docker/metadata-action from 4.6.0 to 5.5.1 (#1658) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.6.0 to 5.5.1. - [Release notes](https://github.com/docker/metadata-action/releases) - [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md) - [Commits](https://github.com/docker/metadata-action/compare/v4.6.0...v5.5.1) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 7f24295c..35f6d0f2 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -84,7 +84,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v4.6.0 + uses: docker/metadata-action@v5.5.1 with: images: | ${{ secrets.DOCKER_USERNAME }}/cinny From da5ebf7ab36a2c704986b120dd42768373e2eef9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:56:29 +1000 Subject: [PATCH 543/824] Bump actions/setup-node from 3.8.1 to 4.0.2 (#1707) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.8.1 to 4.0.2. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3.8.1...v4.0.2) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 8163c6af..a574c678 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.3 - name: Setup node - uses: actions/setup-node@v3.8.1 + uses: actions/setup-node@v4.0.2 with: node-version: 20.12.2 cache: 'npm' diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 0eb4ed72..7c90aec7 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.3 - name: Setup node - uses: actions/setup-node@v3.8.1 + uses: actions/setup-node@v4.0.2 with: node-version: 20.12.2 cache: 'npm' diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 35f6d0f2..bec41af3 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.3 - name: Setup node - uses: actions/setup-node@v3.8.1 + uses: actions/setup-node@v4.0.2 with: node-version: 20.12.2 cache: 'npm' From 53cd08f0da500f656ce2ee32e132a64d1b78570a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:57:14 +1000 Subject: [PATCH 544/824] Bump dawidd6/action-download-artifact from 2.27.0 to 3.1.4 (#1706) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 2.27.0 to 3.1.4. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/246dbf436b23d7c49e21a7ab8204ca9ecd1fe615...09f2f74827fd3a8607589e5ad7f9398816f540fe) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 12eabbe4..e7399316 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -15,7 +15,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download pr number - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 + uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} @@ -24,7 +24,7 @@ jobs: id: pr run: echo "id=$(> $GITHUB_OUTPUT - name: Download artifact - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 + uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} From d3f97ef93e990f83f2381ecb0597e1d732fd1108 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:57:30 +1000 Subject: [PATCH 545/824] Bump cla-assistant/github-action from 2.3.0 to 2.3.2 (#1705) Bumps [cla-assistant/github-action](https://github.com/cla-assistant/github-action) from 2.3.0 to 2.3.2. - [Release notes](https://github.com/cla-assistant/github-action/releases) - [Commits](https://github.com/cla-assistant/github-action/compare/v2.3.0...v2.3.2) --- updated-dependencies: - dependency-name: cla-assistant/github-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 1b9461b6..259ee514 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -12,7 +12,7 @@ jobs: - name: 'CLA Assistant' if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' # Beta Release - uses: cla-assistant/github-action@v2.3.0 + uses: cla-assistant/github-action@v2.3.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # the below token should have repo scope and must be manually added by you in the repository's secret From ce347a0ff4bd769db2cf7977f618ba75702ff866 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:58:56 +1000 Subject: [PATCH 546/824] Bump docker/build-push-action from 4.1.1 to 5.3.0 (#1704) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.1 to 5.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4.1.1...v5.3.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 7d1f2b8d..f9a6eefe 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.3 - name: Build Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.3.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index bec41af3..56593834 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.3.0 with: context: . platforms: linux/amd64,linux/arm64 From 3ae1e58ff2389d107f8a61442cd179882714887a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:00:52 +1000 Subject: [PATCH 547/824] Bump softprops/action-gh-release from 1 to 2 (#1703) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/de2c0eb89ae2a093876385947365aca7b0e5f844...9d7c94cfd0a1f3ed45544c887983e9fa900f0564) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 56593834..790e0c75 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -52,7 +52,7 @@ jobs: gpg --export | xxd -p echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release - uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 + uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz From b803ce99e3d8d7c2e14f7b3deeae6e0275a5871c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:06:24 +1000 Subject: [PATCH 548/824] Bump nwtgck/actions-netlify from 2.1.0 to 3.0.0 (#1708) Bumps [nwtgck/actions-netlify](https://github.com/nwtgck/actions-netlify) from 2.1.0 to 3.0.0. - [Release notes](https://github.com/nwtgck/actions-netlify/releases) - [Changelog](https://github.com/nwtgck/actions-netlify/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nwtgck/actions-netlify/compare/7a92f00dde8c92a5a9e8385ec2919775f7647352...4cbaf4c08f1a7bfa537d6113472ef4424e4eb654) --- updated-dependencies: - dependency-name: nwtgck/actions-netlify dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index e7399316..0768e185 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -32,7 +32,7 @@ jobs: path: dist - name: Deploy to Netlify id: netlify - uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 + uses: nwtgck/actions-netlify@4cbaf4c08f1a7bfa537d6113472ef4424e4eb654 with: publish-dir: dist deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 7c90aec7..e8371ff9 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -24,7 +24,7 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 + uses: nwtgck/actions-netlify@4cbaf4c08f1a7bfa537d6113472ef4424e4eb654 with: publish-dir: dist deploy-message: 'Dev deploy ${{ github.sha }}' diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 790e0c75..4a355a94 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -23,7 +23,7 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Deploy to Netlify - uses: nwtgck/actions-netlify@7a92f00dde8c92a5a9e8385ec2919775f7647352 + uses: nwtgck/actions-netlify@4cbaf4c08f1a7bfa537d6113472ef4424e4eb654 with: publish-dir: dist deploy-message: 'Prod deploy ${{ github.ref_name }}' From e5b980fbc78a3b1de2e6a7a893601d7f7fcdae05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:06:48 +1000 Subject: [PATCH 549/824] Bump thollander/actions-comment-pull-request from 2.4.3 to 2.5.0 (#1711) Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2.4.3 to 2.5.0. - [Release notes](https://github.com/thollander/actions-comment-pull-request/releases) - [Commits](https://github.com/thollander/actions-comment-pull-request/compare/1d3973dc4b8e1399c0620d3f2b1aa5e795465308...fabd468d3a1a0b97feee5f6b9e499eab0dd903f6) --- updated-dependencies: - dependency-name: thollander/actions-comment-pull-request dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 0768e185..66e648b0 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -45,7 +45,7 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID_PR_CINNY }} timeout-minutes: 1 - name: Comment preview on PR - uses: thollander/actions-comment-pull-request@1d3973dc4b8e1399c0620d3f2b1aa5e795465308 + uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From e8020acabfebd761d2eaa1182d1355339e301760 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:07:12 +1000 Subject: [PATCH 550/824] Bump actions/checkout from 4.1.3 to 4.1.4 (#1709) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.3 to 4.1.4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.3...v4.1.4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index a574c678..f2af6b6f 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index f9a6eefe..adfc7912 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: Build Docker image uses: docker/build-push-action@v5.3.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index 1b116b5a..0d58b254 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index e8371ff9..07c0f50d 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 4a355a94..ac4db5fc 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: Setup node uses: actions/setup-node@v4.0.2 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v4.1.3 + uses: actions/checkout@v4.1.4 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx From 8267990e6f4c1cc9cef1326d1c7769ec527d9319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:07:32 +1000 Subject: [PATCH 551/824] Bump docker/setup-buildx-action from 2.7.0 to 3.3.0 (#1710) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.7.0 to 3.3.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2.7.0...v3.3.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index ac4db5fc..c9cc111f 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.7.0 + uses: docker/setup-buildx-action@v3.3.0 - name: Login to Docker Hub uses: docker/login-action@v3.1.0 with: From 565a6563e16ced2ffdf420fa29b6794045e69da2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 14:06:53 +1000 Subject: [PATCH 552/824] Bump pdfjs-dist from 3.10.111 to 4.2.67 (#1717) * Bump pdfjs-dist from 3.10.111 to 4.2.67 Bumps [pdfjs-dist](https://github.com/mozilla/pdfjs-dist) from 3.10.111 to 4.2.67. - [Commits](https://github.com/mozilla/pdfjs-dist/commits) --- updated-dependencies: - dependency-name: pdfjs-dist dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Fix pdfjs top level await --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- package-lock.json | 277 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 5 +- vite.config.js | 43 +++---- 3 files changed, 290 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b3ebdc0..f6583b06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "linkifyjs": "4.0.2", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", - "pdfjs-dist": "3.10.111", + "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", "prop-types": "15.8.1", "react": "18.2.0", @@ -93,7 +93,8 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", - "vite-plugin-static-copy": "0.13.0" + "vite-plugin-static-copy": "0.13.0", + "vite-plugin-top-level-await": "1.4.1" }, "engines": { "node": ">=16.0.0" @@ -2636,6 +2637,23 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-wasm": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz", @@ -2850,6 +2868,210 @@ "win32" ] }, + "node_modules/@swc/core": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, "node_modules/@swc/helpers": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", @@ -2863,6 +3085,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@swc/types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tanstack/react-virtual": { "version": "3.0.0-beta.54", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.54.tgz", @@ -6834,25 +7065,25 @@ "node": ">=8" } }, - "node_modules/path2d-polyfill": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", - "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "node_modules/path2d": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.0.tgz", + "integrity": "sha512-KdPAykQX6kmLSOO6Jpu2KNcCED7CKjmaBNGGNuctOsG0hgYO1OdYQaan6cYXJiG0WmXOwZZPILPBimu5QAIw3A==", "optional": true, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/pdfjs-dist": { - "version": "3.10.111", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.10.111.tgz", - "integrity": "sha512-+SXXGN/3YTNQSK5Ae7EyqQuR+4IAsNunJq/Us5ByOkRJ45qBXXOwkiWi3RIDU+CyF+ak5eSWXl2FQW2PKBrsRA==", + "version": "4.2.67", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.2.67.tgz", + "integrity": "sha512-rJmuBDFpD7cqC8WIkQUEClyB4UAH05K4AsyewToMTp2gSy3Rrx8c1ydAVqlJlGv3yZSOrhEERQU/4ScQQFlLHA==", "engines": { "node": ">=18" }, "optionalDependencies": { "canvas": "^2.11.2", - "path2d-polyfill": "^2.0.1" + "path2d": "^0.2.0" } }, "node_modules/picocolors": { @@ -8113,9 +8344,13 @@ "optional": true }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -8228,6 +8463,20 @@ "node": ">= 10.0.0" } }, + "node_modules/vite-plugin-top-level-await": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.1.tgz", + "integrity": "sha512-hogbZ6yT7+AqBaV6lK9JRNvJDn4/IJvHLu6ET06arNfo0t2IsyCaon7el9Xa8OumH+ESuq//SDf8xscZFE0rWw==", + "dev": true, + "dependencies": { + "@rollup/plugin-virtual": "^3.0.2", + "@swc/core": "^1.3.100", + "uuid": "^9.0.1" + }, + "peerDependencies": { + "vite": ">=2.8" + } + }, "node_modules/vite/node_modules/@esbuild/android-arm": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", diff --git a/package.json b/package.json index 7660b174..8c35e802 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "linkifyjs": "4.0.2", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", - "pdfjs-dist": "3.10.111", + "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", "prop-types": "15.8.1", "react": "18.2.0", @@ -103,6 +103,7 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", - "vite-plugin-static-copy": "0.13.0" + "vite-plugin-static-copy": "0.13.0", + "vite-plugin-top-level-await": "1.4.1" } } diff --git a/vite.config.js b/vite.config.js index 20c7765c..e6ae956d 100644 --- a/vite.config.js +++ b/vite.config.js @@ -2,11 +2,12 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { wasm } from '@rollup/plugin-wasm'; import { viteStaticCopy } from 'vite-plugin-static-copy'; -import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import inject from '@rollup/plugin-inject'; -import { svgLoader } from './viteSvgLoader' -import buildConfig from "./build.config" +import topLevelAwait from 'vite-plugin-top-level-await'; +import { svgLoader } from './viteSvgLoader'; +import buildConfig from './build.config'; const copyFiles = { targets: [ @@ -35,7 +36,7 @@ const copyFiles = { dest: 'public/', }, ], -} +}; export default defineConfig({ appType: 'spa', @@ -46,6 +47,12 @@ export default defineConfig({ host: true, }, plugins: [ + topLevelAwait({ + // The export name of top-level await promise for each chunk module + promiseExportName: '__tla', + // The function to generate import names of top-level await promise in each chunk module + promiseImportName: (i) => `__tla_${i}`, + }), viteStaticCopy(copyFiles), vanillaExtractPlugin(), svgLoader(), @@ -54,26 +61,24 @@ export default defineConfig({ ], optimizeDeps: { esbuildOptions: { - define: { - global: 'globalThis' - }, - plugins: [ - // Enable esbuild polyfill plugins - NodeGlobalsPolyfillPlugin({ - process: false, - buffer: true, - }), - ] - } + define: { + global: 'globalThis', + }, + plugins: [ + // Enable esbuild polyfill plugins + NodeGlobalsPolyfillPlugin({ + process: false, + buffer: true, + }), + ], + }, }, build: { outDir: 'dist', sourcemap: true, copyPublicDir: false, rollupOptions: { - plugins: [ - inject({ Buffer: ['buffer', 'Buffer'] }) - ] - } + plugins: [inject({ Buffer: ['buffer', 'Buffer'] })], + }, }, }); From 5259f1167908b4ddc193f22c90153287a7575d7f Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 12 May 2024 14:17:41 +1000 Subject: [PATCH 553/824] Remove svg loader as available in Vite by default (#1728) --- package-lock.json | 10 ---------- package.json | 1 - vite.config.js | 2 -- viteSvgLoader.ts | 16 ---------------- 4 files changed, 29 deletions(-) delete mode 100644 viteSvgLoader.ts diff --git a/package-lock.json b/package-lock.json index f6583b06..d8bd7588 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,7 +88,6 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", - "mini-svg-data-uri": "1.4.4", "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", @@ -6643,15 +6642,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", diff --git a/package.json b/package.json index 8c35e802..70dd6b52 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", - "mini-svg-data-uri": "1.4.4", "prettier": "2.8.1", "sass": "1.56.2", "typescript": "4.9.4", diff --git a/vite.config.js b/vite.config.js index e6ae956d..f77abfc5 100644 --- a/vite.config.js +++ b/vite.config.js @@ -6,7 +6,6 @@ import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import inject from '@rollup/plugin-inject'; import topLevelAwait from 'vite-plugin-top-level-await'; -import { svgLoader } from './viteSvgLoader'; import buildConfig from './build.config'; const copyFiles = { @@ -55,7 +54,6 @@ export default defineConfig({ }), viteStaticCopy(copyFiles), vanillaExtractPlugin(), - svgLoader(), wasm(), react(), ], diff --git a/viteSvgLoader.ts b/viteSvgLoader.ts deleted file mode 100644 index a119e3ed..00000000 --- a/viteSvgLoader.ts +++ /dev/null @@ -1,16 +0,0 @@ -import svgToMiniDataURI from 'mini-svg-data-uri'; -import type { Plugin } from 'rollup'; -import fs from 'fs'; - -// TODO: remove this once https://github.com/vitejs/vite/pull/2909 gets merged -export const svgLoader = (): Plugin => ({ - name: 'vite-svg-patch-plugin', - transform: (code, id) => { - if (id.endsWith('.svg')) { - const extractedSvg = fs.readFileSync(id, 'utf8'); - const datauri = svgToMiniDataURI.toSrcset(extractedSvg); - return `export default "${datauri}"`; - } - return code; - }, -}); From f1c4a38a49ca1990d63539bc40d2ec2781704a78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 14:25:07 +1000 Subject: [PATCH 554/824] Update dependency sanitize-html to v2.12.1 [SECURITY] (#1729) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8bd7588..478320ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "react-modal": "3.16.1", "react-range": "1.8.14", "react-router-dom": "6.20.0", - "sanitize-html": "2.8.0", + "sanitize-html": "2.12.1", "slate": "0.94.1", "slate-history": "0.93.0", "slate-react": "0.98.4", @@ -7703,9 +7703,9 @@ } }, "node_modules/sanitize-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz", - "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.12.1.tgz", + "integrity": "sha512-Plh+JAn0UVDpBRP/xEjsk+xDCoOvMBwQUf/K+/cBAVuTbtX8bj2VB7S1sL1dssVpykqp0/KPSesHrqXtokVBpA==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -7716,9 +7716,9 @@ } }, "node_modules/sanitize-html/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==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } diff --git a/package.json b/package.json index 70dd6b52..f7ba24dc 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "react-modal": "3.16.1", "react-range": "1.8.14", "react-router-dom": "6.20.0", - "sanitize-html": "2.8.0", + "sanitize-html": "2.12.1", "slate": "0.94.1", "slate-history": "0.93.0", "slate-react": "0.98.4", From ec65b98874f517d479c2e96f6b24c4feac3f4904 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 14:27:02 +1000 Subject: [PATCH 555/824] Update dependency eslint-plugin-import to v2.29.1 (#1730) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 888 ++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 705 insertions(+), 185 deletions(-) diff --git a/package-lock.json b/package-lock.json index 478320ad..90da965b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,7 +84,7 @@ "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "8.5.0", - "eslint-plugin-import": "2.26.0", + "eslint-plugin-import": "2.29.1", "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", @@ -3835,16 +3835,33 @@ "node": ">=6.0" } }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3863,15 +3880,35 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3882,14 +3919,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3912,6 +3949,28 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3928,6 +3987,21 @@ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/await-to-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz", @@ -4087,13 +4161,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4371,6 +4451,57 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dateformat": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", @@ -4431,12 +4562,30 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4603,36 +4752,57 @@ } }, "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4641,13 +4811,60 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-shim-unscopables": { + "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -4828,13 +5045,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4847,9 +5065,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4873,24 +5091,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4900,12 +5122,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -4920,12 +5142,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", @@ -5460,6 +5676,15 @@ "react-dom": "^17.0.0" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/formik": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", @@ -5549,21 +5774,24 @@ } }, "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 + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5618,27 +5846,33 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5687,6 +5921,22 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5760,12 +6010,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5784,12 +6046,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5804,6 +6066,18 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "optional": true }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -5975,13 +6249,13 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -6004,6 +6278,22 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -6057,12 +6347,27 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6118,9 +6423,9 @@ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -6187,12 +6492,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6228,6 +6536,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6240,6 +6563,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6655,9 +6984,9 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6818,9 +7147,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6836,13 +7165,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -6868,14 +7197,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6884,6 +7214,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", @@ -6898,14 +7242,14 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7093,6 +7437,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", @@ -7513,14 +7866,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7558,12 +7912,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7668,6 +8022,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7689,15 +8061,18 @@ "optional": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7789,6 +8164,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "optional": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -7976,29 +8383,50 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8147,21 +8575,21 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -8230,6 +8658,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -8910,6 +9411,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/package.json b/package.json index f7ba24dc..8c8b87e7 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "eslint": "8.29.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "8.5.0", - "eslint-plugin-import": "2.26.0", + "eslint-plugin-import": "2.29.1", "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", From 215537a26177558c61eb608866ce224953726f58 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 12 May 2024 14:36:35 +1000 Subject: [PATCH 556/824] Fix crash when img without src tag (#1731) --- src/app/utils/sanitize.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts index 48ab0b8d..985c47b1 100644 --- a/src/app/utils/sanitize.ts +++ b/src/app/utils/sanitize.ts @@ -107,7 +107,7 @@ const transformATag: Transformer = (tagName, attribs) => ({ const transformImgTag: Transformer = (tagName, attribs) => { const { src } = attribs; - if (src.startsWith('mxc://') === false) { + if (typeof src === 'string' && src.startsWith('mxc://') === false) { return { tagName: 'a', attribs: { From fe2332ee877e147b954f3b20b23a24d953f527d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 14:39:43 +1000 Subject: [PATCH 557/824] Bump actions/checkout from 4.1.4 to 4.1.5 (#1721) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.4 to 4.1.5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.4...v4.1.5) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index f2af6b6f..e651a344 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index adfc7912..7deb40d1 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: Build Docker image uses: docker/build-push-action@v5.3.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index 0d58b254..dda75783 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 07c0f50d..518d554a 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index c9cc111f..eddae352 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: Setup node uses: actions/setup-node@v4.0.2 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.5 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx From cd5d8e1c20532109a4d5a4738e4d2dfde1e288d7 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 12 May 2024 16:14:34 +1000 Subject: [PATCH 558/824] Fix pdf opening (#1732) --- vite.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vite.config.js b/vite.config.js index f77abfc5..97f40500 100644 --- a/vite.config.js +++ b/vite.config.js @@ -15,8 +15,9 @@ const copyFiles = { dest: '', }, { - src: 'node_modules/pdfjs-dist/build/pdf.worker.min.js', + src: 'node_modules/pdfjs-dist/build/pdf.worker.min.mjs', dest: '', + rename: 'pdf.worker.min.js', }, { src: 'netlify.toml', From 2d6dd3b0b25db632fb1f2d93830ef1e1fff6d64b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 13:33:58 +1000 Subject: [PATCH 559/824] Bump cla-assistant/github-action from 2.3.2 to 2.4.0 (#1735) Bumps [cla-assistant/github-action](https://github.com/cla-assistant/github-action) from 2.3.2 to 2.4.0. - [Release notes](https://github.com/cla-assistant/github-action/releases) - [Commits](https://github.com/cla-assistant/github-action/compare/v2.3.2...v2.4.0) --- updated-dependencies: - dependency-name: cla-assistant/github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 259ee514..2ad3d145 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -12,7 +12,7 @@ jobs: - name: 'CLA Assistant' if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' # Beta Release - uses: cla-assistant/github-action@v2.3.2 + uses: cla-assistant/github-action@v2.4.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # the below token should have repo scope and must be manually added by you in the repository's secret From 5817186129a4776f02ef69d03e5bdc391b98f639 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 13:34:57 +1000 Subject: [PATCH 560/824] Bump softprops/action-gh-release from 2.0.4 to 2.0.5 (#1734) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.4 to 2.0.5. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/9d7c94cfd0a1f3ed45544c887983e9fa900f0564...69320dbe05506a9a39fc8ae11030b214ec2d1f87) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index eddae352..3d2f1094 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -52,7 +52,7 @@ jobs: gpg --export | xxd -p echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release - uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 + uses: softprops/action-gh-release@69320dbe05506a9a39fc8ae11030b214ec2d1f87 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz From 97d02fd7c84457b25a80e18974435ee8f8bb7b86 Mon Sep 17 00:00:00 2001 From: aceArt-GmbH <33117017+aceArt-GmbH@users.noreply.github.com> Date: Tue, 14 May 2024 05:49:04 +0200 Subject: [PATCH 561/824] Scroll tab target into view (#1580) --- src/app/atoms/tabs/Tabs.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/atoms/tabs/Tabs.jsx b/src/app/atoms/tabs/Tabs.jsx index 39800ce3..bcdc8ef7 100644 --- a/src/app/atoms/tabs/Tabs.jsx +++ b/src/app/atoms/tabs/Tabs.jsx @@ -41,8 +41,9 @@ TabItem.propTypes = { function Tabs({ items, defaultSelected, onSelect }) { const [selectedItem, setSelectedItem] = useState(items[defaultSelected]); - const handleTabSelection = (item, index) => { + const handleTabSelection = (item, index, target) => { if (selectedItem === item) return; + target.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' }); setSelectedItem(item); onSelect(item, index); }; @@ -57,7 +58,7 @@ function Tabs({ items, defaultSelected, onSelect }) { selected={selectedItem.text === item.text} iconSrc={item.iconSrc} disabled={item.disabled} - onClick={() => handleTabSelection(item, index)} + onClick={(e) => handleTabSelection(item, index, e.currentTarget)} > {item.text} From 76d60b09581f735cc774db4110dba8ee02920902 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 14:01:45 +1000 Subject: [PATCH 562/824] Bump vite-plugin-static-copy from 0.13.0 to 1.0.4 (#1722) * Bump vite-plugin-static-copy from 0.13.0 to 1.0.4 Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 0.13.0 to 1.0.4. - [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases) - [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md) - [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/v0.13.0...vite-plugin-static-copy@1.0.4) --- updated-dependencies: - dependency-name: vite-plugin-static-copy dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Change type to module --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- package-lock.json | 12 ++++++------ package.json | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90da965b..2eec2912 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", - "vite-plugin-static-copy": "0.13.0", + "vite-plugin-static-copy": "1.0.4", "vite-plugin-top-level-await": "1.4.1" }, "engines": { @@ -8902,9 +8902,9 @@ } }, "node_modules/vite-plugin-static-copy": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-0.13.0.tgz", - "integrity": "sha512-cln+fvKMgwNBjxQ59QVblmExZrc9gGEdRmfqcPOOGpxT5KInfpkGMvmK4L+kCAeHHSSGNU1bM7BA9PQgaAJc6g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.4.tgz", + "integrity": "sha512-UtyOttgoeotSCwmBugsEZCZJZcIpjE9NGO7jlZ9OeedYpBueBdspD8waRZrjE+yQLH6qGNU2CvYB2FILviCQjg==", "dev": true, "dependencies": { "chokidar": "^3.5.3", @@ -8913,10 +8913,10 @@ "picocolors": "^1.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^5.0.0" } }, "node_modules/vite-plugin-static-copy/node_modules/fs-extra": { diff --git a/package.json b/package.json index 8c8b87e7..44c28d34 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "3.2.0", "description": "Yet another matrix client", "main": "index.js", + "type": "module", "engines": { "node": ">=16.0.0" }, @@ -102,7 +103,7 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", - "vite-plugin-static-copy": "0.13.0", + "vite-plugin-static-copy": "1.0.4", "vite-plugin-top-level-await": "1.4.1" } } From e15b16b19b7c95a4053dbbfa5ed1e7dffcc5320f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 14:18:40 +1000 Subject: [PATCH 563/824] Bump nginx from 1.25.5-alpine to 1.26.0-alpine (#1718) Bumps nginx from 1.25.5-alpine to 1.26.0-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6cd3ebf6..f843fbf1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm run build ## App -FROM nginx:1.25.5-alpine +FROM nginx:1.26.0-alpine COPY --from=builder /src/dist /app From 07bfa0cf104608b74be1254b3870b8186b10730e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 21:54:48 +1000 Subject: [PATCH 564/824] --- (#1741) updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index e651a344..133729f7 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 7deb40d1..de29ff35 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: Build Docker image uses: docker/build-push-action@v5.3.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index dda75783..af91698e 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 518d554a..9252e3e4 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 3d2f1094..a203ea34 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: Setup node uses: actions/setup-node@v4.0.2 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v4.1.5 + uses: actions/checkout@v4.1.6 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx From 2b7d8256943c2d2da5089b2626fd038c056672eb Mon Sep 17 00:00:00 2001 From: Majan Paul Date: Wed, 22 May 2024 04:56:44 -0700 Subject: [PATCH 565/824] Ignroe webstorm idea folder (#1638) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 397d2434..1af58a97 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules devAssets .DS_Store +.idea \ No newline at end of file From 4c76a7fd180c56daacae3fc3c01706aa3ea92bd2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Fri, 31 May 2024 19:49:46 +0530 Subject: [PATCH 566/824] URL navigation in interface and other improvements (#1633) * load room on url change * add direct room list * render space room list * fix css syntax error * update scroll virtualizer * render subspaces room list * improve sidebar notification badge perf * add nav category components * add space recursive direct component * use nav category component in home, direct and space room list * add empty home and direct list layout * fix unread room menu ref * add more navigation items in room, direct and space tab * add more navigation * fix unread room menu to links * fix space lobby and search link * add explore navigation section * add notifications navigation menu * redirect to initial path after login * include unsupported room in rooms * move router hooks in hooks/router folder * add featured explore - WIP * load featured room with room summary * fix room card topic line clamp * add react query * load room summary using react query * add join button in room card * add content component * use content component in featured community content * fix content width * add responsive room card grid * fix async callback error status * add room card error button * fix client drawer shrink * add room topic viewer * open room card topic in viewer * fix room topic close btn * add get orphan parent util * add room card error dialog * add view featured room or space btn * refactor orphanParent to orphanParents * WIP - explore server * show space hint in room card * add room type filters * add per page item limit popout * reset scroll on public rooms load * refactor explore ui * refactor public rooms component * reset search on server change * fix typo * add empty featured section info * display user server on top * make server room card view btn clickable * add user server as default redirect for explore path * make home empty btn clickable * add thirdparty instance filter in server explore * remove since param on instance change * add server button in explore menu * rename notifications path to inbox * update react-virtual * Add notification messages inbox - WIP * add scroll top container component * add useInterval hook * add visibility change callback prop to scroll top container component * auto refresh notifications every 10 seconds * make message related component reusable * refactor matrix event renderer hoook * render notification message content * refactor matrix event renderer hook * update sequence card styles * move room navigate hook in global hooks * add open message button in notifications * add mark room as read button in notification group * show error in notification messages * add more featured spaces * render reply in notification messages * make notification message reply clickable * add outline prop for attachments * make old settings dialog viewable * add open featured communities as default config option * add invite count notification badge in sidebar and inbox menu * add element size observer hook * improve element size observer hook props * improve screen size hook * fix room avatar util function * allow Text props in Time component * fix dm room util function * add invitations * add no invites and notification cards * fix inbox tab unread badge visible without invite count * update folds and change inbox icon * memo search param construction * add message search in home * fix default message search order * fix display edited message new content * highlight search text in search messages * fix message search loading * disable log in production * add use space context * add useRoom context * fix space room list * fix inbox tab active state * add hook to get space child room recursive * add search for space * add virtual tile component * virtualize home and directs room list * update nav category component * use virtual tile component in more places * fix message highlight when click on reply twice * virtualize space room list * fix space room list lag issue * update folds * add room nav item component in space room list * use room nav item in home and direct room list * make space categories closable and save it in local storage * show unread room when category is collapsed * make home and direct room list category closable * rename room nav item show avatar prop * fix explore server category text alignment * rename closedRoomCategories to closedNavCategories * add nav category handler hook * save and restore last navigation path on space select * filter space rooms category by activity when it is closed * save and restore home and direct nav path state * save and restore inbox active path on open * save and restore explore tab active path * remove notification badge unread menu * add join room or space before navigate screen * move room component to features folder and add new room header * update folds * add room header menu * fix home room list activity sorting * do not hide selected room item on category closed in home and direct tab * replace old select room/tab call with navigate hook * improve state event hooks * show room card summary for joined rooms * prevent room from opening in wrong tab * only show message sender id on hover in modern layout * revert state event hooks changes * add key prop to room provider components * add welcome page * prevent excessive redirects * fix sidebar style with no spaces * move room settings in popup window * remove invite option from room settings * fix open room list search * add leave room prompt * standardize room and user avatar * fix avatar text size * add new reply layout * rename space hierarchy hook * add room topic hook * add room name hook * add room avatar hook and add direct room avatar util * space lobby - WIP * hide invalid space child event from space hierarchy in lobby * move lobby to features * fix element size observer hook width and height * add lobby header and hero section * add hierarchy room item error and loading state * add first and last child prop in sequence card * redirect to lobby from index path * memo and retry hierarchy room summary error * fix hierarchy room item styles * rename lobby hierarchy item card to room item card * show direct room avatar in space lobby * add hierarchy space item * add space item unknown room join button * fix space hierarchy hook refresh after new space join * change user avatar color and fallback render to user icon * change room avatar fallback to room icon * rename room/user avatar renderInitial prop to renderFallback * add room join and view button in space lobby * make power level api more reusable * fix space hierarchy not updating on child update * add menu to suggest or remove space children * show reply arrow in place of reply bend in message * fix typeerror in search because of wrong js-sdk t.ds * do not refetch hierarchy room summary on window focus * make room/user avatar un-draggable * change welcome page support button copy * drag-and-drop ordering of lobby spaces/rooms - WIP * add ASCIILexicalTable algorithms * fix wrong power level check in lobby items options * fix lobby can drop checks * fix join button error crash * fix reply spacing * fix m direct updated with other account data * add option to open room/space settings from lobby * add option in lobby to add new or existing room/spaces * fix room nav item selected styles * add space children reorder mechanism * fix space child reorder bug * fix hierarchy item sort function * Apply reorder of lobby into room list * add and improve space lobby menu items * add existing spaces menu in lobby * change restricted room allow params when dragging outside space * move featured servers config from homeserver list * removed unused features from space settings * add canonical alias as name fallback in lobby item * fix unreliable unread count update bug * fix after login redirect * fix room card topic hover style * Add dnd and folders in sidebar spaces * fix orphan space not visible in sidebar * fix sso login has mix of icon and button * fix space children not visible in home upon leaving space * recalculate notification on updating any space child * fix user color saturation/lightness * add user color to user avatar * add background colors to room avatar * show 2 length initial in sidebar space avatar * improve link color * add nav button component * open legacy create room and create direct * improve page route structure * handle hash router in path utils * mobile friendly router and navigation * make room header member drawer icon mobile friendly * setup index redirect for inbox and explore server route * add leave space prompt * improve member drawer filter menu * add space context menu * add context menu in home * add leave button in lobby items * render user tab avatar on sidebar * force overwrite netlify - test * netlify test * fix reset-password path without server redirected to login * add message link copy button in message menu * reset unread on sync prepared * fix stuck typing notifications * show typing indication in room nav item * refactor closedNavCategories atom to use userId in store key * refactor closedLobbyCategoriesAtom to include userId in store key * refactor navToActivePathAtom to use userId in storage key * remove unused file * refactor openedSidebarFolderAtom to include userId in storage key * add context menu for sidebar space tab * fix eslint not working * add option to pin/unpin child spaces * add context menu for directs tab * add context menu for direct and home tab * show lock icon for non-public space in header * increase matrix max listener count * wrap lobby add space room in callback hook --- .eslintrc.js => .eslintrc.cjs | 0 config.json | 20 + netlify.toml | 6 +- package-lock.json | 121 +- package.json | 9 +- .../CapabilitiesAndMediaConfigLoader.tsx | 36 + src/app/components/CapabilitiesLoader.tsx | 19 + src/app/components/MediaConfigLoader.tsx | 19 + src/app/components/Pdf-viewer/PdfViewer.tsx | 34 +- src/app/components/RenderMessageContent.tsx | 245 ++++ src/app/components/RoomSummaryLoader.tsx | 90 ++ src/app/components/RoomUnreadProvider.tsx | 24 + .../components/SpaceChildDirectsProvider.tsx | 28 + .../components/SpaceChildRoomsProvider.tsx | 28 + src/app/components/SpecVersionsLoader.tsx | 31 +- src/app/components/editor/Toolbar.tsx | 43 +- .../autocomplete/RoomMentionAutocomplete.tsx | 56 +- .../autocomplete/UserMentionAutocomplete.tsx | 37 +- .../components/event-readers/EventReaders.tsx | 22 +- .../leave-room-prompt/LeaveRoomPrompt.tsx | 106 ++ src/app/components/leave-room-prompt/index.ts | 1 + .../leave-space-prompt/LeaveSpacePrompt.tsx | 106 ++ .../components/leave-space-prompt/index.ts | 1 + .../message/FileHeader.tsx | 2 +- .../components/message/MsgTypeRenderers.tsx | 398 ++++++ src/app/components/message/RenderBody.tsx | 37 + src/app/components/message/Reply.css.ts | 15 +- src/app/components/message/Reply.tsx | 171 +-- src/app/components/message/Time.tsx | 38 +- .../message/content/AudioContent.tsx | 199 +++ .../message/content}/EventContent.tsx | 2 +- .../FallbackContent.tsx} | 0 .../message/content}/FileContent.tsx | 99 +- .../message/content}/ImageContent.tsx | 67 +- .../message/content/ThumbnailContent.tsx | 34 + .../message/content}/VideoContent.tsx | 71 +- src/app/components/message/content/index.ts | 7 + .../components/message/content/style.css.ts | 37 + .../message/content}/util.ts | 0 src/app/components/message/index.ts | 5 +- .../components/message/layout/layout.css.ts | 7 +- src/app/components/nav/NavCategory.tsx | 11 + src/app/components/nav/NavCategoryHeader.tsx | 19 + src/app/components/nav/NavEmptyLayout.tsx | 40 + src/app/components/nav/NavItem.tsx | 33 + src/app/components/nav/NavItemContent.tsx | 10 + src/app/components/nav/NavItemOptions.tsx | 17 + src/app/components/nav/index.ts | 6 + src/app/components/nav/styles.css.ts | 127 ++ src/app/components/page/Page.tsx | 146 +++ src/app/components/page/index.tsx | 1 + src/app/components/page/style.css.ts | 69 ++ .../components/room-avatar/RoomAvatar.css.ts | 14 + src/app/components/room-avatar/RoomAvatar.tsx | 56 + src/app/components/room-avatar/index.ts | 1 + src/app/components/room-card/RoomCard.tsx | 314 +++++ src/app/components/room-card/index.ts | 1 + src/app/components/room-card/style.css.ts | 36 + src/app/components/room-intro/RoomIntro.tsx | 49 +- .../room-topic-viewer/RoomTopicViewer.tsx | 41 + src/app/components/room-topic-viewer/index.ts | 1 + .../components/room-topic-viewer/style.css.ts | 23 + .../ScrollTopContainer.tsx | 39 + .../components/scroll-top-container/index.ts | 1 + .../scroll-top-container/style.css.ts | 20 + .../components/sequence-card/SequenceCard.tsx | 18 + src/app/components/sequence-card/index.ts | 1 + src/app/components/sequence-card/style.css.ts | 52 + src/app/components/sidebar/Sidebar.css.ts | 162 ++- src/app/components/sidebar/SidebarAvatar.tsx | 75 -- src/app/components/sidebar/SidebarContent.tsx | 6 +- src/app/components/sidebar/SidebarItem.tsx | 81 ++ src/app/components/sidebar/index.ts | 2 +- .../typing-indicator/TypingIndicator.css.ts | 7 +- .../typing-indicator/TypingIndicator.tsx | 31 +- .../components/unread-badge/UnreadBadge.tsx | 36 + src/app/components/unread-badge/index.ts | 1 + .../url-preview/UrlPreviewCard.css.tsx | 47 + .../url-preview}/UrlPreviewCard.tsx | 15 +- src/app/components/url-preview/index.ts | 1 + .../components/user-avatar/UserAvatar.css.ts | 14 + src/app/components/user-avatar/UserAvatar.tsx | 40 + src/app/components/user-avatar/index.ts | 1 + .../components/virtualizer/VirtualTile.tsx | 20 + src/app/components/virtualizer/index.ts | 1 + src/app/components/virtualizer/style.css.ts | 11 + src/app/cs-api.ts | 2 +- .../JoinBeforeNavigate.tsx | 61 + .../features/join-before-navigate/index.ts | 1 + src/app/features/lobby/DnD.css.ts | 91 ++ src/app/features/lobby/DnD.tsx | 146 +++ src/app/features/lobby/HierarchyItemMenu.tsx | 306 +++++ src/app/features/lobby/Lobby.tsx | 528 ++++++++ src/app/features/lobby/LobbyHeader.css.ts | 13 + src/app/features/lobby/LobbyHeader.tsx | 214 ++++ src/app/features/lobby/LobbyHero.css.tsx | 15 + src/app/features/lobby/LobbyHero.tsx | 77 ++ src/app/features/lobby/RoomItem.css.ts | 22 + src/app/features/lobby/RoomItem.tsx | 441 +++++++ src/app/features/lobby/SpaceItem.css.ts | 39 + src/app/features/lobby/SpaceItem.tsx | 493 ++++++++ src/app/features/lobby/index.ts | 1 + src/app/features/lobby/style.css.ts | 15 + .../features/message-search/MessageSearch.tsx | 329 +++++ .../features/message-search/SearchFilters.tsx | 413 +++++++ .../features/message-search/SearchInput.tsx | 66 + .../message-search/SearchResultGroup.tsx | 262 ++++ src/app/features/message-search/index.ts | 1 + .../message-search/useMessageSearch.ts | 115 ++ .../room-nav/RoomNavCategoryButton.tsx | 27 + src/app/features/room-nav/RoomNavItem.tsx | 297 +++++ src/app/features/room-nav/index.ts | 2 + src/app/features/room-nav/styles.css.ts | 9 + .../room/CommandAutocomplete.tsx | 0 .../room/MembersDrawer.css.ts | 0 .../room/MembersDrawer.tsx | 174 ++- src/app/features/room/Room.tsx | 33 + .../room/RoomInput.tsx | 122 +- .../room/RoomInputPlaceholder.css.ts | 0 .../room/RoomInputPlaceholder.tsx | 0 .../room/RoomTimeline.css.ts | 0 .../room/RoomTimeline.tsx | 1085 +++++++---------- .../room/RoomTombstone.css.ts | 0 .../room/RoomTombstone.tsx | 8 +- src/app/features/room/RoomView.tsx | 84 ++ .../room/RoomViewFollowing.css.ts | 0 .../room/RoomViewFollowing.tsx | 0 src/app/features/room/RoomViewHeader.css.ts | 10 + src/app/features/room/RoomViewHeader.tsx | 348 ++++++ .../room/RoomViewTyping.css.ts | 0 src/app/features/room/RoomViewTyping.tsx | 121 ++ src/app/features/room/index.ts | 1 + .../room/message/EncryptedContent.tsx | 0 .../room/message/Message.tsx | 247 ++-- .../room/message/MessageEditor.tsx | 57 +- .../room/message/Reactions.tsx | 0 src/app/features/room/message/index.ts | 3 + src/app/features/room/message/styles.css.ts | 50 + .../room/msgContent.ts | 2 +- .../reaction-viewer/ReactionViewer.css.ts | 0 .../room/reaction-viewer/ReactionViewer.tsx | 22 +- .../room/reaction-viewer/index.ts | 0 src/app/hooks/router/useDirectSelected.ts | 22 + src/app/hooks/router/useExploreSelected.ts | 28 + src/app/hooks/router/useHomeSelected.ts | 47 + src/app/hooks/router/useInbox.ts | 36 + src/app/hooks/router/useSelectedRoom.ts | 15 + src/app/hooks/router/useSelectedSpace.ts | 37 + src/app/hooks/useAccountDataCallback.ts | 14 + src/app/hooks/useAsyncCallback.ts | 17 +- src/app/hooks/useCapabilities.ts | 12 + src/app/hooks/useCategoryHandler.ts | 27 + src/app/hooks/useClientConfig.ts | 15 +- src/app/hooks/useCommands.ts | 14 +- src/app/hooks/useElementSizeObserver.ts | 23 + src/app/hooks/useInterval.ts | 24 + src/app/hooks/useJoinedRoomId.ts | 19 + src/app/hooks/useLocalRoomSummary.ts | 44 + src/app/hooks/useMatrixEventRenderer.ts | 81 +- src/app/hooks/useMediaConfig.ts | 16 + src/app/hooks/useNavToActivePathMapper.ts | 18 + src/app/hooks/usePowerLevels.ts | 167 ++- src/app/hooks/useRoom.ts | 12 + src/app/hooks/useRoomMeta.ts | 41 + src/app/hooks/useRoomMsgContentRenderer.ts | 68 -- src/app/hooks/useRoomNavigate.ts | 55 + src/app/hooks/useRoomTypingMembers.ts | 10 + src/app/hooks/useScreenSize.ts | 35 +- src/app/hooks/useSidebarItems.ts | 138 +++ src/app/hooks/useSpace.ts | 17 + src/app/hooks/useSpaceHierarchy.ts | 253 ++++ src/app/hooks/useSyncState.ts | 14 + src/app/hooks/useTypingStatusUpdater.ts | 3 +- .../space-add-existing/SpaceAddExisting.jsx | 175 +-- src/app/organisms/navigation/Drawer.jsx | 12 +- src/app/organisms/navigation/Sidebar1.tsx | 125 -- src/app/organisms/pw/Windows.jsx | 14 +- src/app/organisms/room/Room.scss | 1 + src/app/organisms/room/Room.tsx | 46 - src/app/organisms/room/RoomSettings.jsx | 162 ++- src/app/organisms/room/RoomSettings.scss | 65 +- src/app/organisms/room/RoomView.jsx | 118 -- src/app/organisms/room/RoomViewTyping.tsx | 118 -- .../organisms/room/message/AudioContent.tsx | 194 --- .../organisms/room/message/StickerContent.tsx | 48 - .../organisms/room/message/fileRenderer.tsx | 45 - src/app/organisms/room/message/index.ts | 10 - src/app/organisms/room/message/styles.css.ts | 131 -- src/app/organisms/search/Search.jsx | 30 +- .../space-settings/SpaceSettings.jsx | 79 +- src/app/pages/App.tsx | 101 +- src/app/pages/MobileFriendly.tsx | 44 + src/app/pages/Router.tsx | 269 ++++ src/app/pages/afterLoginRedirectPath.ts | 12 + src/app/pages/auth/AuthLayout.tsx | 17 +- src/app/pages/auth/SSOLogin.tsx | 6 +- src/app/pages/auth/ServerPicker.tsx | 39 +- src/app/pages/auth/login/Login.tsx | 18 +- .../pages/auth/login/PasswordLoginForm.tsx | 38 +- src/app/pages/auth/login/loginUtil.ts | 11 +- src/app/pages/auth/register/Register.tsx | 18 +- src/app/pages/auth/register/registerUtil.ts | 23 +- .../auth/reset-password/ResetPassword.tsx | 21 +- src/app/pages/client/ClientBindAtoms.ts | 14 + .../pages/client/ClientInitStorageAtom.tsx | 38 + src/app/pages/client/ClientLayout.tsx | 15 + src/app/pages/client/ClientRoot.tsx | 87 ++ src/app/pages/client/SidebarNav.tsx | 76 ++ src/app/pages/client/SpecVersions.tsx | 46 + src/app/pages/client/WelcomePage.tsx | 64 + src/app/pages/client/direct/Direct.tsx | 263 ++++ src/app/pages/client/direct/RoomProvider.tsx | 26 + src/app/pages/client/direct/index.ts | 2 + src/app/pages/client/direct/useDirectRooms.ts | 12 + src/app/pages/client/explore/Explore.tsx | 269 ++++ src/app/pages/client/explore/Featured.tsx | 121 ++ src/app/pages/client/explore/Server.tsx | 645 ++++++++++ src/app/pages/client/explore/index.ts | 3 + src/app/pages/client/explore/style.css.ts | 19 + src/app/pages/client/home/Home.tsx | 315 +++++ src/app/pages/client/home/RoomProvider.tsx | 26 + src/app/pages/client/home/Search.tsx | 37 + src/app/pages/client/home/index.ts | 3 + src/app/pages/client/home/useHomeRooms.ts | 14 + src/app/pages/client/inbox/Inbox.tsx | 87 ++ src/app/pages/client/inbox/Invites.tsx | 288 +++++ src/app/pages/client/inbox/Notifications.tsx | 609 +++++++++ src/app/pages/client/inbox/index.ts | 3 + src/app/pages/client/index.ts | 3 + src/app/pages/client/sidebar/DirectTab.tsx | 132 ++ src/app/pages/client/sidebar/ExploreTab.tsx | 64 + src/app/pages/client/sidebar/HomeTab.tsx | 134 ++ src/app/pages/client/sidebar/InboxTab.tsx | 62 + src/app/pages/client/sidebar/SpaceTabs.tsx | 844 +++++++++++++ src/app/pages/client/sidebar/UserTab.tsx | 63 + src/app/pages/client/sidebar/index.ts | 6 + src/app/pages/client/space/RoomProvider.tsx | 37 + src/app/pages/client/space/Search.tsx | 52 + src/app/pages/client/space/Space.tsx | 417 +++++++ src/app/pages/client/space/SpaceProvider.tsx | 30 + src/app/pages/client/space/index.ts | 4 + src/app/pages/pathUtils.ts | 133 +- src/app/pages/paths.ts | 65 + src/app/plugins/millify.ts | 9 + src/app/plugins/pdfjs-dist.ts | 5 +- src/app/plugins/react-custom-html-parser.tsx | 56 +- src/app/state/closedLobbyCategories.ts | 68 ++ src/app/state/closedNavCategories.ts | 68 ++ src/app/state/hooks/closedLobbyCategories.ts | 15 + src/app/state/hooks/closedNavCategories.ts | 15 + src/app/state/hooks/inviteList.ts | 11 +- src/app/state/hooks/navToActivePath.ts | 15 + src/app/state/hooks/openedSidebarFolder.ts | 15 + src/app/state/hooks/roomList.ts | 189 ++- src/app/state/hooks/unread.ts | 46 + src/app/state/hooks/useBindAtoms.ts | 13 +- src/app/state/mDirectList.ts | 10 +- src/app/state/navToActivePath.ts | 66 + src/app/state/openedSidebarFolder.ts | 66 + src/app/state/{ => room-list}/inviteList.ts | 2 +- .../state/{ => room-list}/mutedRoomList.ts | 4 +- src/app/state/{ => room-list}/roomList.ts | 2 +- src/app/state/{ => room-list}/utils.ts | 6 +- src/app/state/{ => room}/roomInputDrafts.ts | 6 +- src/app/state/{ => room}/roomToParents.ts | 8 +- src/app/state/{ => room}/roomToUnread.ts | 94 +- src/app/state/selectedRoom.ts | 3 - src/app/state/selectedTab.ts | 8 - src/app/state/spaceRooms.ts | 54 + src/app/state/tabToRoom.ts | 34 - src/app/state/typingMembers.ts | 133 +- src/app/styles/ContainerColor.css.ts | 33 + src/app/styles/CustomHtml.css.ts | 8 + src/app/templates/client/Client.jsx | 94 +- src/app/templates/client/Client.scss | 3 +- src/app/templates/client/ClientContent.jsx | 2 +- src/app/utils/ASCIILexicalTable.ts | 393 ++++++ src/app/utils/common.ts | 17 + src/app/utils/keyboard.ts | 7 + src/app/utils/matrix.ts | 89 +- src/app/utils/regex.ts | 8 + src/app/utils/room.ts | 61 +- src/app/utils/sort.ts | 59 + src/client/action/navigation.js | 8 +- src/client/event/hotkeys.js | 6 +- src/client/initMatrix.js | 21 +- src/client/state/navigation.js | 12 +- src/index.scss | 40 +- src/types/matrix/room.ts | 22 +- vite.config.js | 6 + 290 files changed, 17447 insertions(+), 3224 deletions(-) rename .eslintrc.js => .eslintrc.cjs (100%) create mode 100644 src/app/components/CapabilitiesAndMediaConfigLoader.tsx create mode 100644 src/app/components/CapabilitiesLoader.tsx create mode 100644 src/app/components/MediaConfigLoader.tsx create mode 100644 src/app/components/RenderMessageContent.tsx create mode 100644 src/app/components/RoomSummaryLoader.tsx create mode 100644 src/app/components/RoomUnreadProvider.tsx create mode 100644 src/app/components/SpaceChildDirectsProvider.tsx create mode 100644 src/app/components/SpaceChildRoomsProvider.tsx create mode 100644 src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx create mode 100644 src/app/components/leave-room-prompt/index.ts create mode 100644 src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx create mode 100644 src/app/components/leave-space-prompt/index.ts rename src/app/{organisms/room => components}/message/FileHeader.tsx (91%) create mode 100644 src/app/components/message/MsgTypeRenderers.tsx create mode 100644 src/app/components/message/RenderBody.tsx create mode 100644 src/app/components/message/content/AudioContent.tsx rename src/app/{organisms/room/message => components/message/content}/EventContent.tsx (93%) rename src/app/components/message/{MessageContentFallback.tsx => content/FallbackContent.tsx} (100%) rename src/app/{organisms/room/message => components/message/content}/FileContent.tsx (76%) rename src/app/{organisms/room/message => components/message/content}/ImageContent.tsx (81%) create mode 100644 src/app/components/message/content/ThumbnailContent.tsx rename src/app/{organisms/room/message => components/message/content}/VideoContent.tsx (77%) create mode 100644 src/app/components/message/content/index.ts create mode 100644 src/app/components/message/content/style.css.ts rename src/app/{organisms/room/message => components/message/content}/util.ts (100%) create mode 100644 src/app/components/nav/NavCategory.tsx create mode 100644 src/app/components/nav/NavCategoryHeader.tsx create mode 100644 src/app/components/nav/NavEmptyLayout.tsx create mode 100644 src/app/components/nav/NavItem.tsx create mode 100644 src/app/components/nav/NavItemContent.tsx create mode 100644 src/app/components/nav/NavItemOptions.tsx create mode 100644 src/app/components/nav/index.ts create mode 100644 src/app/components/nav/styles.css.ts create mode 100644 src/app/components/page/Page.tsx create mode 100644 src/app/components/page/index.tsx create mode 100644 src/app/components/page/style.css.ts create mode 100644 src/app/components/room-avatar/RoomAvatar.css.ts create mode 100644 src/app/components/room-avatar/RoomAvatar.tsx create mode 100644 src/app/components/room-avatar/index.ts create mode 100644 src/app/components/room-card/RoomCard.tsx create mode 100644 src/app/components/room-card/index.ts create mode 100644 src/app/components/room-card/style.css.ts create mode 100644 src/app/components/room-topic-viewer/RoomTopicViewer.tsx create mode 100644 src/app/components/room-topic-viewer/index.ts create mode 100644 src/app/components/room-topic-viewer/style.css.ts create mode 100644 src/app/components/scroll-top-container/ScrollTopContainer.tsx create mode 100644 src/app/components/scroll-top-container/index.ts create mode 100644 src/app/components/scroll-top-container/style.css.ts create mode 100644 src/app/components/sequence-card/SequenceCard.tsx create mode 100644 src/app/components/sequence-card/index.ts create mode 100644 src/app/components/sequence-card/style.css.ts delete mode 100644 src/app/components/sidebar/SidebarAvatar.tsx create mode 100644 src/app/components/sidebar/SidebarItem.tsx create mode 100644 src/app/components/unread-badge/UnreadBadge.tsx create mode 100644 src/app/components/unread-badge/index.ts create mode 100644 src/app/components/url-preview/UrlPreviewCard.css.tsx rename src/app/{organisms/room/message => components/url-preview}/UrlPreviewCard.tsx (94%) create mode 100644 src/app/components/user-avatar/UserAvatar.css.ts create mode 100644 src/app/components/user-avatar/UserAvatar.tsx create mode 100644 src/app/components/user-avatar/index.ts create mode 100644 src/app/components/virtualizer/VirtualTile.tsx create mode 100644 src/app/components/virtualizer/index.ts create mode 100644 src/app/components/virtualizer/style.css.ts create mode 100644 src/app/features/join-before-navigate/JoinBeforeNavigate.tsx create mode 100644 src/app/features/join-before-navigate/index.ts create mode 100644 src/app/features/lobby/DnD.css.ts create mode 100644 src/app/features/lobby/DnD.tsx create mode 100644 src/app/features/lobby/HierarchyItemMenu.tsx create mode 100644 src/app/features/lobby/Lobby.tsx create mode 100644 src/app/features/lobby/LobbyHeader.css.ts create mode 100644 src/app/features/lobby/LobbyHeader.tsx create mode 100644 src/app/features/lobby/LobbyHero.css.tsx create mode 100644 src/app/features/lobby/LobbyHero.tsx create mode 100644 src/app/features/lobby/RoomItem.css.ts create mode 100644 src/app/features/lobby/RoomItem.tsx create mode 100644 src/app/features/lobby/SpaceItem.css.ts create mode 100644 src/app/features/lobby/SpaceItem.tsx create mode 100644 src/app/features/lobby/index.ts create mode 100644 src/app/features/lobby/style.css.ts create mode 100644 src/app/features/message-search/MessageSearch.tsx create mode 100644 src/app/features/message-search/SearchFilters.tsx create mode 100644 src/app/features/message-search/SearchInput.tsx create mode 100644 src/app/features/message-search/SearchResultGroup.tsx create mode 100644 src/app/features/message-search/index.ts create mode 100644 src/app/features/message-search/useMessageSearch.ts create mode 100644 src/app/features/room-nav/RoomNavCategoryButton.tsx create mode 100644 src/app/features/room-nav/RoomNavItem.tsx create mode 100644 src/app/features/room-nav/index.ts create mode 100644 src/app/features/room-nav/styles.css.ts rename src/app/{organisms => features}/room/CommandAutocomplete.tsx (100%) rename src/app/{organisms => features}/room/MembersDrawer.css.ts (100%) rename src/app/{organisms => features}/room/MembersDrawer.tsx (79%) create mode 100644 src/app/features/room/Room.tsx rename src/app/{organisms => features}/room/RoomInput.tsx (85%) rename src/app/{organisms => features}/room/RoomInputPlaceholder.css.ts (100%) rename src/app/{organisms => features}/room/RoomInputPlaceholder.tsx (100%) rename src/app/{organisms => features}/room/RoomTimeline.css.ts (100%) rename src/app/{organisms => features}/room/RoomTimeline.tsx (62%) rename src/app/{organisms => features}/room/RoomTombstone.css.ts (100%) rename src/app/{organisms => features}/room/RoomTombstone.tsx (90%) create mode 100644 src/app/features/room/RoomView.tsx rename src/app/{organisms => features}/room/RoomViewFollowing.css.ts (100%) rename src/app/{organisms => features}/room/RoomViewFollowing.tsx (100%) create mode 100644 src/app/features/room/RoomViewHeader.css.ts create mode 100644 src/app/features/room/RoomViewHeader.tsx rename src/app/{organisms => features}/room/RoomViewTyping.css.ts (100%) create mode 100644 src/app/features/room/RoomViewTyping.tsx create mode 100644 src/app/features/room/index.ts rename src/app/{organisms => features}/room/message/EncryptedContent.tsx (100%) rename src/app/{organisms => features}/room/message/Message.tsx (84%) rename src/app/{organisms => features}/room/message/MessageEditor.tsx (89%) rename src/app/{organisms => features}/room/message/Reactions.tsx (100%) create mode 100644 src/app/features/room/message/index.ts create mode 100644 src/app/features/room/message/styles.css.ts rename src/app/{organisms => features}/room/msgContent.ts (98%) rename src/app/{organisms => features}/room/reaction-viewer/ReactionViewer.css.ts (100%) rename src/app/{organisms => features}/room/reaction-viewer/ReactionViewer.tsx (89%) rename src/app/{organisms => features}/room/reaction-viewer/index.ts (100%) create mode 100644 src/app/hooks/router/useDirectSelected.ts create mode 100644 src/app/hooks/router/useExploreSelected.ts create mode 100644 src/app/hooks/router/useHomeSelected.ts create mode 100644 src/app/hooks/router/useInbox.ts create mode 100644 src/app/hooks/router/useSelectedRoom.ts create mode 100644 src/app/hooks/router/useSelectedSpace.ts create mode 100644 src/app/hooks/useAccountDataCallback.ts create mode 100644 src/app/hooks/useCapabilities.ts create mode 100644 src/app/hooks/useCategoryHandler.ts create mode 100644 src/app/hooks/useElementSizeObserver.ts create mode 100644 src/app/hooks/useInterval.ts create mode 100644 src/app/hooks/useJoinedRoomId.ts create mode 100644 src/app/hooks/useLocalRoomSummary.ts create mode 100644 src/app/hooks/useMediaConfig.ts create mode 100644 src/app/hooks/useNavToActivePathMapper.ts create mode 100644 src/app/hooks/useRoom.ts create mode 100644 src/app/hooks/useRoomMeta.ts delete mode 100644 src/app/hooks/useRoomMsgContentRenderer.ts create mode 100644 src/app/hooks/useRoomNavigate.ts create mode 100644 src/app/hooks/useRoomTypingMembers.ts create mode 100644 src/app/hooks/useSidebarItems.ts create mode 100644 src/app/hooks/useSpace.ts create mode 100644 src/app/hooks/useSpaceHierarchy.ts create mode 100644 src/app/hooks/useSyncState.ts delete mode 100644 src/app/organisms/navigation/Sidebar1.tsx delete mode 100644 src/app/organisms/room/Room.tsx delete mode 100644 src/app/organisms/room/RoomView.jsx delete mode 100644 src/app/organisms/room/RoomViewTyping.tsx delete mode 100644 src/app/organisms/room/message/AudioContent.tsx delete mode 100644 src/app/organisms/room/message/StickerContent.tsx delete mode 100644 src/app/organisms/room/message/fileRenderer.tsx delete mode 100644 src/app/organisms/room/message/index.ts delete mode 100644 src/app/organisms/room/message/styles.css.ts create mode 100644 src/app/pages/MobileFriendly.tsx create mode 100644 src/app/pages/Router.tsx create mode 100644 src/app/pages/afterLoginRedirectPath.ts create mode 100644 src/app/pages/client/ClientBindAtoms.ts create mode 100644 src/app/pages/client/ClientInitStorageAtom.tsx create mode 100644 src/app/pages/client/ClientLayout.tsx create mode 100644 src/app/pages/client/ClientRoot.tsx create mode 100644 src/app/pages/client/SidebarNav.tsx create mode 100644 src/app/pages/client/SpecVersions.tsx create mode 100644 src/app/pages/client/WelcomePage.tsx create mode 100644 src/app/pages/client/direct/Direct.tsx create mode 100644 src/app/pages/client/direct/RoomProvider.tsx create mode 100644 src/app/pages/client/direct/index.ts create mode 100644 src/app/pages/client/direct/useDirectRooms.ts create mode 100644 src/app/pages/client/explore/Explore.tsx create mode 100644 src/app/pages/client/explore/Featured.tsx create mode 100644 src/app/pages/client/explore/Server.tsx create mode 100644 src/app/pages/client/explore/index.ts create mode 100644 src/app/pages/client/explore/style.css.ts create mode 100644 src/app/pages/client/home/Home.tsx create mode 100644 src/app/pages/client/home/RoomProvider.tsx create mode 100644 src/app/pages/client/home/Search.tsx create mode 100644 src/app/pages/client/home/index.ts create mode 100644 src/app/pages/client/home/useHomeRooms.ts create mode 100644 src/app/pages/client/inbox/Inbox.tsx create mode 100644 src/app/pages/client/inbox/Invites.tsx create mode 100644 src/app/pages/client/inbox/Notifications.tsx create mode 100644 src/app/pages/client/inbox/index.ts create mode 100644 src/app/pages/client/index.ts create mode 100644 src/app/pages/client/sidebar/DirectTab.tsx create mode 100644 src/app/pages/client/sidebar/ExploreTab.tsx create mode 100644 src/app/pages/client/sidebar/HomeTab.tsx create mode 100644 src/app/pages/client/sidebar/InboxTab.tsx create mode 100644 src/app/pages/client/sidebar/SpaceTabs.tsx create mode 100644 src/app/pages/client/sidebar/UserTab.tsx create mode 100644 src/app/pages/client/sidebar/index.ts create mode 100644 src/app/pages/client/space/RoomProvider.tsx create mode 100644 src/app/pages/client/space/Search.tsx create mode 100644 src/app/pages/client/space/Space.tsx create mode 100644 src/app/pages/client/space/SpaceProvider.tsx create mode 100644 src/app/pages/client/space/index.ts create mode 100644 src/app/plugins/millify.ts create mode 100644 src/app/state/closedLobbyCategories.ts create mode 100644 src/app/state/closedNavCategories.ts create mode 100644 src/app/state/hooks/closedLobbyCategories.ts create mode 100644 src/app/state/hooks/closedNavCategories.ts create mode 100644 src/app/state/hooks/navToActivePath.ts create mode 100644 src/app/state/hooks/openedSidebarFolder.ts create mode 100644 src/app/state/hooks/unread.ts create mode 100644 src/app/state/navToActivePath.ts create mode 100644 src/app/state/openedSidebarFolder.ts rename src/app/state/{ => room-list}/inviteList.ts (94%) rename src/app/state/{ => room-list}/mutedRoomList.ts (96%) rename src/app/state/{ => room-list}/roomList.ts (93%) rename src/app/state/{ => room-list}/utils.ts (91%) rename src/app/state/{ => room}/roomInputDrafts.ts (88%) rename src/app/state/{ => room}/roomToParents.ts (93%) rename src/app/state/{ => room}/roomToUnread.ts (74%) delete mode 100644 src/app/state/selectedRoom.ts delete mode 100644 src/app/state/selectedTab.ts create mode 100644 src/app/state/spaceRooms.ts delete mode 100644 src/app/state/tabToRoom.ts create mode 100644 src/app/styles/ContainerColor.css.ts create mode 100644 src/app/utils/ASCIILexicalTable.ts create mode 100644 src/app/utils/sort.ts diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/config.json b/config.json index 484c7cd7..762c3a3b 100644 --- a/config.json +++ b/config.json @@ -10,6 +10,26 @@ ], "allowCustomHomeservers": true, + "featuredCommunities": { + "openAsDefault": false, + "spaces": [ + "#cinny-space:matrix.org", + "#community:matrix.org", + "#space:envs.net", + "#science-space:matrix.org", + "#libregaming-games:tchncs.de", + "#mathematics-on:matrix.org" + ], + "rooms": [ + "#cinny:matrix.org", + "#foundation-office:matrix.org", + "#thisweekinmatrix:matrix.org", + "#matrix-dev:matrix.org", + "#matrix:matrix.org" + ], + "servers": ["envs.net", "matrix.org", "monero.social", "mozilla.org"] + }, + "hashRouter": { "enabled": false, "basename": "/" diff --git a/netlify.toml b/netlify.toml index e7d948e6..d79aa91c 100644 --- a/netlify.toml +++ b/netlify.toml @@ -9,9 +9,10 @@ status = 200 [[redirects]] - from = "/olm.wasm" + from = "*/olm.wasm" to = "/olm.wasm" status = 200 + force = true [[redirects]] from = "/pdf.worker.min.js" @@ -31,4 +32,5 @@ [[redirects]] from = "/*" to = "/index.html" - status = 200 \ No newline at end of file + status = 200 + force = true \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2eec2912..17e4dd50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,15 @@ "version": "3.2.0", "license": "AGPL-3.0-only", "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "1.1.6", + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", + "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", - "@tanstack/react-virtual": "3.0.0-beta.54", + "@tanstack/react-query": "5.24.1", + "@tanstack/react-query-devtools": "5.24.1", + "@tanstack/react-virtual": "3.2.0", "@tippyjs/react": "4.2.6", "@vanilla-extract/css": "1.9.3", "@vanilla-extract/recipes": "0.3.0", @@ -29,7 +34,7 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.5.1", + "folds": "2.0.0", "formik": "2.2.9", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", @@ -111,6 +116,34 @@ "node": ">=6.0.0" } }, + "node_modules/@atlaskit/pragmatic-drag-and-drop": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-1.1.6.tgz", + "integrity": "sha512-+jGspaRMyHWB6g9w+N1KImS5I+xt0ML89pwUyCueEhf2KGsl6zyH9ZxjTVKfrbY89FyZvuuXT9oFRHTUKGBi/w==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "bind-event-listener": "^3.0.0", + "raf-schd": "^4.0.3" + } + }, + "node_modules/@atlaskit/pragmatic-drag-and-drop-auto-scroll": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-auto-scroll/-/pragmatic-drag-and-drop-auto-scroll-1.3.0.tgz", + "integrity": "sha512-8wjKAI5qSrLojt8ZJ2WhoS5P75oBu5g0yMpAnTDgfqFyQnkt5Uc1txCRWpG26SS1mv19nm8ak9XHF2DOugVfpw==", + "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "^1.1.0", + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-hitbox/-/pragmatic-drag-and-drop-hitbox-1.0.3.tgz", + "integrity": "sha512-/Sbu/HqN2VGLYBhnsG7SbRNg98XKkbF6L7XDdBi+izRybfaK1FeMfodPpm/xnBHPJzwYMdkE0qtLyv6afhgMUA==", + "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "^1.1.0", + "@babel/runtime": "^7.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", @@ -3093,25 +3126,75 @@ "@swc/counter": "^0.1.3" } }, - "node_modules/@tanstack/react-virtual": { - "version": "3.0.0-beta.54", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.54.tgz", - "integrity": "sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==", + "node_modules/@tanstack/query-core": { + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.24.1.tgz", + "integrity": "sha512-DZ6Nx9p7BhjkG50ayJ+MKPgff+lMeol7QYXkvuU5jr2ryW/4ok5eanaS9W5eooA4xN0A/GPHdLGOZGzArgf5Cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.24.0.tgz", + "integrity": "sha512-pThim455t69zrZaQKa7IRkEIK8UBTS+gHVAdNfhO72Xh4rWpMc63ovRje5/n6iw63+d6QiJzVadsJVdPoodSeQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.24.1.tgz", + "integrity": "sha512-4+09JEdO4d6+Gc8Y/g2M/MuxDK5IY0QV8+2wL2304wPKJgJ54cBbULd3nciJ5uvh/as8rrxx6s0mtIwpRuGd1g==", "dependencies": { - "@tanstack/virtual-core": "3.0.0-beta.54" + "@tanstack/query-core": "5.24.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.24.1.tgz", + "integrity": "sha512-qa4SEugN+EF8JJXcpsM9Lu05HfUv5cvHvLuB0uw/81eJZyNHFdtHFBi5RLCgpBrOyVMDfH8UQ3VBMqXzFKV68A==", + "dependencies": { + "@tanstack/query-devtools": "5.24.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.24.1", + "react": "^18.0.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz", + "integrity": "sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg==", + "dependencies": { + "@tanstack/virtual-core": "3.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@tanstack/virtual-core": { - "version": "3.0.0-beta.54", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.54.tgz", - "integrity": "sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz", + "integrity": "sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -4065,6 +4148,11 @@ "node": ">=8" } }, + "node_modules/bind-event-listener": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-3.0.0.tgz", + "integrity": "sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==" + }, "node_modules/blurhash": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", @@ -5665,9 +5753,9 @@ } }, "node_modules/folds": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/folds/-/folds-1.5.1.tgz", - "integrity": "sha512-2QxyA+FRKjPKXDTMDoD7NmOUiReWrKYO0Msg44QqlzTkTrRVEzJgyPIfC/Ia4/u0ByQpk6dbq8UQxomKmneJ/g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/folds/-/folds-2.0.0.tgz", + "integrity": "sha512-lKv31vij4GEpEzGKWk5c3ar78fMZ9Di5n1XFR14Z2wnnpqhiiM5JTIzr127Gk5dOfy4mJkjnv/ZfMZvM2k+OQg==", "peerDependencies": { "@vanilla-extract/css": "^1.9.2", "@vanilla-extract/recipes": "^0.3.0", @@ -7580,6 +7668,11 @@ } ] }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", diff --git a/package.json b/package.json index 44c28d34..e626e837 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,15 @@ "author": "Ajay Bura", "license": "AGPL-3.0-only", "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "1.1.6", + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", + "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", - "@tanstack/react-virtual": "3.0.0-beta.54", + "@tanstack/react-query": "5.24.1", + "@tanstack/react-query-devtools": "5.24.1", + "@tanstack/react-virtual": "3.2.0", "@tippyjs/react": "4.2.6", "@vanilla-extract/css": "1.9.3", "@vanilla-extract/recipes": "0.3.0", @@ -40,7 +45,7 @@ "file-saver": "2.0.5", "flux": "4.0.3", "focus-trap-react": "10.0.2", - "folds": "1.5.1", + "folds": "2.0.0", "formik": "2.2.9", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", diff --git a/src/app/components/CapabilitiesAndMediaConfigLoader.tsx b/src/app/components/CapabilitiesAndMediaConfigLoader.tsx new file mode 100644 index 00000000..338e5280 --- /dev/null +++ b/src/app/components/CapabilitiesAndMediaConfigLoader.tsx @@ -0,0 +1,36 @@ +import { ReactNode, useCallback, useEffect } from 'react'; +import { Capabilities } from 'matrix-js-sdk'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { useMatrixClient } from '../hooks/useMatrixClient'; +import { MediaConfig } from '../hooks/useMediaConfig'; +import { promiseFulfilledResult } from '../utils/common'; + +type CapabilitiesAndMediaConfigLoaderProps = { + children: (capabilities?: Capabilities, mediaConfig?: MediaConfig) => ReactNode; +}; +export function CapabilitiesAndMediaConfigLoader({ + children, +}: CapabilitiesAndMediaConfigLoaderProps) { + const mx = useMatrixClient(); + + const [state, load] = useAsyncCallback< + [Capabilities | undefined, MediaConfig | undefined], + unknown, + [] + >( + useCallback(async () => { + const result = await Promise.allSettled([mx.getCapabilities(true), mx.getMediaConfig()]); + const capabilities = promiseFulfilledResult(result[0]); + const mediaConfig = promiseFulfilledResult(result[1]); + return [capabilities, mediaConfig]; + }, [mx]) + ); + + useEffect(() => { + load(); + }, [load]); + + const [capabilities, mediaConfig] = + state.status === AsyncStatus.Success ? state.data : [undefined, undefined]; + return children(capabilities, mediaConfig); +} diff --git a/src/app/components/CapabilitiesLoader.tsx b/src/app/components/CapabilitiesLoader.tsx new file mode 100644 index 00000000..dad59ec8 --- /dev/null +++ b/src/app/components/CapabilitiesLoader.tsx @@ -0,0 +1,19 @@ +import { ReactNode, useCallback, useEffect } from 'react'; +import { Capabilities } from 'matrix-js-sdk'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { useMatrixClient } from '../hooks/useMatrixClient'; + +type CapabilitiesLoaderProps = { + children: (capabilities: Capabilities | undefined) => ReactNode; +}; +export function CapabilitiesLoader({ children }: CapabilitiesLoaderProps) { + const mx = useMatrixClient(); + + const [state, load] = useAsyncCallback(useCallback(() => mx.getCapabilities(true), [mx])); + + useEffect(() => { + load(); + }, [load]); + + return children(state.status === AsyncStatus.Success ? state.data : undefined); +} diff --git a/src/app/components/MediaConfigLoader.tsx b/src/app/components/MediaConfigLoader.tsx new file mode 100644 index 00000000..9fd99330 --- /dev/null +++ b/src/app/components/MediaConfigLoader.tsx @@ -0,0 +1,19 @@ +import { ReactNode, useCallback, useEffect } from 'react'; +import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; +import { useMatrixClient } from '../hooks/useMatrixClient'; +import { MediaConfig } from '../hooks/useMediaConfig'; + +type MediaConfigLoaderProps = { + children: (mediaConfig: MediaConfig | undefined) => ReactNode; +}; +export function MediaConfigLoader({ children }: MediaConfigLoaderProps) { + const mx = useMatrixClient(); + + const [state, load] = useAsyncCallback(useCallback(() => mx.getMediaConfig(), [mx])); + + useEffect(() => { + load(); + }, [load]); + + return children(state.status === AsyncStatus.Success ? state.data : undefined); +} diff --git a/src/app/components/Pdf-viewer/PdfViewer.tsx b/src/app/components/Pdf-viewer/PdfViewer.tsx index c440cce9..a78c13f2 100644 --- a/src/app/components/Pdf-viewer/PdfViewer.tsx +++ b/src/app/components/Pdf-viewer/PdfViewer.tsx @@ -1,6 +1,6 @@ /* eslint-disable no-param-reassign */ /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ -import React, { FormEventHandler, useEffect, useRef, useState } from 'react'; +import React, { FormEventHandler, MouseEventHandler, useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import { Box, @@ -13,6 +13,7 @@ import { Input, Menu, PopOut, + RectCords, Scroll, Spinner, Text, @@ -48,7 +49,7 @@ export const PdfViewer = as<'div', PdfViewerProps>( const isError = pdfJSState.status === AsyncStatus.Error || docState.status === AsyncStatus.Error; const [pageNo, setPageNo] = useState(1); - const [openJump, setOpenJump] = useState(false); + const [jumpAnchor, setJumpAnchor] = useState(); useEffect(() => { loadPdfJS(); @@ -86,7 +87,7 @@ export const PdfViewer = as<'div', PdfViewerProps>( if (!jumpInput) return; const jumpTo = parseInt(jumpInput.value, 10); setPageNo(Math.max(1, Math.min(docState.data.numPages, jumpTo))); - setOpenJump(false); + setJumpAnchor(undefined); }; const handlePrevPage = () => { @@ -98,6 +99,10 @@ export const PdfViewer = as<'div', PdfViewerProps>( setPageNo((n) => Math.min(n + 1, docState.data.numPages)); }; + const handleOpenJump: MouseEventHandler = (evt) => { + setJumpAnchor(evt.currentTarget.getBoundingClientRect()); + }; + return (
        @@ -187,14 +192,14 @@ export const PdfViewer = as<'div', PdfViewerProps>( setOpenJump(false), + onDeactivate: () => setJumpAnchor(undefined), clickOutsideDeactivates: true, }} > @@ -227,17 +232,14 @@ export const PdfViewer = as<'div', PdfViewerProps>( } > - {(anchorRef) => ( - setOpenJump(!openJump)} - ref={anchorRef} - variant="SurfaceVariant" - radii="300" - aria-pressed={openJump} - > - {`${pageNo}/${docState.data.numPages}`} - - )} + + {`${pageNo}/${docState.data.numPages}`} + () => T; + mediaAutoLoad?: boolean; + urlPreview?: boolean; + highlightRegex?: RegExp; + htmlReactParserOptions: HTMLReactParserOptions; + outlineAttachment?: boolean; +}; +export function RenderMessageContent({ + displayName, + msgType, + ts, + edited, + getContent, + mediaAutoLoad, + urlPreview, + highlightRegex, + htmlReactParserOptions, + outlineAttachment, +}: RenderMessageContentProps) { + const renderFile = () => ( + ( + ( + } + /> + )} + renderAsTextFile={() => ( + } + /> + )} + > + + + )} + outlined={outlineAttachment} + /> + ); + + if (msgType === MsgType.Text) { + return ( + ( + + )} + renderUrlsPreview={ + urlPreview + ? (urls) => ( + + {urls.map((url) => ( + + ))} + + ) + : undefined + } + /> + ); + } + + if (msgType === MsgType.Emote) { + return ( + ( + + )} + renderUrlsPreview={ + urlPreview + ? (urls) => ( + + {urls.map((url) => ( + + ))} + + ) + : undefined + } + /> + ); + } + + if (msgType === MsgType.Notice) { + return ( + ( + + )} + renderUrlsPreview={ + urlPreview + ? (urls) => ( + + {urls.map((url) => ( + + ))} + + ) + : undefined + } + /> + ); + } + + if (msgType === MsgType.Image) { + return ( + ( + } + renderViewer={(p) => } + /> + )} + outlined={outlineAttachment} + /> + ); + } + + if (msgType === MsgType.Video) { + return ( + ( + ( + ( + {body} + )} + /> + ) + : undefined + } + renderVideo={(p) =>
        + + } + > + } + > + Select Rooms + + + ); +} + +type SearchFiltersProps = { + defaultRoomsFilterName: string; + allowGlobal?: boolean; + roomList: string[]; + selectedRooms?: string[]; + onSelectedRoomsChange: (selectedRooms?: string[]) => void; + global?: boolean; + onGlobalChange: (global?: boolean) => void; + order?: string; + onOrderChange: (order?: string) => void; +}; +export function SearchFilters({ + defaultRoomsFilterName, + allowGlobal, + roomList, + selectedRooms, + onSelectedRoomsChange, + global, + order, + onGlobalChange, + onOrderChange, +}: SearchFiltersProps) { + const mx = useMatrixClient(); + + return ( + + Filter + + } + outlined + onClick={() => onGlobalChange()} + > + {defaultRoomsFilterName} + + {allowGlobal && ( + } + outlined + onClick={() => onGlobalChange(true)} + > + Global + + )} + + {selectedRooms?.map((roomId) => { + const room = mx.getRoom(roomId); + if (!room) return null; + + return ( + onSelectedRoomsChange(selectedRooms.filter((rId) => rId !== roomId))} + radii="Pill" + before={ + + } + after={} + > + {room.name} + + ); + })} + + + + + + ); +} diff --git a/src/app/features/message-search/SearchInput.tsx b/src/app/features/message-search/SearchInput.tsx new file mode 100644 index 00000000..db646c26 --- /dev/null +++ b/src/app/features/message-search/SearchInput.tsx @@ -0,0 +1,66 @@ +import React, { FormEventHandler, RefObject } from 'react'; +import { Box, Text, Input, Icon, Icons, Spinner, Chip, config } from 'folds'; + +type SearchProps = { + active?: boolean; + loading?: boolean; + searchInputRef: RefObject; + onSearch: (term: string) => void; + onReset: () => void; +}; +export function SearchInput({ active, loading, searchInputRef, onSearch, onReset }: SearchProps) { + const handleSearchSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { searchInput } = evt.target as HTMLFormElement & { + searchInput: HTMLInputElement; + }; + + const searchTerm = searchInput.value.trim() || undefined; + if (searchTerm) { + onSearch(searchTerm); + } + }; + + return ( + + + Search + + ) : ( + + ) + } + after={ + active ? ( + } + onClick={onReset} + > + Clear + + ) : ( + + Enter + + ) + } + /> + + ); +} diff --git a/src/app/features/message-search/SearchResultGroup.tsx b/src/app/features/message-search/SearchResultGroup.tsx new file mode 100644 index 00000000..6f84f621 --- /dev/null +++ b/src/app/features/message-search/SearchResultGroup.tsx @@ -0,0 +1,262 @@ +/* eslint-disable react/destructuring-assignment */ +import React, { MouseEventHandler, useMemo } from 'react'; +import { IEventWithRoomId, JoinRule, RelationType, Room } from 'matrix-js-sdk'; +import { HTMLReactParserOptions } from 'html-react-parser'; +import { Avatar, Box, Chip, Header, Icon, Icons, Text, config } from 'folds'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { + getReactCustomHtmlParser, + makeHighlightRegex, +} from '../../plugins/react-custom-html-parser'; +import { getMxIdLocalPart, isRoomId, isUserId } from '../../utils/matrix'; +import { openJoinAlias, openProfileViewer } from '../../../client/action/navigation'; +import { useMatrixEventRenderer } from '../../hooks/useMatrixEventRenderer'; +import { GetContentCallback, MessageEvent, StateEvent } from '../../../types/matrix/room'; +import { + AvatarBase, + ImageContent, + MSticker, + ModernLayout, + RedactedContent, + Reply, + Time, + Username, +} from '../../components/message'; +import { RenderMessageContent } from '../../components/RenderMessageContent'; +import { Image } from '../../components/media'; +import { ImageViewer } from '../../components/image-viewer'; +import * as customHtmlCss from '../../styles/CustomHtml.css'; +import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; +import { getMemberAvatarMxc, getMemberDisplayName, getRoomAvatarUrl } from '../../utils/room'; +import colorMXID from '../../../util/colorMXID'; +import { ResultItem } from './useMessageSearch'; +import { SequenceCard } from '../../components/sequence-card'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { UserAvatar } from '../../components/user-avatar'; + +type SearchResultGroupProps = { + room: Room; + highlights: string[]; + items: ResultItem[]; + mediaAutoLoad?: boolean; + urlPreview?: boolean; + onOpen: (roomId: string, eventId: string) => void; +}; +export function SearchResultGroup({ + room, + highlights, + items, + mediaAutoLoad, + urlPreview, + onOpen, +}: SearchResultGroupProps) { + const mx = useMatrixClient(); + const { navigateRoom, navigateSpace } = useRoomNavigate(); + const highlightRegex = useMemo(() => makeHighlightRegex(highlights), [highlights]); + + const htmlReactParserOptions = useMemo( + () => + getReactCustomHtmlParser(mx, room, { + highlightRegex, + handleSpoilerClick: (evt) => { + const target = evt.currentTarget; + if (target.getAttribute('aria-pressed') === 'true') { + evt.stopPropagation(); + target.setAttribute('aria-pressed', 'false'); + target.style.cursor = 'initial'; + } + }, + handleMentionClick: (evt) => { + const target = evt.currentTarget; + const mentionId = target.getAttribute('data-mention-id'); + if (typeof mentionId !== 'string') return; + if (isUserId(mentionId)) { + openProfileViewer(mentionId, room.roomId); + return; + } + if (isRoomId(mentionId) && mx.getRoom(mentionId)) { + if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); + else navigateRoom(mentionId); + return; + } + openJoinAlias(mentionId); + }, + }), + [mx, room, highlightRegex, navigateRoom, navigateSpace] + ); + + const renderMatrixEvent = useMatrixEventRenderer<[IEventWithRoomId, string, GetContentCallback]>( + { + [MessageEvent.RoomMessage]: (event, displayName, getContent) => { + if (event.unsigned?.redacted_because) { + return ; + } + + return ( + + ); + }, + [MessageEvent.Reaction]: (event, displayName, getContent) => { + if (event.unsigned?.redacted_because) { + return ; + } + return ( + ( + } + renderViewer={(p) => } + /> + )} + /> + ); + }, + [StateEvent.RoomTombstone]: (event) => { + const { content } = event; + return ( + + + Room Tombstone. {content.body} + + + ); + }, + }, + undefined, + (event) => { + if (event.unsigned?.redacted_because) { + return ; + } + return ( + + + {event.type} + {' event'} + + + ); + } + ); + + const handleOpenClick: MouseEventHandler = (evt) => { + const eventId = evt.currentTarget.getAttribute('data-event-id'); + if (!eventId) return; + onOpen(room.roomId, eventId); + }; + + return ( + +
        + + + ( + + )} + /> + + + {room.name} + + +
        + + {items.map((item) => { + const { event } = item; + + const displayName = + getMemberDisplayName(room, event.sender) ?? + getMxIdLocalPart(event.sender) ?? + event.sender; + const senderAvatarMxc = getMemberAvatarMxc(room, event.sender); + + const mainEventId = + event.content['m.relates_to']?.rel_type === RelationType.Replace + ? event.content['m.relates_to'].event_id + : event.event_id; + + const getContent = (() => + event.content['m.new_content'] ?? event.content) as GetContentCallback; + + const replyEventId = event.content['m.relates_to']?.['m.in_reply_to']?.event_id; + + return ( + + + + } + /> + + + } + > + + + + + {displayName} + + + + + + Open + + + + {replyEventId && ( + + )} + {renderMatrixEvent(event.type, false, event, displayName, getContent)} + + + ); + })} + +
        + ); +} diff --git a/src/app/features/message-search/index.ts b/src/app/features/message-search/index.ts new file mode 100644 index 00000000..5160d12f --- /dev/null +++ b/src/app/features/message-search/index.ts @@ -0,0 +1 @@ +export * from './MessageSearch'; diff --git a/src/app/features/message-search/useMessageSearch.ts b/src/app/features/message-search/useMessageSearch.ts new file mode 100644 index 00000000..ded6d4b7 --- /dev/null +++ b/src/app/features/message-search/useMessageSearch.ts @@ -0,0 +1,115 @@ +import { + IEventWithRoomId, + IResultContext, + ISearchRequestBody, + ISearchResponse, + ISearchResult, + SearchOrderBy, +} from 'matrix-js-sdk'; +import { useCallback } from 'react'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; + +export type ResultItem = { + rank: number; + event: IEventWithRoomId; + context: IResultContext; +}; + +export type ResultGroup = { + roomId: string; + items: ResultItem[]; +}; + +export type SearchResult = { + nextToken?: string; + highlights: string[]; + groups: ResultGroup[]; +}; + +const groupSearchResult = (results: ISearchResult[]): ResultGroup[] => { + const groups: ResultGroup[] = []; + + results.forEach((item) => { + const roomId = item.result.room_id; + const resultItem: ResultItem = { + rank: item.rank, + event: item.result, + context: item.context, + }; + + const lastAddedGroup: ResultGroup | undefined = groups[groups.length - 1]; + if (lastAddedGroup && roomId === lastAddedGroup.roomId) { + lastAddedGroup.items.push(resultItem); + return; + } + groups.push({ + roomId, + items: [resultItem], + }); + }); + + return groups; +}; + +const parseSearchResult = (result: ISearchResponse): SearchResult => { + const roomEvents = result.search_categories.room_events; + + const searchResult: SearchResult = { + nextToken: roomEvents?.next_batch, + highlights: roomEvents?.highlights ?? [], + groups: groupSearchResult(roomEvents?.results ?? []), + }; + + return searchResult; +}; + +export type MessageSearchParams = { + term?: string; + order?: string; + rooms?: string[]; + senders?: string[]; +}; +export const useMessageSearch = (params: MessageSearchParams) => { + const mx = useMatrixClient(); + const { term, order, rooms, senders } = params; + + const searchMessages = useCallback( + async (nextBatch?: string) => { + if (!term) + return { + highlights: [], + groups: [], + }; + const limit = 20; + + const requestBody: ISearchRequestBody = { + search_categories: { + room_events: { + event_context: { + before_limit: 0, + after_limit: 0, + include_profile: false, + }, + filter: { + limit, + rooms, + senders, + }, + include_state: false, + order_by: order as SearchOrderBy.Recent, + search_term: term, + }, + }, + }; + + const r = await mx.search({ + body: requestBody, + next_batch: nextBatch === '' ? undefined : nextBatch, + }); + return parseSearchResult(r); + }, + [mx, term, order, rooms, senders] + ); + + return searchMessages; +}; diff --git a/src/app/features/room-nav/RoomNavCategoryButton.tsx b/src/app/features/room-nav/RoomNavCategoryButton.tsx new file mode 100644 index 00000000..7acbbe28 --- /dev/null +++ b/src/app/features/room-nav/RoomNavCategoryButton.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { as, Chip, Icon, Icons, Text } from 'folds'; +import classNames from 'classnames'; +import * as css from './styles.css'; + +export const RoomNavCategoryButton = as<'button', { closed?: boolean }>( + ({ className, closed, children, ...props }, ref) => ( + + } + {...props} + ref={ref} + > + + {children} + + + ) +); diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx new file mode 100644 index 00000000..fce62375 --- /dev/null +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -0,0 +1,297 @@ +import React, { MouseEventHandler, forwardRef, useState } from 'react'; +import { Room } from 'matrix-js-sdk'; +import { + Avatar, + Box, + Icon, + IconButton, + Icons, + Text, + Menu, + MenuItem, + config, + PopOut, + toRem, + Line, + RectCords, + Badge, +} from 'folds'; +import { useFocusWithin, useHover } from 'react-aria'; +import FocusTrap from 'focus-trap-react'; +import { NavItem, NavItemContent, NavItemOptions, NavLink } from '../../components/nav'; +import { UnreadBadge, UnreadBadgeCenter } from '../../components/unread-badge'; +import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; +import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../../utils/room'; +import { nameInitials } from '../../utils/common'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { useRoomUnread } from '../../state/hooks/unread'; +import { roomToUnreadAtom } from '../../state/room/roomToUnread'; +import { usePowerLevels, usePowerLevelsAPI } from '../../hooks/usePowerLevels'; +import { copyToClipboard } from '../../utils/dom'; +import { getOriginBaseUrl, withOriginBaseUrl } from '../../pages/pathUtils'; +import { markAsRead } from '../../../client/action/notifications'; +import { openInviteUser, toggleRoomSettings } from '../../../client/action/navigation'; +import { UseStateProvider } from '../../components/UseStateProvider'; +import { LeaveRoomPrompt } from '../../components/leave-room-prompt'; +import { useClientConfig } from '../../hooks/useClientConfig'; +import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; +import { TypingIndicator } from '../../components/typing-indicator'; + +type RoomNavItemMenuProps = { + room: Room; + linkPath: string; + requestClose: () => void; +}; +const RoomNavItemMenu = forwardRef( + ({ room, linkPath, requestClose }, ref) => { + const mx = useMatrixClient(); + const { hashRouter } = useClientConfig(); + const unread = useRoomUnread(room.roomId, roomToUnreadAtom); + const powerLevels = usePowerLevels(room); + const { getPowerLevel, canDoAction } = usePowerLevelsAPI(powerLevels); + const canInvite = canDoAction('invite', getPowerLevel(mx.getUserId() ?? '')); + + const handleMarkAsRead = () => { + markAsRead(room.roomId); + requestClose(); + }; + + const handleInvite = () => { + openInviteUser(room.roomId); + requestClose(); + }; + + const handleCopyLink = () => { + copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), linkPath)); + requestClose(); + }; + + const handleRoomSettings = () => { + toggleRoomSettings(room.roomId); + requestClose(); + }; + + return ( + + + } + radii="300" + disabled={!unread} + > + + Mark as Read + + + + + + } + radii="300" + disabled={!canInvite} + > + + Invite + + + } + radii="300" + > + + Copy Link + + + } + radii="300" + > + + Room Settings + + + + + + + {(promptLeave, setPromptLeave) => ( + <> + setPromptLeave(true)} + variant="Critical" + fill="None" + size="300" + after={} + radii="300" + aria-pressed={promptLeave} + > + + Leave Room + + + {promptLeave && ( + setPromptLeave(false)} + /> + )} + + )} + + + + ); + } +); + +type RoomNavItemProps = { + room: Room; + selected: boolean; + linkPath: string; + muted?: boolean; + showAvatar?: boolean; + direct?: boolean; +}; +export function RoomNavItem({ + room, + selected, + showAvatar, + direct, + muted, + linkPath, +}: RoomNavItemProps) { + const mx = useMatrixClient(); + const [hover, setHover] = useState(false); + const { hoverProps } = useHover({ onHoverChange: setHover }); + const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setHover }); + const [menuAnchor, setMenuAnchor] = useState(); + const unread = useRoomUnread(room.roomId, roomToUnreadAtom); + const typingMember = useRoomTypingMember(room.roomId); + + const handleContextMenu: MouseEventHandler = (evt) => { + evt.preventDefault(); + setMenuAnchor({ + x: evt.clientX, + y: evt.clientY, + width: 0, + height: 0, + }); + }; + + const handleOpenMenu: MouseEventHandler = (evt) => { + setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + }; + + const optionsVisible = hover || !!menuAnchor; + + return ( + + + + + + {showAvatar ? ( + ( + + {nameInitials(room.name)} + + )} + /> + ) : ( + + )} + + + + {room.name} + + + {!optionsVisible && !unread && !selected && typingMember.length > 0 && ( + + + + )} + {!optionsVisible && unread && ( + + 0} count={unread.total} /> + + )} + {muted && !optionsVisible && } + + + + {optionsVisible && ( + + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} + /> + + } + > + + + + + + )} + + ); +} diff --git a/src/app/features/room-nav/index.ts b/src/app/features/room-nav/index.ts new file mode 100644 index 00000000..d1ea3ec7 --- /dev/null +++ b/src/app/features/room-nav/index.ts @@ -0,0 +1,2 @@ +export * from './RoomNavItem'; +export * from './RoomNavCategoryButton'; diff --git a/src/app/features/room-nav/styles.css.ts b/src/app/features/room-nav/styles.css.ts new file mode 100644 index 00000000..b5701a6f --- /dev/null +++ b/src/app/features/room-nav/styles.css.ts @@ -0,0 +1,9 @@ +import { style } from '@vanilla-extract/css'; +import { config } from 'folds'; + +export const CategoryButton = style({ + flexGrow: 1, +}); +export const CategoryButtonIcon = style({ + opacity: config.opacity.P400, +}); diff --git a/src/app/organisms/room/CommandAutocomplete.tsx b/src/app/features/room/CommandAutocomplete.tsx similarity index 100% rename from src/app/organisms/room/CommandAutocomplete.tsx rename to src/app/features/room/CommandAutocomplete.tsx diff --git a/src/app/organisms/room/MembersDrawer.css.ts b/src/app/features/room/MembersDrawer.css.ts similarity index 100% rename from src/app/organisms/room/MembersDrawer.css.ts rename to src/app/features/room/MembersDrawer.css.ts diff --git a/src/app/organisms/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx similarity index 79% rename from src/app/organisms/room/MembersDrawer.tsx rename to src/app/features/room/MembersDrawer.tsx index b4ba6b79..8a96b84a 100644 --- a/src/app/organisms/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -8,8 +8,6 @@ import React, { } from 'react'; import { Avatar, - AvatarFallback, - AvatarImage, Badge, Box, Chip, @@ -22,6 +20,7 @@ import { Menu, MenuItem, PopOut, + RectCords, Scroll, Spinner, Text, @@ -32,18 +31,12 @@ import { import { Room, RoomMember } from 'matrix-js-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; import FocusTrap from 'focus-trap-react'; -import millify from 'millify'; import classNames from 'classnames'; -import { useAtomValue } from 'jotai'; -import { openInviteUser, openProfileViewer } from '../../../client/action/navigation'; +import { openProfileViewer } from '../../../client/action/navigation'; import * as css from './MembersDrawer.css'; import { useRoomMembers } from '../../hooks/useRoomMembers'; import { useMatrixClient } from '../../hooks/useMatrixClient'; -import { - getIntersectionObserverEntry, - useIntersectionObserver, -} from '../../hooks/useIntersectionObserver'; import { Membership } from '../../../types/matrix/room'; import { UseStateProvider } from '../../components/UseStateProvider'; import { @@ -52,14 +45,16 @@ import { useAsyncSearch, } from '../../hooks/useAsyncSearch'; import { useDebounce } from '../../hooks/useDebounce'; -import colorMXID from '../../../util/colorMXID'; import { usePowerLevelTags, PowerLevelTag } from '../../hooks/usePowerLevelTags'; -import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../../state/typingMembers'; import { TypingIndicator } from '../../components/typing-indicator'; import { getMemberDisplayName, getMemberSearchStr } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; -import { useSetting } from '../../state/hooks/settings'; +import { useSetSetting, useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; +import { millify } from '../../plugins/millify'; +import { ScrollTopContainer } from '../../components/scroll-top-container'; +import { UserAvatar } from '../../components/user-avatar'; +import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; export const MembershipFilters = { filterJoined: (m: RoomMember) => m.membership === Membership.Join, @@ -181,6 +176,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { const members = useRoomMembers(mx, room.roomId); const getPowerLevelTag = usePowerLevelTags(); const fetchingMembers = members.length < room.getJoinedMemberCount(); + const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); const membershipFilterMenu = useMembershipFilterMenu(); const sortFilterMenu = useSortFilterMenu(); @@ -190,11 +186,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { const membershipFilter = membershipFilterMenu[membershipFilterIndex] ?? membershipFilterMenu[0]; const sortFilter = sortFilterMenu[sortFilterIndex] ?? sortFilterMenu[0]; - const [onTop, setOnTop] = useState(true); - - const typingMembers = useAtomValue( - useMemo(() => selectRoomTypingMembersAtom(room.roomId, roomIdToTypingMembersAtom), [room]) - ); + const typingMembers = useRoomTypingMember(room.roomId); const filteredMembers = useMemo( () => @@ -235,16 +227,6 @@ export function MembersDrawer({ room }: MembersDrawerProps) { overscan: 10, }); - useIntersectionObserver( - useCallback((intersectionEntries) => { - if (!scrollTopAnchorRef.current) return; - const entry = getIntersectionObserverEntry(scrollTopAnchorRef.current, intersectionEntries); - if (entry) setOnTop(entry.isIntersecting); - }, []), - useCallback(() => ({ root: scrollRef.current }), []), - useCallback(() => scrollTopAnchorRef.current, []) - ); - const handleSearchChange: ChangeEventHandler = useDebounce( useCallback( (evt) => { @@ -266,12 +248,12 @@ export function MembersDrawer({ room }: MembersDrawerProps) { }; return ( - +
        - - {`${millify(room.getJoinedMemberCount(), { precision: 1, locales: [] })} Members`} + + {`${millify(room.getJoinedMemberCount())} Members`} @@ -281,7 +263,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { offset={4} tooltip={ - Invite Member + Close } > @@ -289,9 +271,9 @@ export function MembersDrawer({ room }: MembersDrawerProps) { openInviteUser(room.roomId)} + onClick={() => setPeopleDrawer(false)} > - + )} @@ -299,14 +281,14 @@ export function MembersDrawer({ room }: MembersDrawerProps) {
        - + - - {(open, setOpen) => ( + + {(anchor: RectCords | undefined, setAnchor) => ( setOpen(false), + onDeactivate: () => setAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', @@ -330,38 +312,41 @@ export function MembersDrawer({ room }: MembersDrawerProps) { : 'Surface' } aria-pressed={menuItem.name === membershipFilter.name} + size="300" radii="300" onClick={() => { setMembershipFilterIndex(index); - setOpen(false); + setAnchor(undefined); }} > - {menuItem.name} + {menuItem.name} ))}
  • } > - {(anchorRef) => ( - setOpen(!open)} - variant={membershipFilter.color} - size="400" - radii="300" - before={} - > - {membershipFilter.name} - - )} + + setAnchor( + evt.currentTarget.getBoundingClientRect() + )) as MouseEventHandler + } + variant={membershipFilter.color} + size="400" + radii="300" + before={} + > + {membershipFilter.name} + )} - - {(open, setOpen) => ( + + {(anchor: RectCords | undefined, setAnchor) => ( setOpen(false), + onDeactivate: () => setAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', @@ -381,31 +366,34 @@ export function MembersDrawer({ room }: MembersDrawerProps) { key={menuItem.name} variant="Surface" aria-pressed={menuItem.name === sortFilter.name} + size="300" radii="300" onClick={() => { setSortFilterIndex(index); - setOpen(false); + setAnchor(undefined); }} > - {menuItem.name} + {menuItem.name} ))} } > - {(anchorRef) => ( - setOpen(!open)} - variant="Background" - size="400" - radii="300" - after={} - > - {sortFilter.name} - - )} + + setAnchor( + evt.currentTarget.getBoundingClientRect() + )) as MouseEventHandler + } + variant="Background" + size="400" + radii="300" + after={} + > + {sortFilter.name} + )} @@ -446,20 +434,18 @@ export function MembersDrawer({ room }: MembersDrawerProps) { - {!onTop && ( - - virtualizer.scrollToOffset(0)} - variant="Surface" - radii="Pill" - outlined - size="300" - aria-label="Scroll to Top" - > - - - - )} + + virtualizer.scrollToOffset(0)} + variant="Surface" + radii="Pill" + outlined + size="300" + aria-label="Scroll to Top" + > + + + {!fetchingMembers && !result && processMembers.length === 0 && ( @@ -520,22 +506,16 @@ export function MembersDrawer({ room }: MembersDrawerProps) { onClick={handleMemberClick} before={ - {avatarUrl ? ( - - ) : ( - - {name[0]} - - )} + } + /> } after={ - typingMembers.find((tm) => tm.userId === member.userId) && ( + typingMembers.find((receipt) => receipt.userId === member.userId) && ( diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx new file mode 100644 index 00000000..764e9686 --- /dev/null +++ b/src/app/features/room/Room.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Box, Line } from 'folds'; +import { useParams } from 'react-router-dom'; +import { RoomView } from './RoomView'; +import { MembersDrawer } from './MembersDrawer'; +import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; +import { PowerLevelsContextProvider, usePowerLevels } from '../../hooks/usePowerLevels'; +import { useRoom } from '../../hooks/useRoom'; + +export function Room() { + const { eventId } = useParams(); + const room = useRoom(); + + const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); + const screenSize = useScreenSizeContext(); + const powerLevels = usePowerLevels(room); + + return ( + + + + {screenSize === ScreenSize.Desktop && isDrawer && ( + <> + + + + )} + + + ); +} diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx similarity index 85% rename from src/app/organisms/room/RoomInput.tsx rename to src/app/features/room/RoomInput.tsx index e6c4fb73..6f9a2495 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -57,7 +57,7 @@ import { import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; import initMatrix from '../../../client/initMatrix'; -import { TUploadContent, encryptFile, getImageInfo } from '../../utils/matrix'; +import { TUploadContent, encryptFile, getImageInfo, getMxIdLocalPart } from '../../utils/matrix'; import { useTypingStatusUpdater } from '../../hooks/useTypingStatusUpdater'; import { useFilePicker } from '../../hooks/useFilePicker'; import { useFilePasteHandler } from '../../hooks/useFilePasteHandler'; @@ -68,7 +68,7 @@ import { roomIdToReplyDraftAtomFamily, roomIdToUploadItemsAtomFamily, roomUploadAtomFamily, -} from '../../state/roomInputDrafts'; +} from '../../state/room/roomInputDrafts'; import { UploadCardRenderer } from '../../components/upload-card'; import { UploadBoard, @@ -93,32 +93,34 @@ import { getImageMsgContent, getVideoMsgContent, } from './msgContent'; -import { MessageReply } from '../../molecules/message/Message'; import colorMXID from '../../../util/colorMXID'; import { + getMemberDisplayName, parseReplyBody, parseReplyFormattedBody, trimReplyFromBody, trimReplyFromFormattedBody, } from '../../utils/room'; import { sanitizeText } from '../../utils/sanitize'; -import { useScreenSize } from '../../hooks/useScreenSize'; import { CommandAutocomplete } from './CommandAutocomplete'; import { Command, SHRUG, useCommands } from '../../hooks/useCommands'; import { mobileOrTablet } from '../../utils/user-agent'; +import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; +import { ReplyLayout } from '../../components/message'; interface RoomInputProps { editor: Editor; - roomViewRef: RefObject; + fileDropContainerRef: RefObject; roomId: string; room: Room; } export const RoomInput = forwardRef( - ({ editor, roomViewRef, roomId, room }, ref) => { + ({ editor, fileDropContainerRef, roomId, room }, ref) => { const mx = useMatrixClient(); const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline'); const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const commands = useCommands(mx, room); + const emojiBtnRef = useRef(null); const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(roomId)); const [replyDraft, setReplyDraft] = useAtom(roomIdToReplyDraftAtomFamily(roomId)); @@ -170,10 +172,13 @@ export const RoomInput = forwardRef( ); const pickFile = useFilePicker(handleFiles, true); const handlePaste = useFilePasteHandler(handleFiles); - const dropZoneVisible = useFileDropZone(roomViewRef, handleFiles); + const dropZoneVisible = useFileDropZone(fileDropContainerRef, handleFiles); + const [hideStickerBtn, setHideStickerBtn] = useState(document.body.clientWidth < 500); - const [, screenWidth] = useScreenSize(); - const hideStickerBtn = screenWidth < 500; + useElementSizeObserver( + useCallback(() => document.body, []), + useCallback((width) => setHideStickerBtn(width < 500), []) + ); useEffect(() => { Transforms.insertFragment(editor, msgDraft); @@ -307,7 +312,7 @@ export const RoomInput = forwardRef( mx.sendMessage(roomId, content); resetEditor(editor); resetEditorHistory(editor); - setReplyDraft(); + setReplyDraft(undefined); sendTypingStatus(false); }, [mx, roomId, editor, replyDraft, sendTypingStatus, setReplyDraft, isMarkdown, commands]); @@ -319,7 +324,7 @@ export const RoomInput = forwardRef( } if (isKeyHotkey('escape', evt)) { evt.preventDefault(); - setReplyDraft(); + setReplyDraft(undefined); } }, [submit, setReplyDraft, enterForNewline] @@ -475,18 +480,29 @@ export const RoomInput = forwardRef( style={{ padding: `${config.space.S200} ${config.space.S300} 0` }} > setReplyDraft()} + onClick={() => setReplyDraft(undefined)} variant="SurfaceVariant" size="300" radii="300" > - + + + {getMemberDisplayName(room, replyDraft.userId) ?? + getMxIdLocalPart(replyDraft.userId) ?? + replyDraft.userId} + + + } + > + + {trimReplyFromBody(replyDraft.body)} + +
    ) @@ -518,7 +534,11 @@ export const RoomInput = forwardRef( alignOffset={-44} position="Top" align="End" - open={!!emojiBoardTab} + anchor={ + emojiBoardTab === undefined + ? undefined + : emojiBtnRef.current?.getBoundingClientRect() ?? undefined + } content={ ( /> } > - {(anchorRef) => ( - <> - {!hideStickerBtn && ( - setEmojiBoardTab(EmojiBoardTab.Sticker)} - variant="SurfaceVariant" - size="300" - radii="300" - > - - - )} - setEmojiBoardTab(EmojiBoardTab.Emoji)} - variant="SurfaceVariant" - size="300" - radii="300" - > - - - + {!hideStickerBtn && ( + setEmojiBoardTab(EmojiBoardTab.Sticker)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + )} + setEmojiBoardTab(EmojiBoardTab.Emoji)} + variant="SurfaceVariant" + size="300" + radii="300" + > + + )} diff --git a/src/app/organisms/room/RoomInputPlaceholder.css.ts b/src/app/features/room/RoomInputPlaceholder.css.ts similarity index 100% rename from src/app/organisms/room/RoomInputPlaceholder.css.ts rename to src/app/features/room/RoomInputPlaceholder.css.ts diff --git a/src/app/organisms/room/RoomInputPlaceholder.tsx b/src/app/features/room/RoomInputPlaceholder.tsx similarity index 100% rename from src/app/organisms/room/RoomInputPlaceholder.tsx rename to src/app/features/room/RoomInputPlaceholder.tsx diff --git a/src/app/organisms/room/RoomTimeline.css.ts b/src/app/features/room/RoomTimeline.css.ts similarity index 100% rename from src/app/organisms/room/RoomTimeline.css.ts rename to src/app/features/room/RoomTimeline.css.ts diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx similarity index 62% rename from src/app/organisms/room/RoomTimeline.tsx rename to src/app/features/room/RoomTimeline.tsx index 0c74de52..29b874fc 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/destructuring-assignment */ import React, { Dispatch, MouseEventHandler, @@ -22,7 +23,7 @@ import { RoomEvent, RoomEventHandlerMap, } from 'matrix-js-sdk'; -import parse, { HTMLReactParserOptions } from 'html-react-parser'; +import { HTMLReactParserOptions } from 'html-react-parser'; import classNames from 'classnames'; import { ReactEditor } from 'slate-react'; import { Editor } from 'slate'; @@ -52,7 +53,6 @@ import { isRoomId, isUserId, } from '../../utils/matrix'; -import { sanitizeCustomHtml } from '../../utils/sanitize'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useVirtualPaginator, ItemRange } from '../../hooks/useVirtualPaginator'; import { useAlive } from '../../hooks/useAlive'; @@ -62,24 +62,15 @@ import { CompactPlaceholder, Reply, MessageBase, - MessageDeletedContent, - MessageBrokenContent, MessageUnsupportedContent, - MessageEditedContent, - MessageEmptyContent, - AttachmentBox, - Attachment, - AttachmentContent, - AttachmentHeader, Time, - MessageBadEncryptedContent, MessageNotDecryptedContent, - MessageTextBody, + RedactedContent, + MSticker, + ImageContent, + EventContent, } from '../../components/message'; -import { - emojifyAndLinkify, - getReactCustomHtmlParser, -} from '../../plugins/react-custom-html-parser'; +import { getReactCustomHtmlParser } from '../../plugins/react-custom-html-parser'; import { canEditEvent, decryptAllTimelineEvent, @@ -90,35 +81,12 @@ import { getReactionContent, isMembershipChanged, reactionOrEditEvent, - trimReplyFromBody, } from '../../utils/room'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; -import { - openJoinAlias, - openProfileViewer, - selectRoom, - selectTab, -} from '../../../client/action/navigation'; -import { useForceUpdate } from '../../hooks/useForceUpdate'; -import { parseGeoUri, scaleYDimension } from '../../utils/common'; +import { openJoinAlias, openProfileViewer } from '../../../client/action/navigation'; import { useMatrixEventRenderer } from '../../hooks/useMatrixEventRenderer'; -import { useRoomMsgContentRenderer } from '../../hooks/useRoomMsgContentRenderer'; -import { IAudioContent, IImageContent, IVideoContent } from '../../../types/matrix/common'; -import { getBlobSafeMimeType } from '../../utils/mimeTypes'; -import { - ImageContent, - VideoContent, - FileHeader, - fileRenderer, - AudioContent, - Reactions, - EventContent, - Message, - Event, - EncryptedContent, - StickerContent, -} from './message'; +import { Reactions, Message, Event, EncryptedContent } from './message'; import { useMemberEventParser } from '../../hooks/useMemberEventParser'; import * as customHtmlCss from '../../styles/CustomHtml.css'; import { RoomIntro } from '../../components/room-intro'; @@ -132,22 +100,17 @@ import { getResizeObserverEntry, useResizeObserver } from '../../hooks/useResize import * as css from './RoomTimeline.css'; import { inSameDay, minuteDifference, timeDayMonthYear, today, yesterday } from '../../utils/time'; import { createMentionElement, isEmptyEditor, moveCursor } from '../../components/editor'; -import { roomIdToReplyDraftAtomFamily } from '../../state/roomInputDrafts'; -import { usePowerLevelsAPI } from '../../hooks/usePowerLevels'; -import { MessageEvent } from '../../../types/matrix/room'; +import { roomIdToReplyDraftAtomFamily } from '../../state/room/roomInputDrafts'; +import { usePowerLevelsAPI, usePowerLevelsContext } from '../../hooks/usePowerLevels'; +import { GetContentCallback, MessageEvent, StateEvent } from '../../../types/matrix/room'; import initMatrix from '../../../client/initMatrix'; import { useKeyDown } from '../../hooks/useKeyDown'; import cons from '../../../client/state/cons'; import { useDocumentFocusChange } from '../../hooks/useDocumentFocusChange'; -import { EMOJI_PATTERN, HTTP_URL_PATTERN, VARIATION_SELECTOR_PATTERN } from '../../utils/regex'; -import { UrlPreviewCard, UrlPreviewHolder } from './message/UrlPreviewCard'; - -// Thumbs up emoji found to have Variation Selector 16 at the end -// so included variation selector pattern in regex -const JUMBO_EMOJI_REG = new RegExp( - `^(((${EMOJI_PATTERN})|(:.+?:))(${VARIATION_SELECTOR_PATTERN}|\\s)*){1,10}$` -); -const URL_REG = new RegExp(HTTP_URL_PATTERN, 'g'); +import { RenderMessageContent } from '../../components/RenderMessageContent'; +import { Image } from '../../components/media'; +import { ImageViewer } from '../../components/image-viewer'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -474,11 +437,13 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const showUrlPreview = encryptedRoom ? encUrlPreview : urlPreview; const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId)); - const { canDoAction, canSendEvent, getPowerLevel } = usePowerLevelsAPI(); + const powerLevels = usePowerLevelsContext(); + const { canDoAction, canSendEvent, getPowerLevel } = usePowerLevelsAPI(powerLevels); const myPowerLevel = getPowerLevel(mx.getUserId() ?? ''); const canRedact = canDoAction('redact', myPowerLevel); const canSendReaction = canSendEvent(MessageEvent.Reaction, myPowerLevel); const [editId, setEditId] = useState(); + const { navigateRoom, navigateSpace } = useRoomNavigate(); const imagePackRooms: Room[] = useMemo(() => { const allParentSpaces = [ @@ -509,13 +474,15 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli smooth: true, }); - const focusItem = useRef<{ - index: number; - scrollTo: boolean; - highlight: boolean; - }>(); + const [focusItem, setFocusItem] = useState< + | { + index: number; + scrollTo: boolean; + highlight: boolean; + } + | undefined + >(); const alive = useAlive(); - const [, forceUpdate] = useForceUpdate(); const htmlReactParserOptions = useMemo( () => @@ -537,14 +504,14 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli return; } if (isRoomId(mentionId) && mx.getRoom(mentionId)) { - if (mx.getRoom(mentionId)?.isSpaceRoom()) selectTab(mentionId); - else selectRoom(mentionId); + if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); + else navigateRoom(mentionId); return; } openJoinAlias(mentionId); }, }), - [mx, room] + [mx, room, navigateRoom, navigateSpace] ); const parseMemberEvent = useMemberEventParser(); @@ -594,11 +561,11 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (!alive()) return; const evLength = getTimelinesEventsCount(lTimelines); - focusItem.current = { + setFocusItem({ index: evtAbsIndex, scrollTo: true, highlight: evtId !== readUptoEventIdRef.current, - }; + }); setTimeline({ linkedTimelines: lTimelines, range: { @@ -797,18 +764,23 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }, [room, unreadInfo, scrollToItem]); // scroll to focused message - const focusItm = focusItem.current; useLayoutEffect(() => { - if (focusItm && focusItm.scrollTo) { - scrollToItem(focusItm.index, { + if (focusItem && focusItem.scrollTo) { + scrollToItem(focusItem.index, { behavior: 'instant', align: 'center', stopInView: true, }); } - focusItem.current = undefined; - }, [focusItm, scrollToItem]); + setTimeout(() => { + if (!alive()) return; + setFocusItem((currentItem) => { + if (currentItem === focusItem) return undefined; + return currentItem; + }); + }, 2000); + }, [alive, focusItem, scrollToItem]); // scroll to bottom of timeline const scrollToBottomCount = scrollToBottomRef.current.count; @@ -879,18 +851,17 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli align: 'center', stopInView: true, }); - focusItem.current = { + setFocusItem({ index: absoluteIndex, scrollTo: false, highlight: true, - }; - forceUpdate(); + }); } else { setTimeline(getEmptyTimeline()); loadEventTimeline(replyId); } }, - [room, timeline, scrollToItem, loadEventTimeline, forceUpdate] + [room, timeline, scrollToItem, loadEventTimeline] ); const handleUserClick: MouseEventHandler = useCallback( @@ -989,590 +960,398 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli [editor] ); - const renderBody = (body: string, customBody?: string) => { - if (body === '') ; - if (customBody) { - if (customBody === '') ; - return parse(sanitizeCustomHtml(customBody), htmlReactParserOptions); - } - return emojifyAndLinkify(body, true); - }; + const renderMatrixEvent = useMatrixEventRenderer< + [string, MatrixEvent, number, EventTimelineSet, boolean] + >( + { + [MessageEvent.RoomMessage]: (mEventId, mEvent, item, timelineSet, collapse) => { + const reactionRelations = getEventReactions(timelineSet, mEventId); + const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); + const hasReactions = reactions && reactions.length > 0; + const { replyEventId } = mEvent; + const highlighted = focusItem?.index === item && focusItem.highlight; - const renderRoomMsgContent = useRoomMsgContentRenderer<[EventTimelineSet]>({ - renderText: (mEventId, mEvent, timelineSet) => { - const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); - const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); + const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); + const getContent = (() => + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent()) as GetContentCallback; - if (typeof body !== 'string') return null; - const trimmedBody = trimReplyFromBody(body); - const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); - const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; - - return ( - <> - - {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - - {urls && urls.length > 0 && ( - - {urls.map((url) => ( - - ))} - - )} - - ); - }, - renderEmote: (mEventId, mEvent, timelineSet) => { - const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); - const { body, formatted_body: customBody } = - editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); - const senderId = mEvent.getSender() ?? ''; - - const senderDisplayName = - getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId; - - if (typeof body !== 'string') return null; - const trimmedBody = trimReplyFromBody(body); - const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); - const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; - - return ( - <> - - {`${senderDisplayName} `} - {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - - {urls && urls.length > 0 && ( - - {urls.map((url) => ( - - ))} - - )} - - ); - }, - renderNotice: (mEventId, mEvent, timelineSet) => { - const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); - const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); - - if (typeof body !== 'string') return null; - const trimmedBody = trimReplyFromBody(body); - const urlsMatch = showUrlPreview && trimmedBody.match(URL_REG); - const urls = urlsMatch ? [...new Set(urlsMatch)] : undefined; - - return ( - <> - - {renderBody(trimmedBody, typeof customBody === 'string' ? customBody : undefined)} - {!!editedEvent && } - - {urls && urls.length > 0 && ( - - {urls.map((url) => ( - - ))} - - )} - - ); - }, - renderImage: (mEventId, mEvent) => { - const content = mEvent.getContent(); - const imgInfo = content?.info; - const mxcUrl = content.file?.url ?? content.url; - if (typeof mxcUrl !== 'string') { - return null; - } - const height = scaleYDimension(imgInfo?.w || 400, 400, imgInfo?.h || 400); - - return ( - - - - - - ); - }, - renderVideo: (mEventId, mEvent) => { - const content = mEvent.getContent(); - - const videoInfo = content?.info; - const mxcUrl = content.file?.url ?? content.url; - const safeMimeType = getBlobSafeMimeType(videoInfo?.mimetype ?? ''); - - if (!videoInfo || !safeMimeType.startsWith('video') || typeof mxcUrl !== 'string') { - if (mxcUrl) { - return fileRenderer(mEventId, mEvent); - } - return null; - } - - const height = scaleYDimension(videoInfo.w || 400, 400, videoInfo.h || 400); - - return ( - - - - - - ); - }, - renderAudio: (mEventId, mEvent) => { - const content = mEvent.getContent(); - - const audioInfo = content?.info; - const mxcUrl = content.file?.url ?? content.url; - const safeMimeType = getBlobSafeMimeType(audioInfo?.mimetype ?? ''); - - if (!audioInfo || !safeMimeType.startsWith('audio') || typeof mxcUrl !== 'string') { - if (mxcUrl) { - return fileRenderer(mEventId, mEvent); - } - return null; - } - - return ( - - - - - - - - - - - ); - }, - renderLocation: (mEventId, mEvent) => { - const content = mEvent.getContent(); - const geoUri = content.geo_uri; - if (typeof geoUri !== 'string') return null; - const location = parseGeoUri(geoUri); - return ( - - {geoUri} - } - > - Open Location - - - ); - }, - renderFile: fileRenderer, - renderBadEncrypted: () => ( - - - - ), - renderUnsupported: (mEventId, mEvent) => { - if (mEvent.isRedacted()) { - const redactedEvt = mEvent.getRedactionEvent(); - const reason = - redactedEvt && 'content' in redactedEvt ? redactedEvt.content.reason : undefined; + const senderId = mEvent.getSender() ?? ''; + const senderDisplayName = + getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId; return ( - - - + + ) + } + reactions={ + reactionRelations && ( + + ) + } + > + {mEvent.isRedacted() ? ( + + ) : ( + + )} + ); - } - return ( - - - - ); - }, - renderBrokenFallback: (mEventId, mEvent) => { - if (mEvent.isRedacted()) { - const redactedEvt = mEvent.getRedactionEvent(); - const reason = - redactedEvt && 'content' in redactedEvt ? redactedEvt.content.reason : undefined; + }, + [MessageEvent.RoomMessageEncrypted]: (mEventId, mEvent, item, timelineSet, collapse) => { + const reactionRelations = getEventReactions(timelineSet, mEventId); + const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); + const hasReactions = reactions && reactions.length > 0; + const { replyEventId } = mEvent; + const highlighted = focusItem?.index === item && focusItem.highlight; + return ( - - - - ); - } - return ( - - - - ); - }, - }); + + ) + } + reactions={ + reactionRelations && ( + + ) + } + > + + {() => { + if (mEvent.isRedacted()) return ; + if (mEvent.getType() === MessageEvent.Sticker) + return ( + ( + } + renderViewer={(p) => } + /> + )} + /> + ); + if (mEvent.getType() === MessageEvent.RoomMessage) { + const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); + const getContent = (() => + editedEvent?.getContent()['m.new_content'] ?? + mEvent.getContent()) as GetContentCallback; - const renderMatrixEvent = useMatrixEventRenderer<[number, EventTimelineSet, boolean]>({ - renderRoomMessage: (mEventId, mEvent, item, timelineSet, collapse) => { - const reactionRelations = getEventReactions(timelineSet, mEventId); - const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); - const hasReactions = reactions && reactions.length > 0; - const { replyEventId } = mEvent; - const highlighted = focusItem.current?.index === item && focusItem.current.highlight; - - return ( - - ) - } - reactions={ - reactionRelations && ( - - ) - } - > - {renderRoomMsgContent(mEventId, mEvent, timelineSet)} - - ); - }, - renderRoomEncrypted: (mEventId, mEvent, item, timelineSet, collapse) => { - const reactionRelations = getEventReactions(timelineSet, mEventId); - const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); - const hasReactions = reactions && reactions.length > 0; - const { replyEventId } = mEvent; - const highlighted = focusItem.current?.index === item && focusItem.current.highlight; - - return ( - - ) - } - reactions={ - reactionRelations && ( - - ) - } - > - - {() => { - if (mEvent.isRedacted()) return ; - if (mEvent.getType() === MessageEvent.Sticker) - return ; - if (mEvent.getType() === MessageEvent.RoomMessage) - return renderRoomMsgContent(mEventId, mEvent, timelineSet); - if (mEvent.getType() === MessageEvent.RoomMessageEncrypted) + const senderId = mEvent.getSender() ?? ''; + const senderDisplayName = + getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId; + return ( + + ); + } + if (mEvent.getType() === MessageEvent.RoomMessageEncrypted) + return ( + + + + ); return ( - + ); - return ( - - - - ); - }} - - - ); - }, - renderSticker: (mEventId, mEvent, item, timelineSet, collapse) => { - const reactionRelations = getEventReactions(timelineSet, mEventId); - const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); - const hasReactions = reactions && reactions.length > 0; - const highlighted = focusItem.current?.index === item && focusItem.current.highlight; + }} + + + ); + }, + [MessageEvent.Sticker]: (mEventId, mEvent, item, timelineSet, collapse) => { + const reactionRelations = getEventReactions(timelineSet, mEventId); + const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); + const hasReactions = reactions && reactions.length > 0; + const highlighted = focusItem?.index === item && focusItem.highlight; - return ( - + ) + } + > + {mEvent.isRedacted() ? ( + + ) : ( + ( + } + renderViewer={(p) => } + /> + )} /> - ) - } - > - - - ); + )} + + ); + }, + [StateEvent.RoomMember]: (mEventId, mEvent, item) => { + const membershipChanged = isMembershipChanged(mEvent); + if (membershipChanged && hideMembershipEvents) return null; + if (!membershipChanged && hideNickAvatarEvents) return null; + + const highlighted = focusItem?.index === item && focusItem.highlight; + const parsed = parseMemberEvent(mEvent); + + const timeJSX =
    + } + /> + + ); + }, + [StateEvent.RoomName]: (mEventId, mEvent, item) => { + const highlighted = focusItem?.index === item && focusItem.highlight; + const senderId = mEvent.getSender() ?? ''; + const senderName = getMemberDisplayName(room, senderId) || getMxIdLocalPart(senderId); + + const timeJSX =
    ); @@ -706,11 +758,36 @@ export const Message = as<'div', MessageProps>( const tag = (evt.target as any).tagName; if (typeof tag === 'string' && tag.toLowerCase() === 'a') return; evt.preventDefault(); - setMenu(true); + setMenuAnchor({ + x: evt.clientX, + y: evt.clientY, + width: 0, + height: 0, + }); + }; + + const handleOpenMenu: MouseEventHandler = (evt) => { + const target = evt.currentTarget.parentElement?.parentElement ?? evt.currentTarget; + setMenuAnchor(target.getBoundingClientRect()); }; const closeMenu = () => { - setMenu(false); + setMenuAnchor(undefined); + }; + + const handleOpenEmojiBoard: MouseEventHandler = (evt) => { + const target = evt.currentTarget.parentElement?.parentElement ?? evt.currentTarget; + setEmojiBoardAnchor(target.getBoundingClientRect()); + }; + const handleAddReactions: MouseEventHandler = () => { + const rect = menuAnchor; + closeMenu(); + // open it with timeout because closeMenu + // FocusTrap will return focus from emojiBoard + + setTimeout(() => { + setEmojiBoardAnchor(rect); + }, 100); }; return ( @@ -720,22 +797,22 @@ export const Message = as<'div', MessageProps>( space={messageSpacing} collapse={collapse} highlight={highlight} - selected={menu || emojiBoard} + selected={!!menuAnchor || !!emojiBoardAnchor} {...props} {...hoverProps} {...focusWithinProps} ref={ref} > - {!edit && (hover || menu || emojiBoard) && ( + {!edit && (hover || !!menuAnchor || !!emojiBoardAnchor) && (
    {canSendReaction && ( ( allowTextCustomEmoji onEmojiSelect={(key) => { onReactionToggle(mEvent.getId()!, key); - setEmojiBoard(false); + setEmojiBoardAnchor(undefined); }} onCustomEmojiSelect={(mxc, shortcode) => { onReactionToggle(mEvent.getId()!, mxc, shortcode); - setEmojiBoard(false); + setEmojiBoardAnchor(undefined); }} requestClose={() => { - setEmojiBoard(false); + setEmojiBoardAnchor(undefined); }} /> } > - {(anchorRef) => ( - setEmojiBoard(true)} - variant="SurfaceVariant" - size="300" - radii="300" - aria-pressed={emojiBoard} - > - - - )} + + + )} ( )} setMenu(false), + onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', }} > - + {canSendReaction && ( { @@ -818,12 +892,7 @@ export const Message = as<'div', MessageProps>( size="300" after={} radii="300" - onClick={() => { - closeMenu(); - // open it with timeout because closeMenu - // FocusTrap will return focus from emojiBoard - setTimeout(() => setEmojiBoard(true), 100); - }} + onClick={handleAddReactions} > ( onClose={closeMenu} /> + {((!mEvent.isRedacted() && canDelete) || mEvent.getSender() !== mx.getUserId()) && ( @@ -915,18 +985,15 @@ export const Message = as<'div', MessageProps>( } > - {(targetRef) => ( - setMenu((v) => !v)} - aria-pressed={menu} - > - - - )} + + + @@ -967,7 +1034,7 @@ export const Event = as<'div', EventProps>( const [hover, setHover] = useState(false); const { hoverProps } = useHover({ onHoverChange: setHover }); const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setHover }); - const [menu, setMenu] = useState(false); + const [menuAnchor, setMenuAnchor] = useState(); const stateEvent = typeof mEvent.getStateKey() === 'string'; const handleContextMenu: MouseEventHandler = (evt) => { @@ -975,11 +1042,21 @@ export const Event = as<'div', EventProps>( const tag = (evt.target as any).tagName; if (typeof tag === 'string' && tag.toLowerCase() === 'a') return; evt.preventDefault(); - setMenu(true); + setMenuAnchor({ + x: evt.clientX, + y: evt.clientY, + width: 0, + height: 0, + }); + }; + + const handleOpenMenu: MouseEventHandler = (evt) => { + const target = evt.currentTarget.parentElement?.parentElement ?? evt.currentTarget; + setMenuAnchor(target.getBoundingClientRect()); }; const closeMenu = () => { - setMenu(false); + setMenuAnchor(undefined); }; return ( @@ -989,26 +1066,26 @@ export const Event = as<'div', EventProps>( space={messageSpacing} autoCollapse highlight={highlight} - selected={menu} + selected={!!menuAnchor} {...props} {...hoverProps} {...focusWithinProps} ref={ref} > - {(hover || menu) && ( + {(hover || !!menuAnchor) && (
    setMenu(false), + onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', @@ -1022,6 +1099,7 @@ export const Event = as<'div', EventProps>( onClose={closeMenu} /> + {((!mEvent.isRedacted() && canDelete && !stateEvent) || (mEvent.getSender() !== mx.getUserId() && !stateEvent)) && ( @@ -1049,18 +1127,15 @@ export const Event = as<'div', EventProps>( } > - {(targetRef) => ( - setMenu((v) => !v)} - aria-pressed={menu} - > - - - )} + + + diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/features/room/message/MessageEditor.tsx similarity index 89% rename from src/app/organisms/room/message/MessageEditor.tsx rename to src/app/features/room/message/MessageEditor.tsx index 006b46a8..0c995030 100644 --- a/src/app/organisms/room/message/MessageEditor.tsx +++ b/src/app/features/room/message/MessageEditor.tsx @@ -1,5 +1,24 @@ -import React, { KeyboardEventHandler, useCallback, useEffect, useState } from 'react'; -import { Box, Chip, Icon, IconButton, Icons, Line, PopOut, Spinner, Text, as, config } from 'folds'; +import React, { + KeyboardEventHandler, + MouseEventHandler, + useCallback, + useEffect, + useState, +} from 'react'; +import { + Box, + Chip, + Icon, + IconButton, + Icons, + Line, + PopOut, + RectCords, + Spinner, + Text, + as, + config, +} from 'folds'; import { Editor, Transforms } from 'slate'; import { ReactEditor } from 'slate-react'; import { IContent, MatrixEvent, RelationType, Room } from 'matrix-js-sdk'; @@ -258,13 +277,13 @@ export const MessageEditor = as<'div', MessageEditorProps>( > - - {(emojiBoard: boolean, setEmojiBoard) => ( + + {(anchor: RectCords | undefined, setAnchor) => ( ( onEmojiSelect={handleEmoticonSelect} onCustomEmojiSelect={handleEmoticonSelect} requestClose={() => { - setEmojiBoard(false); + setAnchor(undefined); if (!mobileOrTablet()) ReactEditor.focus(editor); }} /> } > - {(anchorRef) => ( - setEmojiBoard(true)} - variant="SurfaceVariant" - size="300" - radii="300" - > - - - )} + + setAnchor( + evt.currentTarget.getBoundingClientRect() + )) as MouseEventHandler + } + variant="SurfaceVariant" + size="300" + radii="300" + > + + )} diff --git a/src/app/organisms/room/message/Reactions.tsx b/src/app/features/room/message/Reactions.tsx similarity index 100% rename from src/app/organisms/room/message/Reactions.tsx rename to src/app/features/room/message/Reactions.tsx diff --git a/src/app/features/room/message/index.ts b/src/app/features/room/message/index.ts new file mode 100644 index 00000000..d79e2aab --- /dev/null +++ b/src/app/features/room/message/index.ts @@ -0,0 +1,3 @@ +export * from './Reactions'; +export * from './Message'; +export * from './EncryptedContent'; diff --git a/src/app/features/room/message/styles.css.ts b/src/app/features/room/message/styles.css.ts new file mode 100644 index 00000000..b87cb505 --- /dev/null +++ b/src/app/features/room/message/styles.css.ts @@ -0,0 +1,50 @@ +import { style } from '@vanilla-extract/css'; +import { DefaultReset, config, toRem } from 'folds'; + +export const MessageBase = style({ + position: 'relative', +}); + +export const MessageOptionsBase = style([ + DefaultReset, + { + position: 'absolute', + top: toRem(-30), + right: 0, + zIndex: 1, + }, +]); +export const MessageOptionsBar = style([ + DefaultReset, + { + padding: config.space.S100, + }, +]); + +export const MessageAvatar = style({ + cursor: 'pointer', +}); + +export const MessageQuickReaction = style({ + minWidth: toRem(32), +}); + +export const MessageMenuGroup = style({ + padding: config.space.S100, +}); + +export const MessageMenuItemText = style({ + flexGrow: 1, +}); + +export const ReactionsContainer = style({ + selectors: { + '&:empty': { + display: 'none', + }, + }, +}); + +export const ReactionsTooltipText = style({ + wordBreak: 'break-word', +}); diff --git a/src/app/organisms/room/msgContent.ts b/src/app/features/room/msgContent.ts similarity index 98% rename from src/app/organisms/room/msgContent.ts rename to src/app/features/room/msgContent.ts index 0760ec9e..103e8dcd 100644 --- a/src/app/organisms/room/msgContent.ts +++ b/src/app/features/room/msgContent.ts @@ -10,7 +10,7 @@ import { loadVideoElement, } from '../../utils/dom'; import { encryptFile, getImageInfo, getThumbnailContent, getVideoInfo } from '../../utils/matrix'; -import { TUploadItem } from '../../state/roomInputDrafts'; +import { TUploadItem } from '../../state/room/roomInputDrafts'; import { encodeBlurHash } from '../../utils/blurHash'; import { scaleYDimension } from '../../utils/common'; diff --git a/src/app/organisms/room/reaction-viewer/ReactionViewer.css.ts b/src/app/features/room/reaction-viewer/ReactionViewer.css.ts similarity index 100% rename from src/app/organisms/room/reaction-viewer/ReactionViewer.css.ts rename to src/app/features/room/reaction-viewer/ReactionViewer.css.ts diff --git a/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx b/src/app/features/room/reaction-viewer/ReactionViewer.tsx similarity index 89% rename from src/app/organisms/room/reaction-viewer/ReactionViewer.tsx rename to src/app/features/room/reaction-viewer/ReactionViewer.tsx index 7bcc0ccf..1c1b79a7 100644 --- a/src/app/organisms/room/reaction-viewer/ReactionViewer.tsx +++ b/src/app/features/room/reaction-viewer/ReactionViewer.tsx @@ -2,8 +2,6 @@ import React, { useCallback, useState } from 'react'; import classNames from 'classnames'; import { Avatar, - AvatarFallback, - AvatarImage, Box, Header, Icon, @@ -22,11 +20,11 @@ import { getMemberDisplayName } from '../../../utils/room'; import { eventWithShortcode, getMxIdLocalPart } from '../../../utils/matrix'; import * as css from './ReactionViewer.css'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import colorMXID from '../../../../util/colorMXID'; import { openProfileViewer } from '../../../../client/action/navigation'; import { useRelations } from '../../../hooks/useRelations'; import { Reaction } from '../../../components/message'; import { getHexcodeForEmoji, getShortcodeFor } from '../../../plugins/emoji'; +import { UserAvatar } from '../../../components/user-avatar'; export type ReactionViewerProps = { room: Room; @@ -129,18 +127,12 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( }} before={ - {avatarUrl ? ( - - ) : ( - - {name[0]} - - )} + } + /> } > diff --git a/src/app/organisms/room/reaction-viewer/index.ts b/src/app/features/room/reaction-viewer/index.ts similarity index 100% rename from src/app/organisms/room/reaction-viewer/index.ts rename to src/app/features/room/reaction-viewer/index.ts diff --git a/src/app/hooks/router/useDirectSelected.ts b/src/app/hooks/router/useDirectSelected.ts new file mode 100644 index 00000000..adb2851e --- /dev/null +++ b/src/app/hooks/router/useDirectSelected.ts @@ -0,0 +1,22 @@ +import { useMatch } from 'react-router-dom'; +import { getDirectCreatePath, getDirectPath } from '../../pages/pathUtils'; + +export const useDirectSelected = (): boolean => { + const directMatch = useMatch({ + path: getDirectPath(), + caseSensitive: true, + end: false, + }); + + return !!directMatch; +}; + +export const useDirectCreateSelected = (): boolean => { + const match = useMatch({ + path: getDirectCreatePath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; diff --git a/src/app/hooks/router/useExploreSelected.ts b/src/app/hooks/router/useExploreSelected.ts new file mode 100644 index 00000000..f0ffdc86 --- /dev/null +++ b/src/app/hooks/router/useExploreSelected.ts @@ -0,0 +1,28 @@ +import { useMatch, useParams } from 'react-router-dom'; +import { getExploreFeaturedPath, getExplorePath } from '../../pages/pathUtils'; + +export const useExploreSelected = (): boolean => { + const match = useMatch({ + path: getExplorePath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useExploreFeaturedSelected = (): boolean => { + const match = useMatch({ + path: getExploreFeaturedPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useExploreServer = (): string | undefined => { + const { server } = useParams(); + + return server; +}; diff --git a/src/app/hooks/router/useHomeSelected.ts b/src/app/hooks/router/useHomeSelected.ts new file mode 100644 index 00000000..75802601 --- /dev/null +++ b/src/app/hooks/router/useHomeSelected.ts @@ -0,0 +1,47 @@ +import { useMatch } from 'react-router-dom'; +import { + getHomeCreatePath, + getHomeJoinPath, + getHomePath, + getHomeSearchPath, +} from '../../pages/pathUtils'; + +export const useHomeSelected = (): boolean => { + const homeMatch = useMatch({ + path: getHomePath(), + caseSensitive: true, + end: false, + }); + + return !!homeMatch; +}; + +export const useHomeCreateSelected = (): boolean => { + const match = useMatch({ + path: getHomeCreatePath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useHomeJoinSelected = (): boolean => { + const match = useMatch({ + path: getHomeJoinPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useHomeSearchSelected = (): boolean => { + const match = useMatch({ + path: getHomeSearchPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; diff --git a/src/app/hooks/router/useInbox.ts b/src/app/hooks/router/useInbox.ts new file mode 100644 index 00000000..de8d3d69 --- /dev/null +++ b/src/app/hooks/router/useInbox.ts @@ -0,0 +1,36 @@ +import { useMatch } from 'react-router-dom'; +import { + getInboxInvitesPath, + getInboxNotificationsPath, + getInboxPath, +} from '../../pages/pathUtils'; + +export const useInboxSelected = (): boolean => { + const match = useMatch({ + path: getInboxPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useInboxNotificationsSelected = (): boolean => { + const match = useMatch({ + path: getInboxNotificationsPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useInboxInvitesSelected = (): boolean => { + const match = useMatch({ + path: getInboxInvitesPath(), + caseSensitive: true, + end: false, + }); + + return !!match; +}; diff --git a/src/app/hooks/router/useSelectedRoom.ts b/src/app/hooks/router/useSelectedRoom.ts new file mode 100644 index 00000000..6d0ee4f1 --- /dev/null +++ b/src/app/hooks/router/useSelectedRoom.ts @@ -0,0 +1,15 @@ +import { useParams } from 'react-router-dom'; +import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix'; +import { useMatrixClient } from '../useMatrixClient'; + +export const useSelectedRoom = (): string | undefined => { + const mx = useMatrixClient(); + + const { roomIdOrAlias } = useParams(); + const roomId = + roomIdOrAlias && isRoomAlias(roomIdOrAlias) + ? getCanonicalAliasRoomId(mx, roomIdOrAlias) + : roomIdOrAlias; + + return roomId; +}; diff --git a/src/app/hooks/router/useSelectedSpace.ts b/src/app/hooks/router/useSelectedSpace.ts new file mode 100644 index 00000000..2e8e73a0 --- /dev/null +++ b/src/app/hooks/router/useSelectedSpace.ts @@ -0,0 +1,37 @@ +import { useMatch, useParams } from 'react-router-dom'; +import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix'; +import { useMatrixClient } from '../useMatrixClient'; +import { getSpaceLobbyPath, getSpaceSearchPath } from '../../pages/pathUtils'; + +export const useSelectedSpace = (): string | undefined => { + const mx = useMatrixClient(); + + const { spaceIdOrAlias } = useParams(); + + const spaceId = + spaceIdOrAlias && isRoomAlias(spaceIdOrAlias) + ? getCanonicalAliasRoomId(mx, spaceIdOrAlias) + : spaceIdOrAlias; + + return spaceId; +}; + +export const useSpaceLobbySelected = (spaceIdOrAlias: string): boolean => { + const match = useMatch({ + path: getSpaceLobbyPath(spaceIdOrAlias), + caseSensitive: true, + end: false, + }); + + return !!match; +}; + +export const useSpaceSearchSelected = (spaceIdOrAlias: string): boolean => { + const match = useMatch({ + path: getSpaceSearchPath(spaceIdOrAlias), + caseSensitive: true, + end: false, + }); + + return !!match; +}; diff --git a/src/app/hooks/useAccountDataCallback.ts b/src/app/hooks/useAccountDataCallback.ts new file mode 100644 index 00000000..e12f1c4d --- /dev/null +++ b/src/app/hooks/useAccountDataCallback.ts @@ -0,0 +1,14 @@ +import { ClientEvent, ClientEventHandlerMap, MatrixClient } from 'matrix-js-sdk'; +import { useEffect } from 'react'; + +export const useAccountDataCallback = ( + mx: MatrixClient, + onAccountData: ClientEventHandlerMap[ClientEvent.AccountData] +) => { + useEffect(() => { + mx.on(ClientEvent.AccountData, onAccountData); + return () => { + mx.removeListener(ClientEvent.AccountData, onAccountData); + }; + }, [mx, onAccountData]); +}; diff --git a/src/app/hooks/useAsyncCallback.ts b/src/app/hooks/useAsyncCallback.ts index fc7dca63..431f0b32 100644 --- a/src/app/hooks/useAsyncCallback.ts +++ b/src/app/hooks/useAsyncCallback.ts @@ -68,9 +68,11 @@ export const useAsyncCallback = ( throw new Error('AsyncCallbackHook: Request replaced!'); } if (alive()) { - setState({ - status: AsyncStatus.Success, - data, + queueMicrotask(() => { + setState({ + status: AsyncStatus.Success, + data, + }); }); } return data; @@ -78,10 +80,13 @@ export const useAsyncCallback = ( if (currentReqNumber !== reqNumberRef.current) { throw new Error('AsyncCallbackHook: Request replaced!'); } + if (alive()) { - setState({ - status: AsyncStatus.Error, - error: e as TError, + queueMicrotask(() => { + setState({ + status: AsyncStatus.Error, + error: e as TError, + }); }); } throw e; diff --git a/src/app/hooks/useCapabilities.ts b/src/app/hooks/useCapabilities.ts new file mode 100644 index 00000000..b2fbd640 --- /dev/null +++ b/src/app/hooks/useCapabilities.ts @@ -0,0 +1,12 @@ +import { Capabilities } from 'matrix-js-sdk'; +import { createContext, useContext } from 'react'; + +const CapabilitiesContext = createContext(null); + +export const CapabilitiesProvider = CapabilitiesContext.Provider; + +export function useCapabilities(): Capabilities { + const capabilities = useContext(CapabilitiesContext); + if (!capabilities) throw new Error('Capabilities are not provided!'); + return capabilities; +} diff --git a/src/app/hooks/useCategoryHandler.ts b/src/app/hooks/useCategoryHandler.ts new file mode 100644 index 00000000..086902d6 --- /dev/null +++ b/src/app/hooks/useCategoryHandler.ts @@ -0,0 +1,27 @@ +import { MouseEventHandler } from 'react'; + +type CategoryAction = + | { + type: 'PUT'; + categoryId: string; + } + | { + type: 'DELETE'; + categoryId: string; + }; +export const useCategoryHandler = ( + setAtom: (action: CategoryAction) => void, + closed: (categoryId: string) => boolean +) => { + const handleCategoryClick: MouseEventHandler = (evt) => { + const categoryId = evt.currentTarget.getAttribute('data-category-id'); + if (!categoryId) return; + if (closed(categoryId)) { + setAtom({ type: 'DELETE', categoryId }); + return; + } + setAtom({ type: 'PUT', categoryId }); + }; + + return handleCategoryClick; +}; diff --git a/src/app/hooks/useClientConfig.ts b/src/app/hooks/useClientConfig.ts index 8406668d..e5fc6cc6 100644 --- a/src/app/hooks/useClientConfig.ts +++ b/src/app/hooks/useClientConfig.ts @@ -1,14 +1,23 @@ import { createContext, useContext } from 'react'; +export type HashRouterConfig = { + enabled?: boolean; + basename?: string; +}; + export type ClientConfig = { defaultHomeserver?: number; homeserverList?: string[]; allowCustomHomeservers?: boolean; - hashRouter?: { - enabled?: boolean; - basename?: string; + featuredCommunities?: { + openAsDefault?: boolean; + spaces?: string[]; + rooms?: string[]; + servers?: string[]; }; + + hashRouter?: HashRouterConfig; }; const ClientConfigContext = createContext(null); diff --git a/src/app/hooks/useCommands.ts b/src/app/hooks/useCommands.ts index ad464c63..aadbf534 100644 --- a/src/app/hooks/useCommands.ts +++ b/src/app/hooks/useCommands.ts @@ -1,9 +1,9 @@ import { MatrixClient, Room } from 'matrix-js-sdk'; import { useMemo } from 'react'; -import { hasDMWith, isRoomAlias, isRoomId, isUserId } from '../utils/matrix'; -import { selectRoom } from '../../client/action/navigation'; +import { getDMRoomFor, isRoomAlias, isRoomId, isUserId } from '../utils/matrix'; import { hasDevices } from '../../util/matrixUtil'; import * as roomActions from '../../client/action/room'; +import { useRoomNavigate } from './useRoomNavigate'; export const SHRUG = '¯\\_(ツ)_/¯'; @@ -59,6 +59,8 @@ export type CommandContent = { export type CommandRecord = Record; export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { + const { navigateRoom } = useRoomNavigate(); + const commands: CommandRecord = useMemo( () => ({ [Command.Me]: { @@ -84,16 +86,16 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { const userIds = rawIds.filter((id) => isUserId(id) && id !== mx.getUserId()); if (userIds.length === 0) return; if (userIds.length === 1) { - const dmRoomId = hasDMWith(mx, userIds[0]); + const dmRoomId = getDMRoomFor(mx, userIds[0])?.roomId; if (dmRoomId) { - selectRoom(dmRoomId); + navigateRoom(dmRoomId); return; } } const devices = await Promise.all(userIds.map(hasDevices)); const isEncrypt = devices.every((hasDevice) => hasDevice); const result = await roomActions.createDM(userIds, isEncrypt); - selectRoom(result.room_id); + navigateRoom(result.room_id); }, }, [Command.Join]: { @@ -212,7 +214,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { }, }, }), - [mx, room] + [mx, room, navigateRoom] ); return commands; diff --git a/src/app/hooks/useElementSizeObserver.ts b/src/app/hooks/useElementSizeObserver.ts new file mode 100644 index 00000000..da563c10 --- /dev/null +++ b/src/app/hooks/useElementSizeObserver.ts @@ -0,0 +1,23 @@ +import { useCallback } from 'react'; +import { getResizeObserverEntry, useResizeObserver } from './useResizeObserver'; + +export const useElementSizeObserver = ( + element: () => T | null, + onResize: (width: number, height: number, element: T) => void +) => { + useResizeObserver( + useCallback( + (entries) => { + const target = element(); + if (!target) return; + const targetEntry = getResizeObserverEntry(target, entries); + if (targetEntry) { + const { clientWidth, clientHeight } = targetEntry.target; + onResize(clientWidth, clientHeight, target); + } + }, + [element, onResize] + ), + element + ); +}; diff --git a/src/app/hooks/useInterval.ts b/src/app/hooks/useInterval.ts new file mode 100644 index 00000000..161af394 --- /dev/null +++ b/src/app/hooks/useInterval.ts @@ -0,0 +1,24 @@ +import { useEffect, useMemo } from 'react'; + +export type IntervalCallback = () => void; + +/** + * @param callback interval callback. + * @param ms interval time in milliseconds. negative value will stop the interval. + * @returns interval id or undefined if not running. + */ +export const useInterval = (callback: IntervalCallback, ms: number): number | undefined => { + const id = useMemo(() => { + if (ms < 0) return undefined; + return window.setInterval(callback, ms); + }, [callback, ms]); + + useEffect( + () => () => { + window.clearInterval(id); + }, + [id] + ); + + return id; +}; diff --git a/src/app/hooks/useJoinedRoomId.ts b/src/app/hooks/useJoinedRoomId.ts new file mode 100644 index 00000000..857defa8 --- /dev/null +++ b/src/app/hooks/useJoinedRoomId.ts @@ -0,0 +1,19 @@ +import { useMemo } from 'react'; +import { useMatrixClient } from './useMatrixClient'; + +import { getCanonicalAliasRoomId, isRoomAlias } from '../utils/matrix'; + +export const useJoinedRoomId = (allRooms: string[], roomIdOrAlias: string): string | undefined => { + const mx = useMatrixClient(); + + const joinedRoomId = useMemo(() => { + const roomId = isRoomAlias(roomIdOrAlias) + ? getCanonicalAliasRoomId(mx, roomIdOrAlias) + : roomIdOrAlias; + + if (roomId && allRooms.includes(roomId)) return roomId; + return undefined; + }, [mx, allRooms, roomIdOrAlias]); + + return joinedRoomId; +}; diff --git a/src/app/hooks/useLocalRoomSummary.ts b/src/app/hooks/useLocalRoomSummary.ts new file mode 100644 index 00000000..46f81569 --- /dev/null +++ b/src/app/hooks/useLocalRoomSummary.ts @@ -0,0 +1,44 @@ +import { GuestAccess, HistoryVisibility, JoinRule, Room } from 'matrix-js-sdk'; +import { getStateEvent } from '../utils/room'; +import { StateEvent } from '../../types/matrix/room'; + +export type LocalRoomSummary = { + roomId: string; + name: string; + topic?: string; + avatarUrl?: string; + canonicalAlias?: string; + worldReadable?: boolean; + guestCanJoin?: boolean; + memberCount?: number; + roomType?: string; + joinRule?: JoinRule; +}; +export const useLocalRoomSummary = (room: Room): LocalRoomSummary => { + const topicEvent = getStateEvent(room, StateEvent.RoomTopic); + const topicContent = topicEvent?.getContent(); + const topic = + topicContent && typeof topicContent.topic === 'string' ? topicContent.topic : undefined; + + const historyEvent = getStateEvent(room, StateEvent.RoomHistoryVisibility); + const historyContent = historyEvent?.getContent(); + const worldReadable = + historyContent && typeof historyContent.history_visibility === 'string' + ? historyContent.history_visibility === HistoryVisibility.WorldReadable + : undefined; + + const guestCanJoin = room.getGuestAccess() === GuestAccess.CanJoin; + + return { + roomId: room.roomId, + name: room.name, + topic, + avatarUrl: room.getMxcAvatarUrl() ?? undefined, + canonicalAlias: room.getCanonicalAlias() ?? undefined, + worldReadable, + guestCanJoin, + memberCount: room.getJoinedMemberCount(), + roomType: room.getType(), + joinRule: room.getJoinRule(), + }; +}; diff --git a/src/app/hooks/useMatrixEventRenderer.ts b/src/app/hooks/useMatrixEventRenderer.ts index 9ace6b66..57d56cc1 100644 --- a/src/app/hooks/useMatrixEventRenderer.ts +++ b/src/app/hooks/useMatrixEventRenderer.ts @@ -1,80 +1,31 @@ import { ReactNode } from 'react'; -import { MatrixEvent } from 'matrix-js-sdk'; -import { MessageEvent, StateEvent } from '../../types/matrix/room'; -export type EventRenderer = ( - eventId: string, - mEvent: MatrixEvent, - ...args: T -) => ReactNode; +export type EventRenderer = (...args: T) => ReactNode; -export type EventRendererOpts = { - renderRoomMessage?: EventRenderer; - renderRoomEncrypted?: EventRenderer; - renderSticker?: EventRenderer; - renderRoomMember?: EventRenderer; - renderRoomName?: EventRenderer; - renderRoomTopic?: EventRenderer; - renderRoomAvatar?: EventRenderer; - renderStateEvent?: EventRenderer; - renderEvent?: EventRenderer; -}; +export type EventRendererOpts = Record>; export type RenderMatrixEvent = ( - eventId: string, - mEvent: MatrixEvent, + eventType: string, + isStateEvent: boolean, ...args: T ) => ReactNode; export const useMatrixEventRenderer = - ({ - renderRoomMessage, - renderRoomEncrypted, - renderSticker, - renderRoomMember, - renderRoomName, - renderRoomTopic, - renderRoomAvatar, - renderStateEvent, - renderEvent, - }: EventRendererOpts): RenderMatrixEvent => - (eventId, mEvent, ...args) => { - const eventType = mEvent.getWireType(); + ( + typeToRenderer: EventRendererOpts, + renderStateEvent?: EventRenderer, + renderEvent?: EventRenderer + ): RenderMatrixEvent => + (eventType, isStateEvent, ...args) => { + const renderer = typeToRenderer[eventType]; + if (typeToRenderer[eventType]) return renderer(...args); - if (eventType === MessageEvent.RoomMessage && renderRoomMessage) { - return renderRoomMessage(eventId, mEvent, ...args); + if (isStateEvent && renderStateEvent) { + return renderStateEvent(...args); } - if (eventType === MessageEvent.RoomMessageEncrypted && renderRoomEncrypted) { - return renderRoomEncrypted(eventId, mEvent, ...args); - } - - if (eventType === MessageEvent.Sticker && renderSticker) { - return renderSticker(eventId, mEvent, ...args); - } - - if (eventType === StateEvent.RoomMember && renderRoomMember) { - return renderRoomMember(eventId, mEvent, ...args); - } - - if (eventType === StateEvent.RoomName && renderRoomName) { - return renderRoomName(eventId, mEvent, ...args); - } - - if (eventType === StateEvent.RoomTopic && renderRoomTopic) { - return renderRoomTopic(eventId, mEvent, ...args); - } - - if (eventType === StateEvent.RoomAvatar && renderRoomAvatar) { - return renderRoomAvatar(eventId, mEvent, ...args); - } - - if (typeof mEvent.getStateKey() === 'string' && renderStateEvent) { - return renderStateEvent(eventId, mEvent, ...args); - } - - if (typeof mEvent.getStateKey() !== 'string' && renderEvent) { - return renderEvent(eventId, mEvent, ...args); + if (!isStateEvent && renderEvent) { + return renderEvent(...args); } return null; }; diff --git a/src/app/hooks/useMediaConfig.ts b/src/app/hooks/useMediaConfig.ts new file mode 100644 index 00000000..929ebd00 --- /dev/null +++ b/src/app/hooks/useMediaConfig.ts @@ -0,0 +1,16 @@ +import { createContext, useContext } from 'react'; + +export interface MediaConfig { + [key: string]: unknown; + 'm.upload.size'?: number; +} + +const MediaConfigContext = createContext(null); + +export const MediaConfigProvider = MediaConfigContext.Provider; + +export function useMediaConfig(): MediaConfig { + const mediaConfig = useContext(MediaConfigContext); + if (!mediaConfig) throw new Error('Media configs are not provided!'); + return mediaConfig; +} diff --git a/src/app/hooks/useNavToActivePathMapper.ts b/src/app/hooks/useNavToActivePathMapper.ts new file mode 100644 index 00000000..d3cec08e --- /dev/null +++ b/src/app/hooks/useNavToActivePathMapper.ts @@ -0,0 +1,18 @@ +import { useEffect } from 'react'; +import { useSetAtom } from 'jotai'; +import { useLocation } from 'react-router-dom'; +import { useNavToActivePathAtom } from '../state/hooks/navToActivePath'; + +export const useNavToActivePathMapper = (navId: string) => { + const location = useLocation(); + const setNavToActivePath = useSetAtom(useNavToActivePathAtom()); + + useEffect(() => { + const { pathname, search, hash } = location; + setNavToActivePath({ + type: 'PUT', + navId, + path: { pathname, search, hash }, + }); + }, [location, setNavToActivePath, navId]); +}; diff --git a/src/app/hooks/usePowerLevels.ts b/src/app/hooks/usePowerLevels.ts index 98e3701e..0fcbbd33 100644 --- a/src/app/hooks/usePowerLevels.ts +++ b/src/app/hooks/usePowerLevels.ts @@ -1,7 +1,11 @@ import { Room } from 'matrix-js-sdk'; -import { createContext, useCallback, useContext } from 'react'; +import { createContext, useCallback, useContext, useMemo } from 'react'; import { useStateEvent } from './useStateEvent'; import { StateEvent } from '../../types/matrix/room'; +import { useForceUpdate } from './useForceUpdate'; +import { useStateEventCallback } from './useStateEventCallback'; +import { useMatrixClient } from './useMatrixClient'; +import { getStateEvent } from '../utils/room'; export type PowerLevelActions = 'invite' | 'redact' | 'kick' | 'ban' | 'historical'; @@ -16,7 +20,7 @@ enum DefaultPowerLevels { historical = 0, } -interface IPowerLevels { +export interface IPowerLevels { users_default?: number; state_default?: number; events_default?: number; @@ -31,9 +35,75 @@ interface IPowerLevels { notifications?: Record; } -export type GetPowerLevel = (userId: string) => number; -export type CanSend = (eventType: string | undefined, powerLevel: number) => boolean; -export type CanDoAction = (action: PowerLevelActions, powerLevel: number) => boolean; +export function usePowerLevels(room: Room): IPowerLevels { + const powerLevelsEvent = useStateEvent(room, StateEvent.RoomPowerLevels); + const powerLevels: IPowerLevels = + powerLevelsEvent?.getContent() ?? DefaultPowerLevels; + + return powerLevels; +} + +export const PowerLevelsContext = createContext(null); + +export const PowerLevelsContextProvider = PowerLevelsContext.Provider; + +export const usePowerLevelsContext = (): IPowerLevels => { + const pl = useContext(PowerLevelsContext); + if (!pl) throw new Error('PowerLevelContext is not initialized!'); + return pl; +}; + +export const useRoomsPowerLevels = (rooms: Room[]): Map => { + const mx = useMatrixClient(); + const [updateCount, forceUpdate] = useForceUpdate(); + + useStateEventCallback( + mx, + useCallback( + (event) => { + const roomId = event.getRoomId(); + if ( + roomId && + event.getType() === StateEvent.RoomPowerLevels && + event.getStateKey() === '' && + rooms.find((r) => r.roomId === roomId) + ) { + forceUpdate(); + } + }, + [rooms, forceUpdate] + ) + ); + + const roomToPowerLevels = useMemo( + () => { + const rToPl = new Map(); + + rooms.forEach((room) => { + const pl = getStateEvent(room, StateEvent.RoomPowerLevels, '')?.getContent(); + if (pl) rToPl.set(room.roomId, pl); + }); + + return rToPl; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [rooms, updateCount] + ); + + return roomToPowerLevels; +}; + +export type GetPowerLevel = (powerLevels: IPowerLevels, userId: string | undefined) => number; +export type CanSend = ( + powerLevels: IPowerLevels, + eventType: string | undefined, + powerLevel: number +) => boolean; +export type CanDoAction = ( + powerLevels: IPowerLevels, + action: PowerLevelActions, + powerLevel: number +) => boolean; export type PowerLevelsAPI = { getPowerLevel: GetPowerLevel; @@ -42,51 +112,58 @@ export type PowerLevelsAPI = { canDoAction: CanDoAction; }; -export function usePowerLevels(room: Room): PowerLevelsAPI { - const powerLevelsEvent = useStateEvent(room, StateEvent.RoomPowerLevels); - const powerLevels: IPowerLevels = powerLevelsEvent?.getContent() ?? DefaultPowerLevels; +export const powerLevelAPI: PowerLevelsAPI = { + getPowerLevel: (powerLevels, userId) => { + const { users_default: usersDefault, users } = powerLevels; + if (userId && users && typeof users[userId] === 'number') { + return users[userId]; + } + return usersDefault ?? DefaultPowerLevels.usersDefault; + }, + canSendEvent: (powerLevels, eventType, powerLevel) => { + const { events, events_default: eventsDefault } = powerLevels; + if (events && eventType && typeof events[eventType] === 'number') { + return powerLevel >= events[eventType]; + } + return powerLevel >= (eventsDefault ?? DefaultPowerLevels.eventsDefault); + }, + canSendStateEvent: (powerLevels, eventType, powerLevel) => { + const { events, state_default: stateDefault } = powerLevels; + if (events && eventType && typeof events[eventType] === 'number') { + return powerLevel >= events[eventType]; + } + return powerLevel >= (stateDefault ?? DefaultPowerLevels.stateDefault); + }, + canDoAction: (powerLevels, action, powerLevel) => { + const requiredPL = powerLevels[action]; + if (typeof requiredPL === 'number') { + return powerLevel >= requiredPL; + } + return powerLevel >= DefaultPowerLevels[action]; + }, +}; - const getPowerLevel: GetPowerLevel = useCallback( - (userId) => { - const { users_default: usersDefault, users } = powerLevels; - if (users && typeof users[userId] === 'number') { - return users[userId]; - } - return usersDefault ?? DefaultPowerLevels.usersDefault; - }, +export const usePowerLevelsAPI = (powerLevels: IPowerLevels) => { + const getPowerLevel = useCallback( + (userId: string | undefined) => powerLevelAPI.getPowerLevel(powerLevels, userId), [powerLevels] ); - const canSendEvent: CanSend = useCallback( - (eventType, powerLevel) => { - const { events, events_default: eventsDefault } = powerLevels; - if (events && eventType && typeof events[eventType] === 'number') { - return powerLevel >= events[eventType]; - } - return powerLevel >= (eventsDefault ?? DefaultPowerLevels.eventsDefault); - }, + const canSendEvent = useCallback( + (eventType: string | undefined, powerLevel: number) => + powerLevelAPI.canSendEvent(powerLevels, eventType, powerLevel), [powerLevels] ); - const canSendStateEvent: CanSend = useCallback( - (eventType, powerLevel) => { - const { events, state_default: stateDefault } = powerLevels; - if (events && eventType && typeof events[eventType] === 'number') { - return powerLevel >= events[eventType]; - } - return powerLevel >= (stateDefault ?? DefaultPowerLevels.stateDefault); - }, + const canSendStateEvent = useCallback( + (eventType: string | undefined, powerLevel: number) => + powerLevelAPI.canSendStateEvent(powerLevels, eventType, powerLevel), [powerLevels] ); - const canDoAction: CanDoAction = useCallback( - (action, powerLevel) => { - const requiredPL = powerLevels[action]; - if (typeof requiredPL === 'number') { - return powerLevel >= requiredPL; - } - return powerLevel >= DefaultPowerLevels[action]; - }, + const canDoAction = useCallback( + (action: PowerLevelActions, powerLevel: number) => + powerLevelAPI.canDoAction(powerLevels, action, powerLevel), [powerLevels] ); @@ -96,14 +173,4 @@ export function usePowerLevels(room: Room): PowerLevelsAPI { canSendStateEvent, canDoAction, }; -} - -export const PowerLevelsContext = createContext(null); - -export const PowerLevelsContextProvider = PowerLevelsContext.Provider; - -export const usePowerLevelsAPI = (): PowerLevelsAPI => { - const api = useContext(PowerLevelsContext); - if (!api) throw new Error('PowerLevelContext is not initialized!'); - return api; }; diff --git a/src/app/hooks/useRoom.ts b/src/app/hooks/useRoom.ts new file mode 100644 index 00000000..3f802d43 --- /dev/null +++ b/src/app/hooks/useRoom.ts @@ -0,0 +1,12 @@ +import { Room } from 'matrix-js-sdk'; +import { createContext, useContext } from 'react'; + +const RoomContext = createContext(null); + +export const RoomProvider = RoomContext.Provider; + +export function useRoom(): Room { + const room = useContext(RoomContext); + if (!room) throw new Error('Room not provided!'); + return room; +} diff --git a/src/app/hooks/useRoomMeta.ts b/src/app/hooks/useRoomMeta.ts new file mode 100644 index 00000000..51248831 --- /dev/null +++ b/src/app/hooks/useRoomMeta.ts @@ -0,0 +1,41 @@ +import { useEffect, useState } from 'react'; +import { Room, RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; +import { StateEvent } from '../../types/matrix/room'; +import { useStateEvent } from './useStateEvent'; + +export const useRoomAvatar = (room: Room, dm?: boolean): string | undefined => { + const avatarEvent = useStateEvent(room, StateEvent.RoomAvatar); + + if (dm) { + return room.getAvatarFallbackMember()?.getMxcAvatarUrl(); + } + const content = avatarEvent?.getContent(); + const avatarMxc = content && typeof content.url === 'string' ? content.url : undefined; + + return avatarMxc; +}; + +export const useRoomName = (room: Room): string => { + const [name, setName] = useState(room.name); + + useEffect(() => { + const handleRoomNameChange: RoomEventHandlerMap[RoomEvent.Name] = () => { + setName(room.name); + }; + room.on(RoomEvent.Name, handleRoomNameChange); + return () => { + room.removeListener(RoomEvent.Name, handleRoomNameChange); + }; + }, [room]); + + return name; +}; + +export const useRoomTopic = (room: Room): string | undefined => { + const topicEvent = useStateEvent(room, StateEvent.RoomTopic); + + const content = topicEvent?.getContent(); + const topic = content && typeof content.topic === 'string' ? content.topic : undefined; + + return topic; +}; diff --git a/src/app/hooks/useRoomMsgContentRenderer.ts b/src/app/hooks/useRoomMsgContentRenderer.ts deleted file mode 100644 index b014249a..00000000 --- a/src/app/hooks/useRoomMsgContentRenderer.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { ReactNode } from 'react'; -import { MatrixEvent, MsgType } from 'matrix-js-sdk'; - -export type MsgContentRenderer = ( - eventId: string, - mEvent: MatrixEvent, - ...args: T -) => ReactNode; - -export type RoomMsgContentRendererOpts = { - renderText?: MsgContentRenderer; - renderEmote?: MsgContentRenderer; - renderNotice?: MsgContentRenderer; - renderImage?: MsgContentRenderer; - renderVideo?: MsgContentRenderer; - renderAudio?: MsgContentRenderer; - renderFile?: MsgContentRenderer; - renderLocation?: MsgContentRenderer; - renderBadEncrypted?: MsgContentRenderer; - renderUnsupported?: MsgContentRenderer; - renderBrokenFallback?: MsgContentRenderer; -}; - -export type RenderRoomMsgContent = ( - eventId: string, - mEvent: MatrixEvent, - ...args: T -) => ReactNode; - -export const useRoomMsgContentRenderer = - ({ - renderText, - renderEmote, - renderNotice, - renderImage, - renderVideo, - renderAudio, - renderFile, - renderLocation, - renderBadEncrypted, - renderUnsupported, - renderBrokenFallback, - }: RoomMsgContentRendererOpts): RenderRoomMsgContent => - (eventId, mEvent, ...args) => { - const msgType = mEvent.getContent().msgtype; - - let node: ReactNode = null; - - if (msgType === MsgType.Text && renderText) node = renderText(eventId, mEvent, ...args); - else if (msgType === MsgType.Emote && renderEmote) node = renderEmote(eventId, mEvent, ...args); - else if (msgType === MsgType.Notice && renderNotice) - node = renderNotice(eventId, mEvent, ...args); - else if (msgType === MsgType.Image && renderImage) node = renderImage(eventId, mEvent, ...args); - else if (msgType === MsgType.Video && renderVideo) node = renderVideo(eventId, mEvent, ...args); - else if (msgType === MsgType.Audio && renderAudio) node = renderAudio(eventId, mEvent, ...args); - else if (msgType === MsgType.File && renderFile) node = renderFile(eventId, mEvent, ...args); - else if (msgType === MsgType.Location && renderLocation) - node = renderLocation(eventId, mEvent, ...args); - else if (msgType === 'm.bad.encrypted' && renderBadEncrypted) - node = renderBadEncrypted(eventId, mEvent, ...args); - else if (renderUnsupported) { - node = renderUnsupported(eventId, mEvent, ...args); - } - - if (!node && renderBrokenFallback) node = renderBrokenFallback(eventId, mEvent, ...args); - - return node; - }; diff --git a/src/app/hooks/useRoomNavigate.ts b/src/app/hooks/useRoomNavigate.ts new file mode 100644 index 00000000..55528e7e --- /dev/null +++ b/src/app/hooks/useRoomNavigate.ts @@ -0,0 +1,55 @@ +import { useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useAtomValue } from 'jotai'; +import { getCanonicalAliasOrRoomId } from '../utils/matrix'; +import { + getDirectRoomPath, + getHomeRoomPath, + getSpacePath, + getSpaceRoomPath, +} from '../pages/pathUtils'; +import { useMatrixClient } from './useMatrixClient'; +import { getOrphanParents } from '../utils/room'; +import { roomToParentsAtom } from '../state/room/roomToParents'; +import { mDirectAtom } from '../state/mDirectList'; + +export const useRoomNavigate = () => { + const navigate = useNavigate(); + const mx = useMatrixClient(); + const roomToParents = useAtomValue(roomToParentsAtom); + const mDirects = useAtomValue(mDirectAtom); + + const navigateSpace = useCallback( + (roomId: string) => { + const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId); + navigate(getSpacePath(roomIdOrAlias)); + }, + [mx, navigate] + ); + + const navigateRoom = useCallback( + (roomId: string, eventId?: string) => { + const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId); + + const orphanParents = getOrphanParents(roomToParents, roomId); + if (orphanParents.length > 0) { + const pSpaceIdOrAlias = getCanonicalAliasOrRoomId(mx, orphanParents[0]); + navigate(getSpaceRoomPath(pSpaceIdOrAlias, roomIdOrAlias, eventId)); + return; + } + + if (mDirects.has(roomId)) { + navigate(getDirectRoomPath(roomIdOrAlias, eventId)); + return; + } + + navigate(getHomeRoomPath(roomIdOrAlias, eventId)); + }, + [mx, navigate, roomToParents, mDirects] + ); + + return { + navigateSpace, + navigateRoom, + }; +}; diff --git a/src/app/hooks/useRoomTypingMembers.ts b/src/app/hooks/useRoomTypingMembers.ts new file mode 100644 index 00000000..5f24fb5d --- /dev/null +++ b/src/app/hooks/useRoomTypingMembers.ts @@ -0,0 +1,10 @@ +import { useAtomValue } from 'jotai'; +import { useMemo } from 'react'; +import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../state/typingMembers'; + +export const useRoomTypingMember = (roomId: string) => { + const typing = useAtomValue( + useMemo(() => selectRoomTypingMembersAtom(roomId, roomIdToTypingMembersAtom), [roomId]) + ); + return typing; +}; diff --git a/src/app/hooks/useScreenSize.ts b/src/app/hooks/useScreenSize.ts index 4afe9083..3e64528d 100644 --- a/src/app/hooks/useScreenSize.ts +++ b/src/app/hooks/useScreenSize.ts @@ -1,5 +1,5 @@ -import { useCallback, useState } from 'react'; -import { getResizeObserverEntry, useResizeObserver } from './useResizeObserver'; +import { createContext, useCallback, useContext, useState } from 'react'; +import { useElementSizeObserver } from './useElementSizeObserver'; export const TABLET_BREAKPOINT = 1124; export const MOBILE_BREAKPOINT = 750; @@ -16,21 +16,24 @@ export const getScreenSize = (width: number): ScreenSize => { return ScreenSize.Mobile; }; -export const useScreenSize = (): [ScreenSize, number] => { - const [size, setSize] = useState<[ScreenSize, number]>([ - getScreenSize(document.body.clientWidth), - document.body.clientWidth, - ]); - useResizeObserver( - useCallback((entries) => { - const bodyEntry = getResizeObserverEntry(document.body, entries); - if (bodyEntry) { - const bWidth = bodyEntry.contentRect.width; - setSize([getScreenSize(bWidth), bWidth]); - } - }, []), - document.body +export const useScreenSize = (): ScreenSize => { + const [size, setSize] = useState(getScreenSize(document.body.clientWidth)); + + useElementSizeObserver( + useCallback(() => document.body, []), + useCallback((width) => setSize(getScreenSize(width)), []) ); return size; }; + +const ScreenSizeContext = createContext(null); +export const ScreenSizeProvider = ScreenSizeContext.Provider; + +export const useScreenSizeContext = (): ScreenSize => { + const screenSize = useContext(ScreenSizeContext); + if (screenSize === null) { + throw new Error('Screen size not provided!'); + } + return screenSize; +}; diff --git a/src/app/hooks/useSidebarItems.ts b/src/app/hooks/useSidebarItems.ts new file mode 100644 index 00000000..16aba225 --- /dev/null +++ b/src/app/hooks/useSidebarItems.ts @@ -0,0 +1,138 @@ +import { Dispatch, SetStateAction, useCallback, useEffect, useState } from 'react'; +import { MatrixClient } from 'matrix-js-sdk'; +import { AccountDataEvent } from '../../types/matrix/accountData'; +import { useMatrixClient } from './useMatrixClient'; +import { getAccountData, isSpace } from '../utils/room'; +import { Membership } from '../../types/matrix/room'; +import { useAccountDataCallback } from './useAccountDataCallback'; + +export type ISidebarFolder = { + name?: string; + id: string; + content: string[]; +}; +export type TSidebarItem = string | ISidebarFolder; +export type SidebarItems = Array; + +export type InCinnySpacesContent = { + shortcut?: string[]; + sidebar?: SidebarItems; +}; + +export const parseSidebar = ( + mx: MatrixClient, + orphanSpaces: string[], + content?: InCinnySpacesContent +) => { + const sidebar = content?.sidebar ?? content?.shortcut ?? []; + const orphans = new Set(orphanSpaces); + + const items: SidebarItems = []; + + const safeToAdd = (spaceId: string): boolean => { + if (typeof spaceId !== 'string') return false; + const space = mx.getRoom(spaceId); + if (space?.getMyMembership() !== Membership.Join) return false; + return isSpace(space); + }; + + sidebar.forEach((item) => { + if (typeof item === 'string') { + if (safeToAdd(item) && !items.includes(item)) { + orphans.delete(item); + items.push(item); + } + return; + } + if ( + typeof item === 'object' && + typeof item.id === 'string' && + Array.isArray(item.content) && + !items.find((i) => (typeof i === 'string' ? false : i.id === item.id)) + ) { + const safeContent = item.content.filter(safeToAdd); + safeContent.forEach((i) => orphans.delete(i)); + items.push({ + ...item, + content: Array.from(new Set(safeContent)), + }); + } + }); + + orphans.forEach((spaceId) => items.push(spaceId)); + return items; +}; + +export const useSidebarItems = ( + orphanSpaces: string[] +): [SidebarItems, Dispatch>] => { + const mx = useMatrixClient(); + + const [sidebarItems, setSidebarItems] = useState(() => { + const inCinnySpacesContent = getAccountData( + mx, + AccountDataEvent.CinnySpaces + )?.getContent(); + return parseSidebar(mx, orphanSpaces, inCinnySpacesContent); + }); + + useEffect(() => { + const inCinnySpacesContent = getAccountData( + mx, + AccountDataEvent.CinnySpaces + )?.getContent(); + setSidebarItems(parseSidebar(mx, orphanSpaces, inCinnySpacesContent)); + }, [mx, orphanSpaces]); + + useAccountDataCallback( + mx, + useCallback( + (mEvent) => { + if (mEvent.getType() === AccountDataEvent.CinnySpaces) { + const newContent = mEvent.getContent(); + setSidebarItems(parseSidebar(mx, orphanSpaces, newContent)); + } + }, + [mx, orphanSpaces] + ) + ); + + return [sidebarItems, setSidebarItems]; +}; + +export const sidebarItemWithout = (items: SidebarItems, roomId: string) => { + const newItems: SidebarItems = items + .map((item) => { + if (typeof item === 'string') { + if (item === roomId) return null; + return item; + } + if (item.content.includes(roomId)) { + const newContent = item.content.filter((id) => id !== roomId); + if (newContent.length === 0) return null; + return { + ...item, + content: newContent, + }; + } + return item; + }) + .filter((item) => item !== null) as SidebarItems; + + return newItems; +}; + +export const makeCinnySpacesContent = ( + mx: MatrixClient, + items: SidebarItems +): InCinnySpacesContent => { + const currentInSpaces = + getAccountData(mx, AccountDataEvent.CinnySpaces)?.getContent() ?? {}; + + const newSpacesContent: InCinnySpacesContent = { + ...currentInSpaces, + sidebar: items, + }; + + return newSpacesContent; +}; diff --git a/src/app/hooks/useSpace.ts b/src/app/hooks/useSpace.ts new file mode 100644 index 00000000..8bec49e4 --- /dev/null +++ b/src/app/hooks/useSpace.ts @@ -0,0 +1,17 @@ +import { Room } from 'matrix-js-sdk'; +import { createContext, useContext } from 'react'; + +const SpaceContext = createContext(null); + +export const SpaceProvider = SpaceContext.Provider; + +export function useSpace(): Room { + const space = useContext(SpaceContext); + if (!space) throw new Error('Space not provided!'); + return space; +} + +export function useSpaceOptionally(): Room | null { + const space = useContext(SpaceContext); + return space; +} diff --git a/src/app/hooks/useSpaceHierarchy.ts b/src/app/hooks/useSpaceHierarchy.ts new file mode 100644 index 00000000..c109cc21 --- /dev/null +++ b/src/app/hooks/useSpaceHierarchy.ts @@ -0,0 +1,253 @@ +import { atom, useAtom, useAtomValue } from 'jotai'; +import { useCallback, useEffect, useState } from 'react'; +import { Room } from 'matrix-js-sdk'; +import { useMatrixClient } from './useMatrixClient'; +import { roomToParentsAtom } from '../state/room/roomToParents'; +import { MSpaceChildContent, StateEvent } from '../../types/matrix/room'; +import { getAllParents, getStateEvents, isValidChild } from '../utils/room'; +import { isRoomId } from '../utils/matrix'; +import { SortFunc, byOrderKey, byTsOldToNew, factoryRoomIdByActivity } from '../utils/sort'; +import { useStateEventCallback } from './useStateEventCallback'; + +export type HierarchyItem = + | { + roomId: string; + content: MSpaceChildContent; + ts: number; + space: true; + parentId?: string; + } + | { + roomId: string; + content: MSpaceChildContent; + ts: number; + space?: false; + parentId: string; + }; + +type GetRoomCallback = (roomId: string) => Room | undefined; + +const hierarchyItemTs: SortFunc = (a, b) => byTsOldToNew(a.ts, b.ts); +const hierarchyItemByOrder: SortFunc = (a, b) => + byOrderKey(a.content.order, b.content.order); + +const getHierarchySpaces = ( + rootSpaceId: string, + getRoom: GetRoomCallback, + spaceRooms: Set +): HierarchyItem[] => { + const rootSpaceItem: HierarchyItem = { + roomId: rootSpaceId, + content: { via: [] }, + ts: 0, + space: true, + }; + let spaceItems: HierarchyItem[] = []; + + const findAndCollectHierarchySpaces = (spaceItem: HierarchyItem) => { + if (spaceItems.find((item) => item.roomId === spaceItem.roomId)) return; + const space = getRoom(spaceItem.roomId); + spaceItems.push(spaceItem); + + if (!space) return; + const childEvents = getStateEvents(space, StateEvent.SpaceChild); + + childEvents.forEach((childEvent) => { + if (!isValidChild(childEvent)) return; + const childId = childEvent.getStateKey(); + if (!childId || !isRoomId(childId)) return; + + // because we can not find if a childId is space without joining + // or requesting room summary, we will look it into spaceRooms local + // cache which we maintain as we load summary in UI. + if (getRoom(childId)?.isSpaceRoom() || spaceRooms.has(childId)) { + const childItem: HierarchyItem = { + roomId: childId, + content: childEvent.getContent(), + ts: childEvent.getTs(), + space: true, + parentId: spaceItem.roomId, + }; + findAndCollectHierarchySpaces(childItem); + } + }); + }; + findAndCollectHierarchySpaces(rootSpaceItem); + + spaceItems = [ + rootSpaceItem, + ...spaceItems + .filter((item) => item.roomId !== rootSpaceId) + .sort(hierarchyItemTs) + .sort(hierarchyItemByOrder), + ]; + + return spaceItems; +}; + +const getSpaceHierarchy = ( + rootSpaceId: string, + spaceRooms: Set, + getRoom: (roomId: string) => Room | undefined, + closedCategory: (spaceId: string) => boolean +): HierarchyItem[] => { + const spaceItems: HierarchyItem[] = getHierarchySpaces(rootSpaceId, getRoom, spaceRooms); + + const hierarchy: HierarchyItem[] = spaceItems.flatMap((spaceItem) => { + const space = getRoom(spaceItem.roomId); + if (!space || closedCategory(spaceItem.roomId)) { + return [spaceItem]; + } + const childEvents = getStateEvents(space, StateEvent.SpaceChild); + const childItems: HierarchyItem[] = []; + childEvents.forEach((childEvent) => { + if (!isValidChild(childEvent)) return; + const childId = childEvent.getStateKey(); + if (!childId || !isRoomId(childId)) return; + if (getRoom(childId)?.isSpaceRoom() || spaceRooms.has(childId)) return; + + const childItem: HierarchyItem = { + roomId: childId, + content: childEvent.getContent(), + ts: childEvent.getTs(), + parentId: spaceItem.roomId, + }; + childItems.push(childItem); + }); + return [spaceItem, ...childItems.sort(hierarchyItemTs).sort(hierarchyItemByOrder)]; + }); + + return hierarchy; +}; + +export const useSpaceHierarchy = ( + spaceId: string, + spaceRooms: Set, + getRoom: (roomId: string) => Room | undefined, + closedCategory: (spaceId: string) => boolean +): HierarchyItem[] => { + const mx = useMatrixClient(); + const roomToParents = useAtomValue(roomToParentsAtom); + + const [hierarchyAtom] = useState(() => + atom(getSpaceHierarchy(spaceId, spaceRooms, getRoom, closedCategory)) + ); + const [hierarchy, setHierarchy] = useAtom(hierarchyAtom); + + useEffect(() => { + setHierarchy(getSpaceHierarchy(spaceId, spaceRooms, getRoom, closedCategory)); + }, [mx, spaceId, spaceRooms, setHierarchy, getRoom, closedCategory]); + + useStateEventCallback( + mx, + useCallback( + (mEvent) => { + if (mEvent.getType() !== StateEvent.SpaceChild) return; + const eventRoomId = mEvent.getRoomId(); + if (!eventRoomId) return; + + if (spaceId === eventRoomId || getAllParents(roomToParents, eventRoomId).has(spaceId)) { + setHierarchy(getSpaceHierarchy(spaceId, spaceRooms, getRoom, closedCategory)); + } + }, + [spaceId, roomToParents, setHierarchy, spaceRooms, getRoom, closedCategory] + ) + ); + + return hierarchy; +}; + +const getSpaceJoinedHierarchy = ( + rootSpaceId: string, + getRoom: GetRoomCallback, + excludeRoom: (parentId: string, roomId: string) => boolean, + sortRoomItems: (parentId: string, items: HierarchyItem[]) => HierarchyItem[] +): HierarchyItem[] => { + const spaceItems: HierarchyItem[] = getHierarchySpaces(rootSpaceId, getRoom, new Set()); + + const hierarchy: HierarchyItem[] = spaceItems.flatMap((spaceItem) => { + const space = getRoom(spaceItem.roomId); + if (!space) { + return []; + } + const joinedRoomEvents = getStateEvents(space, StateEvent.SpaceChild).filter((childEvent) => { + if (!isValidChild(childEvent)) return false; + const childId = childEvent.getStateKey(); + if (!childId || !isRoomId(childId)) return false; + const room = getRoom(childId); + if (!room || room.isSpaceRoom()) return false; + + return true; + }); + + if (joinedRoomEvents.length === 0) return []; + + const childItems: HierarchyItem[] = []; + joinedRoomEvents.forEach((childEvent) => { + const childId = childEvent.getStateKey(); + if (!childId) return; + + if (excludeRoom(space.roomId, childId)) return; + + const childItem: HierarchyItem = { + roomId: childId, + content: childEvent.getContent(), + ts: childEvent.getTs(), + parentId: spaceItem.roomId, + }; + childItems.push(childItem); + }); + return [spaceItem, ...sortRoomItems(spaceItem.roomId, childItems)]; + }); + + return hierarchy; +}; + +export const useSpaceJoinedHierarchy = ( + spaceId: string, + getRoom: GetRoomCallback, + excludeRoom: (parentId: string, roomId: string) => boolean, + sortByActivity: (spaceId: string) => boolean +): HierarchyItem[] => { + const mx = useMatrixClient(); + const roomToParents = useAtomValue(roomToParentsAtom); + + const sortRoomItems = useCallback( + (sId: string, items: HierarchyItem[]) => { + if (sortByActivity(sId)) { + items.sort((a, b) => factoryRoomIdByActivity(mx)(a.roomId, b.roomId)); + return items; + } + items.sort(hierarchyItemTs).sort(hierarchyItemByOrder); + return items; + }, + [mx, sortByActivity] + ); + + const [hierarchyAtom] = useState(() => + atom(getSpaceJoinedHierarchy(spaceId, getRoom, excludeRoom, sortRoomItems)) + ); + const [hierarchy, setHierarchy] = useAtom(hierarchyAtom); + + useEffect(() => { + setHierarchy(getSpaceJoinedHierarchy(spaceId, getRoom, excludeRoom, sortRoomItems)); + }, [mx, spaceId, setHierarchy, getRoom, excludeRoom, sortRoomItems]); + + useStateEventCallback( + mx, + useCallback( + (mEvent) => { + if (mEvent.getType() !== StateEvent.SpaceChild) return; + const eventRoomId = mEvent.getRoomId(); + if (!eventRoomId) return; + + if (spaceId === eventRoomId || getAllParents(roomToParents, eventRoomId).has(spaceId)) { + setHierarchy(getSpaceJoinedHierarchy(spaceId, getRoom, excludeRoom, sortRoomItems)); + } + }, + [spaceId, roomToParents, setHierarchy, getRoom, excludeRoom, sortRoomItems] + ) + ); + + return hierarchy; +}; diff --git a/src/app/hooks/useSyncState.ts b/src/app/hooks/useSyncState.ts new file mode 100644 index 00000000..4b2f4163 --- /dev/null +++ b/src/app/hooks/useSyncState.ts @@ -0,0 +1,14 @@ +import { ClientEvent, ClientEventHandlerMap, MatrixClient } from 'matrix-js-sdk'; +import { useEffect } from 'react'; + +export const useSyncState = ( + mx: MatrixClient, + onChange: ClientEventHandlerMap[ClientEvent.Sync] +): void => { + useEffect(() => { + mx.on(ClientEvent.Sync, onChange); + return () => { + mx.removeListener(ClientEvent.Sync, onChange); + }; + }, [mx, onChange]); +}; diff --git a/src/app/hooks/useTypingStatusUpdater.ts b/src/app/hooks/useTypingStatusUpdater.ts index af76eae7..db8ceff1 100644 --- a/src/app/hooks/useTypingStatusUpdater.ts +++ b/src/app/hooks/useTypingStatusUpdater.ts @@ -1,10 +1,9 @@ import { MatrixClient } from 'matrix-js-sdk'; import { useMemo, useRef } from 'react'; +import { TYPING_TIMEOUT_MS } from '../state/typingMembers'; type TypingStatusUpdater = (typing: boolean) => void; -const TYPING_TIMEOUT_MS = 5000; // 5 seconds - export const useTypingStatusUpdater = (mx: MatrixClient, roomId: string): TypingStatusUpdater => { const statusSentTsRef = useRef(0); diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index a9de7bdb..547c0af5 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import './SpaceAddExisting.scss'; @@ -25,7 +25,7 @@ import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import { useStore } from '../../hooks/useStore'; -function SpaceAddExistingContent({ roomId }) { +function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const mountStore = useStore(roomId); const [debounce] = useState(new Debounce()); const [process, setProcess] = useState(null); @@ -33,16 +33,15 @@ function SpaceAddExistingContent({ roomId }) { const [selected, setSelected] = useState([]); const [searchIds, setSearchIds] = useState(null); const mx = initMatrix.matrixClient; - const { - spaces, rooms, directs, roomIdToParents, - } = initMatrix.roomList; + const { spaces, rooms, directs, roomIdToParents } = initMatrix.roomList; useEffect(() => { - const allIds = [...spaces, ...rooms, ...directs].filter((rId) => ( - rId !== roomId && !roomIdToParents.get(rId)?.has(roomId) - )); + const roomIds = onlySpaces ? [...spaces] : [...rooms, ...directs]; + const allIds = roomIds.filter( + (rId) => rId !== roomId && !roomIdToParents.get(rId)?.has(roomId) + ); setAllRoomIds(allIds); - }, [roomId]); + }, [roomId, onlySpaces]); const toggleSelection = (rId) => { if (process !== null) return; @@ -68,20 +67,26 @@ function SpaceAddExistingContent({ roomId }) { via.push(getIdServer(rId)); } - return mx.sendStateEvent(roomId, 'm.space.child', { - auto_join: false, - suggested: false, - via, - }, rId); + return mx.sendStateEvent( + roomId, + 'm.space.child', + { + auto_join: false, + suggested: false, + via, + }, + rId + ); }); mountStore.setItem(true); await Promise.allSettled(promises); if (mountStore.getItem() !== true) return; - const allIds = [...spaces, ...rooms, ...directs].filter((rId) => ( - rId !== roomId && !roomIdToParents.get(rId)?.has(roomId) && !selected.includes(rId) - )); + const roomIds = onlySpaces ? [...spaces] : [...rooms, ...directs]; + const allIds = roomIds.filter( + (rId) => rId !== roomId && !roomIdToParents.get(rId)?.has(roomId) && !selected.includes(rId) + ); setAllRoomIds(allIds); setProcess(null); setSelected([]); @@ -98,9 +103,7 @@ function SpaceAddExistingContent({ roomId }) { const searchedIds = allRoomIds.filter((rId) => { let name = mx.getRoom(rId)?.name; if (!name) return false; - name = name.normalize('NFKC') - .toLocaleLowerCase() - .replace(/\s/g, ''); + name = name.normalize('NFKC').toLocaleLowerCase().replace(/\s/g, ''); return name.includes(term); }); setSearchIds(searchedIds); @@ -114,66 +117,64 @@ function SpaceAddExistingContent({ roomId }) { return ( <> - { ev.preventDefault(); }}> + { + ev.preventDefault(); + }} + > - + {searchIds?.length === 0 && No results found} - { - (searchIds || allRoomIds).map((rId) => { - const room = mx.getRoom(rId); - let imageSrc = room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - if (imageSrc === null) imageSrc = room.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; + {(searchIds || allRoomIds).map((rId) => { + const room = mx.getRoom(rId); + let imageSrc = + room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; + if (imageSrc === null) imageSrc = room.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - const parentSet = roomIdToParents.get(rId); - const parentNames = parentSet - ? [...parentSet].map((parentId) => mx.getRoom(parentId).name) - : undefined; - const parents = parentNames ? parentNames.join(', ') : null; + const parentSet = roomIdToParents.get(rId); + const parentNames = parentSet + ? [...parentSet].map((parentId) => mx.getRoom(parentId).name) + : undefined; + const parents = parentNames ? parentNames.join(', ') : null; - const handleSelect = () => toggleSelection(rId); + const handleSelect = () => toggleSelection(rId); - return ( - - )} - /> - ); - }) - } + return ( + + } + /> + ); + })} {selected.length !== 0 && (
    {process && } {process || `${selected.length} item selected`} - { !process && ( - + {!process && ( + )}
    )} @@ -182,47 +183,51 @@ function SpaceAddExistingContent({ roomId }) { } SpaceAddExistingContent.propTypes = { roomId: PropTypes.string.isRequired, + spaces: PropTypes.bool.isRequired, }; function useVisibilityToggle() { - const [roomId, setRoomId] = useState(null); + const [data, setData] = useState(null); useEffect(() => { - const handleOpen = (rId) => setRoomId(rId); + const handleOpen = (roomId, spaces) => + setData({ + roomId, + spaces, + }); navigation.on(cons.events.navigation.SPACE_ADDEXISTING_OPENED, handleOpen); return () => { navigation.removeListener(cons.events.navigation.SPACE_ADDEXISTING_OPENED, handleOpen); }; }, []); - const requestClose = () => setRoomId(null); + const requestClose = () => setData(null); - return [roomId, requestClose]; + return [data, requestClose]; } function SpaceAddExisting() { - const [roomId, requestClose] = useVisibilityToggle(); + const [data, requestClose] = useVisibilityToggle(); const mx = initMatrix.matrixClient; - const room = mx.getRoom(roomId); + const room = mx.getRoom(data?.roomId); return ( - {roomId && twemojify(room.name)} - — add existing rooms + {room && twemojify(room.name)} + + {' '} + — add existing {data?.spaces ? 'spaces' : 'rooms'} + - )} + } contentOptions={} onRequestClose={requestClose} > - { - roomId - ? - :
    - } + {room ? :
    }
    ); } diff --git a/src/app/organisms/navigation/Drawer.jsx b/src/app/organisms/navigation/Drawer.jsx index fb75ee5b..0795e469 100644 --- a/src/app/organisms/navigation/Drawer.jsx +++ b/src/app/organisms/navigation/Drawer.jsx @@ -72,16 +72,16 @@ function Drawer() {
    - { - selectedTab !== cons.tabs.DIRECTS - ? - : - } + {selectedTab !== cons.tabs.DIRECTS ? ( + + ) : ( + + )}
    - { systemState !== null && ( + {systemState !== null && (
    {systemState.status}
    diff --git a/src/app/organisms/navigation/Sidebar1.tsx b/src/app/organisms/navigation/Sidebar1.tsx deleted file mode 100644 index d9ee4662..00000000 --- a/src/app/organisms/navigation/Sidebar1.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React from 'react'; -import { Icon, Icons, Badge, AvatarFallback, Text } from 'folds'; -import { useAtom } from 'jotai'; - -import { - Sidebar, - SidebarContent, - SidebarStackSeparator, - SidebarStack, - SidebarAvatar, -} from '../../components/sidebar'; -import { selectedTabAtom, SidebarTab } from '../../state/selectedTab'; - -export function Sidebar1() { - const [selectedTab, setSelectedTab] = useAtom(selectedTabAtom); - - return ( - - - - } - onClick={() => setSelectedTab(SidebarTab.Home)} - /> - } - onClick={() => setSelectedTab(SidebarTab.People)} - /> - - - - ( - - )} - avatarChildren={ - - B - - } - /> - ( - - 64 - - )} - avatarChildren={ - - C - - } - /> - - - - } - /> - } - /> - - - } - sticky={ - <> - - - } - /> - - A - - } - /> - - - } - /> - - ); -} diff --git a/src/app/organisms/pw/Windows.jsx b/src/app/organisms/pw/Windows.jsx index ba80f132..835b7033 100644 --- a/src/app/organisms/pw/Windows.jsx +++ b/src/app/organisms/pw/Windows.jsx @@ -9,14 +9,18 @@ import InviteUser from '../invite-user/InviteUser'; import Settings from '../settings/Settings'; import SpaceSettings from '../space-settings/SpaceSettings'; import SpaceManage from '../space-manage/SpaceManage'; +import RoomSettings from '../room/RoomSettings'; function Windows() { const [isInviteList, changeInviteList] = useState(false); const [publicRooms, changePublicRooms] = useState({ - isOpen: false, searchTerm: undefined, + isOpen: false, + searchTerm: undefined, }); const [inviteUser, changeInviteUser] = useState({ - isOpen: false, roomId: undefined, term: undefined, + isOpen: false, + roomId: undefined, + term: undefined, }); function openInviteList() { @@ -49,10 +53,7 @@ function Windows() { return ( <> - changeInviteList(false)} - /> + changeInviteList(false)} /> + ); diff --git a/src/app/organisms/room/Room.scss b/src/app/organisms/room/Room.scss index 11a00074..69f8f9dd 100644 --- a/src/app/organisms/room/Room.scss +++ b/src/app/organisms/room/Room.scss @@ -4,6 +4,7 @@ .room { @extend .cp-fx__row; height: 100%; + flex-grow: 1; &__content { @extend .cp-fx__item-one; diff --git a/src/app/organisms/room/Room.tsx b/src/app/organisms/room/Room.tsx deleted file mode 100644 index 6158547c..00000000 --- a/src/app/organisms/room/Room.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import './Room.scss'; -import { Room } from 'matrix-js-sdk'; -import { Line } from 'folds'; - -import RoomView from './RoomView'; -import RoomSettings from './RoomSettings'; -import { MembersDrawer } from './MembersDrawer'; -import { ScreenSize, useScreenSize } from '../../hooks/useScreenSize'; -import { useSetting } from '../../state/hooks/settings'; -import { settingsAtom } from '../../state/settings'; -import { PowerLevelsContextProvider, usePowerLevels } from '../../hooks/usePowerLevels'; -import { - roomIdToTypingMembersAtom, - useBindRoomIdToTypingMembersAtom, -} from '../../state/typingMembers'; - -export type RoomBaseViewProps = { - room: Room; - eventId?: string; -}; -export function RoomBaseView({ room, eventId }: RoomBaseViewProps) { - useBindRoomIdToTypingMembersAtom(room.client, roomIdToTypingMembersAtom); - - const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); - const [screenSize] = useScreenSize(); - const powerLevelAPI = usePowerLevels(room); - - return ( - -
    -
    - - -
    - - {screenSize === ScreenSize.Desktop && isDrawer && ( - <> - - - - )} -
    -
    - ); -} diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 63277347..1e617ae7 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -2,22 +2,15 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomSettings.scss'; -import { blurOnBubbling } from '../../atoms/button/script'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { openInviteUser, toggleRoomSettings } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Header, { TitleWrapper } from '../../atoms/header/Header'; -import ScrollView from '../../atoms/scroll/ScrollView'; import Tabs from '../../atoms/tabs/Tabs'; import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; import RoomProfile from '../../molecules/room-profile/RoomProfile'; -import RoomSearch from '../../molecules/room-search/RoomSearch'; import RoomNotification from '../../molecules/room-notification/RoomNotification'; import RoomVisibility from '../../molecules/room-visibility/RoomVisibility'; import RoomAliases from '../../molecules/room-aliases/RoomAliases'; @@ -30,67 +23,59 @@ import RoomEmojis from '../../molecules/room-emojis/RoomEmojis'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; -import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import ShieldUserIC from '../../../../public/res/ic/outlined/shield-user.svg'; import LockIC from '../../../../public/res/ic/outlined/lock.svg'; -import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; -import ChevronTopIC from '../../../../public/res/ic/outlined/chevron-top.svg'; +import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; -import { useForceUpdate } from '../../hooks/useForceUpdate'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; +import PopupWindow from '../../molecules/popup-window/PopupWindow'; +import IconButton from '../../atoms/button/IconButton'; const tabText = { GENERAL: 'General', - SEARCH: 'Search', MEMBERS: 'Members', EMOJIS: 'Emojis', PERMISSIONS: 'Permissions', SECURITY: 'Security', }; -const tabItems = [{ - iconSrc: SettingsIC, - text: tabText.GENERAL, - disabled: false, -}, { - iconSrc: SearchIC, - text: tabText.SEARCH, - disabled: false, -}, { - iconSrc: UserIC, - text: tabText.MEMBERS, - disabled: false, -}, { - iconSrc: EmojiIC, - text: tabText.EMOJIS, - disabled: false, -}, { - iconSrc: ShieldUserIC, - text: tabText.PERMISSIONS, - disabled: false, -}, { - iconSrc: LockIC, - text: tabText.SECURITY, - disabled: false, -}]; +const tabItems = [ + { + iconSrc: SettingsIC, + text: tabText.GENERAL, + disabled: false, + }, + { + iconSrc: UserIC, + text: tabText.MEMBERS, + disabled: false, + }, + { + iconSrc: EmojiIC, + text: tabText.EMOJIS, + disabled: false, + }, + { + iconSrc: ShieldUserIC, + text: tabText.PERMISSIONS, + disabled: false, + }, + { + iconSrc: LockIC, + text: tabText.SECURITY, + disabled: false, + }, +]; function GeneralSettings({ roomId }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); - const canInvite = room.canInvite(mx.getUserId()); return ( <>
    Options - openInviteUser(roomId)} - iconSrc={AddUserIC} - > - Invite - { @@ -98,7 +83,7 @@ function GeneralSettings({ roomId }) { 'Leave room', `Are you sure that you want to leave "${room.name}" room?`, 'Leave', - 'danger', + 'danger' ); if (!isConfirmed) return; roomActions.leave(roomId); @@ -146,54 +131,52 @@ SecuritySettings.propTypes = { roomId: PropTypes.string.isRequired, }; -function RoomSettings({ roomId }) { - const [, forceUpdate] = useForceUpdate(); +function useWindowToggle(setSelectedTab) { + const [window, setWindow] = useState(null); + + useEffect(() => { + const openRoomSettings = (roomId, tab) => { + setWindow({ roomId, tabText }); + const tabItem = tabItems.find((item) => item.text === tab); + if (tabItem) setSelectedTab(tabItem); + }; + navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, openRoomSettings); + return () => { + navigation.removeListener(cons.events.navigation.ROOM_SETTINGS_TOGGLED, openRoomSettings); + }; + }, [setSelectedTab]); + + const requestClose = () => setWindow(null); + + return [window, requestClose]; +} + +function RoomSettings() { const [selectedTab, setSelectedTab] = useState(tabItems[0]); + const [window, requestClose] = useWindowToggle(setSelectedTab); + const isOpen = window !== null; + const roomId = window?.roomId; const room = initMatrix.matrixClient.getRoom(roomId); const handleTabChange = (tabItem) => { setSelectedTab(tabItem); }; - useEffect(() => { - let mounted = true; - const settingsToggle = (isVisible, tab) => { - if (!mounted) return; - if (isVisible) { - const tabItem = tabItems.find((item) => item.text === tab); - if (tabItem) setSelectedTab(tabItem); - forceUpdate(); - } else setTimeout(() => forceUpdate(), 200); - }; - navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - return () => { - mounted = false; - navigation.removeListener(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - }; - }, []); - - if (!navigation.isRoomSettings) return null; - return ( -
    - + + {isOpen && room.name} + — room settings + + } + contentOptions={} + onRequestClose={requestClose} + > + {isOpen && (
    -
    - -
    {selectedTab.text === tabText.GENERAL && } - {selectedTab.text === tabText.SEARCH && } {selectedTab.text === tabText.MEMBERS && } {selectedTab.text === tabText.EMOJIS && } {selectedTab.text === tabText.PERMISSIONS && } {selectedTab.text === tabText.SECURITY && }
    -
    -
    + )} + ); } -RoomSettings.propTypes = { - roomId: PropTypes.string.isRequired, -}; - export default RoomSettings; export { tabText }; diff --git a/src/app/organisms/room/RoomSettings.scss b/src/app/organisms/room/RoomSettings.scss index ab7fca5c..fd3af501 100644 --- a/src/app/organisms/room/RoomSettings.scss +++ b/src/app/organisms/room/RoomSettings.scss @@ -2,59 +2,18 @@ @use '../../partials/flex'; .room-settings { - height: 100%; - & .scrollbar { - position: relative; - } - - & .header { - padding: 0 var(--sp-extra-tight); - } - - &__header-btn { - min-width: 0; - @extend .cp-fx__row--s-c; - @include dir.side(margin, 0, auto); - padding: var(--sp-ultra-tight) var(--sp-extra-tight); - border-radius: calc(var(--bo-radius) / 2); - cursor: pointer; - - @media (hover:hover) { - &:hover { - background-color: var(--bg-surface-hover); - box-shadow: var(--bs-surface-outline); - } - } - &:focus, - &:active { - background-color: var(--bg-surface-active); - box-shadow: var(--bs-surface-outline); - outline: none; - } - } - - &__content { - padding-bottom: calc(2 * var(--sp-extra-loose)); - - & .room-profile { - margin: var(--sp-extra-loose); - } - } - - & .tabs { - position: sticky; - top: 0; - z-index: 999; - width: 100%; + & .pw { background-color: var(--bg-surface-low); - box-shadow: 0 -4px 0 var(--bg-surface-low), - inset 0 -1px 0 var(--bg-surface-border); - - &__content { - padding: 0 var(--sp-normal); - } } - + + & .room-profile { + padding: var(--sp-loose) var(--sp-extra-loose); + } + + & .tabs__content { + padding: 0 var(--sp-normal); + } + &__cards-wrapper { padding: 0 var(--sp-normal); @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); @@ -75,7 +34,7 @@ .room-settings .room-permissions__card, .room-settings .room-search__form, -.room-settings .room-search__result-item , +.room-settings .room-search__result-item, .room-settings .room-members { @extend .room-settings__card; -} \ No newline at end of file +} diff --git a/src/app/organisms/room/RoomView.jsx b/src/app/organisms/room/RoomView.jsx deleted file mode 100644 index 9d97cb60..00000000 --- a/src/app/organisms/room/RoomView.jsx +++ /dev/null @@ -1,118 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './RoomView.scss'; -import { Text, config } from 'folds'; -import { EventType } from 'matrix-js-sdk'; - -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; - -import RoomViewHeader from './RoomViewHeader'; -import { RoomInput } from './RoomInput'; -import { useStateEvent } from '../../hooks/useStateEvent'; -import { StateEvent } from '../../../types/matrix/room'; -import { RoomTombstone } from './RoomTombstone'; -import { usePowerLevelsAPI } from '../../hooks/usePowerLevels'; -import { useMatrixClient } from '../../hooks/useMatrixClient'; -import { RoomInputPlaceholder } from './RoomInputPlaceholder'; -import { RoomTimeline } from './RoomTimeline'; -import { RoomViewTyping } from './RoomViewTyping'; -import { RoomViewFollowing } from './RoomViewFollowing'; -import { useEditor } from '../../components/editor'; - -function RoomView({ room, eventId }) { - const roomInputRef = useRef(null); - const roomViewRef = useRef(null); - - // eslint-disable-next-line react/prop-types - const { roomId } = room; - const editor = useEditor(); - - const mx = useMatrixClient(); - const tombstoneEvent = useStateEvent(room, StateEvent.RoomTombstone); - const { getPowerLevel, canSendEvent } = usePowerLevelsAPI(); - const myUserId = mx.getUserId(); - const canMessage = myUserId - ? canSendEvent(EventType.RoomMessage, getPowerLevel(myUserId)) - : false; - - useEffect(() => { - const settingsToggle = (isVisible) => { - const roomView = roomViewRef.current; - roomView.classList.toggle('room-view--dropped'); - - const roomViewContent = roomView.children[1]; - if (isVisible) { - setTimeout(() => { - if (!navigation.isRoomSettings) return; - roomViewContent.style.visibility = 'hidden'; - }, 200); - } else roomViewContent.style.visibility = 'visible'; - }; - navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - }; - }, []); - - return ( -
    - -
    -
    - - -
    -
    -
    - {tombstoneEvent ? ( - - ) : ( - <> - {canMessage && ( - - )} - {!canMessage && ( - - You do not have permission to post in this room - - )} - - )} -
    - -
    -
    -
    - ); -} - -RoomView.defaultProps = { - eventId: null, -}; -RoomView.propTypes = { - room: PropTypes.shape({}).isRequired, - eventId: PropTypes.string, -}; - -export default RoomView; diff --git a/src/app/organisms/room/RoomViewTyping.tsx b/src/app/organisms/room/RoomViewTyping.tsx deleted file mode 100644 index c393f3ae..00000000 --- a/src/app/organisms/room/RoomViewTyping.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import React, { useMemo } from 'react'; -import { Box, Icon, IconButton, Icons, Text, as } from 'folds'; -import { Room } from 'matrix-js-sdk'; -import classNames from 'classnames'; -import { useAtomValue, useSetAtom } from 'jotai'; -import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../../state/typingMembers'; -import { TypingIndicator } from '../../components/typing-indicator'; -import { getMemberDisplayName } from '../../utils/room'; -import { getMxIdLocalPart } from '../../utils/matrix'; -import * as css from './RoomViewTyping.css'; -import { useMatrixClient } from '../../hooks/useMatrixClient'; - -export type RoomViewTypingProps = { - room: Room; -}; -export const RoomViewTyping = as<'div', RoomViewTypingProps>( - ({ className, room, ...props }, ref) => { - const setTypingMembers = useSetAtom(roomIdToTypingMembersAtom); - const mx = useMatrixClient(); - const typingMembers = useAtomValue( - useMemo(() => selectRoomTypingMembersAtom(room.roomId, roomIdToTypingMembersAtom), [room]) - ); - - const typingNames = typingMembers - .filter((member) => member.userId !== mx.getUserId()) - .map((member) => getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId)) - .reverse(); - - if (typingNames.length === 0) { - return null; - } - - const handleDropAll = () => { - // some homeserver does not timeout typing status - // we have given option so user can drop their typing status - typingMembers.forEach((member) => - setTypingMembers({ - type: 'DELETE', - roomId: room.roomId, - member, - }) - ); - }; - - return ( - - - - {typingNames.length === 1 && ( - <> - {typingNames[0]} - - {' is typing...'} - - - )} - {typingNames.length === 2 && ( - <> - {typingNames[0]} - - {' and '} - - {typingNames[1]} - - {' are typing...'} - - - )} - {typingNames.length === 3 && ( - <> - {typingNames[0]} - - {', '} - - {typingNames[1]} - - {' and '} - - {typingNames[2]} - - {' are typing...'} - - - )} - {typingNames.length > 3 && ( - <> - {typingNames[0]} - - {', '} - - {typingNames[1]} - - {', '} - - {typingNames[2]} - - {' and '} - - {typingNames.length - 3} others - - {' are typing...'} - - - )} - - - - - - ); - } -); diff --git a/src/app/organisms/room/message/AudioContent.tsx b/src/app/organisms/room/message/AudioContent.tsx deleted file mode 100644 index 83e5dc01..00000000 --- a/src/app/organisms/room/message/AudioContent.tsx +++ /dev/null @@ -1,194 +0,0 @@ -/* eslint-disable jsx-a11y/media-has-caption */ -import { Badge, Chip, Icon, IconButton, Icons, ProgressBar, Spinner, Text, as, toRem } from 'folds'; -import React, { useCallback, useRef, useState } from 'react'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; -import { Range } from 'react-range'; -import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; -import { getFileSrcUrl } from './util'; -import { IAudioInfo } from '../../../../types/matrix/common'; -import { MediaControl } from '../../../components/media'; -import { - PlayTimeCallback, - useMediaLoading, - useMediaPlay, - useMediaPlayTimeCallback, - useMediaSeek, - useMediaVolume, -} from '../../../hooks/media'; -import { useThrottle } from '../../../hooks/useThrottle'; -import { secondsToMinutesAndSeconds } from '../../../utils/common'; - -const PLAY_TIME_THROTTLE_OPS = { - wait: 500, - immediate: true, -}; - -export type AudioContentProps = { - mimeType: string; - url: string; - info: IAudioInfo; - encInfo?: EncryptedAttachmentInfo; -}; -export const AudioContent = as<'div', AudioContentProps>( - ({ mimeType, url, info, encInfo, ...props }, ref) => { - const mx = useMatrixClient(); - - const [srcState, loadSrc] = useAsyncCallback( - useCallback( - () => getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo), - [mx, url, mimeType, encInfo] - ) - ); - - const audioRef = useRef(null); - - const [currentTime, setCurrentTime] = useState(0); - // duration in seconds. (NOTE: info.duration is in milliseconds) - const infoDuration = info.duration ?? 0; - const [duration, setDuration] = useState((infoDuration >= 0 ? infoDuration : 0) / 1000); - - const getAudioRef = useCallback(() => audioRef.current, []); - const { loading } = useMediaLoading(getAudioRef); - const { playing, setPlaying } = useMediaPlay(getAudioRef); - const { seek } = useMediaSeek(getAudioRef); - const { volume, mute, setMute, setVolume } = useMediaVolume(getAudioRef); - const handlePlayTimeCallback: PlayTimeCallback = useCallback((d, ct) => { - setDuration(d); - setCurrentTime(ct); - }, []); - useMediaPlayTimeCallback( - getAudioRef, - useThrottle(handlePlayTimeCallback, PLAY_TIME_THROTTLE_OPS) - ); - - const handlePlay = () => { - if (srcState.status === AsyncStatus.Success) { - setPlaying(!playing); - } else if (srcState.status !== AsyncStatus.Loading) { - loadSrc(); - } - }; - - return ( - seek(values[0])} - renderTrack={(params) => ( -
    - {params.children} - -
    - )} - renderThumb={(params) => ( - - )} - /> - } - leftControl={ - <> - - ) : ( - - ) - } - > - {playing ? 'Pause' : 'Play'} - - - {`${secondsToMinutesAndSeconds( - currentTime - )} / ${secondsToMinutesAndSeconds(duration)}`} - - } - rightControl={ - <> - setMute(!mute)} - aria-pressed={mute} - > - - - setVolume(values[0])} - renderTrack={(params) => ( -
    - {params.children} - -
    - )} - renderThumb={(params) => ( - - )} - /> - - } - {...props} - ref={ref} - > - -
    - ); - } -); diff --git a/src/app/organisms/room/message/StickerContent.tsx b/src/app/organisms/room/message/StickerContent.tsx deleted file mode 100644 index 49b8b8d1..00000000 --- a/src/app/organisms/room/message/StickerContent.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import { as, toRem } from 'folds'; -import { MatrixEvent } from 'matrix-js-sdk'; -import { - AttachmentBox, - MessageBrokenContent, - MessageDeletedContent, -} from '../../../components/message'; -import { ImageContent } from './ImageContent'; -import { scaleYDimension } from '../../../utils/common'; -import { IImageContent } from '../../../../types/matrix/common'; - -type StickerContentProps = { - mEvent: MatrixEvent; - autoPlay: boolean; -}; -export const StickerContent = as<'div', StickerContentProps>( - ({ mEvent, autoPlay, ...props }, ref) => { - if (mEvent.isRedacted()) return ; - const content = mEvent.getContent(); - const imgInfo = content?.info; - const mxcUrl = content.file?.url ?? content.url; - if (typeof mxcUrl !== 'string') { - return ; - } - const height = scaleYDimension(imgInfo?.w || 152, 152, imgInfo?.h || 152); - - return ( - - - - ); - } -); diff --git a/src/app/organisms/room/message/fileRenderer.tsx b/src/app/organisms/room/message/fileRenderer.tsx deleted file mode 100644 index 5ff70b33..00000000 --- a/src/app/organisms/room/message/fileRenderer.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import { MatrixEvent } from 'matrix-js-sdk'; -import { IFileContent } from '../../../../types/matrix/common'; -import { - Attachment, - AttachmentBox, - AttachmentContent, - AttachmentHeader, -} from '../../../components/message'; -import { FileHeader } from './FileHeader'; -import { FileContent } from './FileContent'; -import { FALLBACK_MIMETYPE } from '../../../utils/mimeTypes'; - -export const fileRenderer = (mEventId: string, mEvent: MatrixEvent) => { - const content = mEvent.getContent(); - - const fileInfo = content?.info; - const mxcUrl = content.file?.url ?? content.url; - - if (typeof mxcUrl !== 'string') { - return null; - } - - return ( - - - - - - - - - - - ); -}; diff --git a/src/app/organisms/room/message/index.ts b/src/app/organisms/room/message/index.ts deleted file mode 100644 index d8908616..00000000 --- a/src/app/organisms/room/message/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './ImageContent'; -export * from './VideoContent'; -export * from './FileHeader'; -export * from './fileRenderer'; -export * from './AudioContent'; -export * from './Reactions'; -export * from './EventContent'; -export * from './Message'; -export * from './EncryptedContent'; -export * from './StickerContent'; diff --git a/src/app/organisms/room/message/styles.css.ts b/src/app/organisms/room/message/styles.css.ts deleted file mode 100644 index d42cf05b..00000000 --- a/src/app/organisms/room/message/styles.css.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; -import { DefaultReset, color, config, toRem } from 'folds'; - -export const RelativeBase = style([ - DefaultReset, - { - position: 'relative', - width: '100%', - height: '100%', - }, -]); - -export const AbsoluteContainer = style([ - DefaultReset, - { - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - }, -]); - -export const AbsoluteFooter = style([ - DefaultReset, - { - position: 'absolute', - bottom: config.space.S100, - left: config.space.S100, - right: config.space.S100, - }, -]); - -export const ModalWide = style({ - minWidth: '85vw', - minHeight: '90vh', -}); - -export const MessageBase = style({ - position: 'relative', -}); - -export const MessageOptionsBase = style([ - DefaultReset, - { - position: 'absolute', - top: toRem(-30), - right: 0, - zIndex: 1, - }, -]); -export const MessageOptionsBar = style([ - DefaultReset, - { - padding: config.space.S100, - }, -]); - -export const MessageAvatar = style({ - cursor: 'pointer', -}); - -export const MessageQuickReaction = style({ - minWidth: toRem(32), -}); - -export const MessageMenuGroup = style({ - padding: config.space.S100, -}); - -export const MessageMenuItemText = style({ - flexGrow: 1, -}); - -export const ReactionsContainer = style({ - selectors: { - '&:empty': { - display: 'none', - }, - }, -}); - -export const ReactionsTooltipText = style({ - wordBreak: 'break-word', -}); - -export const UrlPreviewHolderGradient = recipe({ - base: [ - DefaultReset, - { - position: 'absolute', - height: '100%', - width: toRem(10), - zIndex: 1, - }, - ], - variants: { - position: { - Left: { - left: 0, - background: `linear-gradient(to right,${color.Surface.Container} , rgba(116,116,116,0))`, - }, - Right: { - right: 0, - background: `linear-gradient(to left,${color.Surface.Container} , rgba(116,116,116,0))`, - }, - }, - }, -}); -export const UrlPreviewHolderBtn = recipe({ - base: [ - DefaultReset, - { - position: 'absolute', - zIndex: 1, - }, - ], - variants: { - position: { - Left: { - left: 0, - transform: 'translateX(-25%)', - }, - Right: { - right: 0, - transform: 'translateX(25%)', - }, - }, - }, -}); diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index 64c898bf..66b68511 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -5,7 +5,6 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; -import { selectRoom, selectTab } from '../../../client/action/navigation'; import { joinRuleToIconSrc } from '../../../util/matrixUtil'; import { roomIdByActivity } from '../../../util/sort'; @@ -19,6 +18,7 @@ import RoomSelector from '../../molecules/room-selector/RoomSelector'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; function useVisiblityToggle(setResult) { const [isOpen, setIsOpen] = useState(false); @@ -64,13 +64,13 @@ function mapRoomIds(roomIds) { if (room.isSpaceRoom()) type = 'space'; else if (directs.has(roomId)) type = 'direct'; - return ({ + return { type, name: room.name, parents, roomId, room, - }); + }; }); } @@ -80,6 +80,7 @@ function Search() { const [isOpen, requestClose] = useVisiblityToggle(setResult); const searchRef = useRef(null); const mx = initMatrix.matrixClient; + const { navigateRoom, navigateSpace } = useRoomNavigate(); const handleSearchResults = (chunk, term) => { setResult({ @@ -155,8 +156,8 @@ function Search() { }; const openItem = (roomId, type) => { - if (type === 'space') selectTab(roomId); - else selectRoom(roomId); + if (type === 'space') navigateSpace(roomId); + else navigateRoom(roomId); requestClose(); }; @@ -173,7 +174,8 @@ function Search() { let imageSrc = null; let iconSrc = null; if (item.type === 'direct') { - imageSrc = item.room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; + imageSrc = + item.room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; } else { iconSrc = joinRuleToIconSrc(item.room.getJoinRule(), item.type === 'space'); } @@ -204,19 +206,21 @@ function Search() { size="small" >
    -
    { e.preventDefault(); openFirstResult(); }}> + { + e.preventDefault(); + openFirstResult(); + }} + > - +
    - { Array.isArray(result?.chunk) && result.chunk.map(renderRoomSelector) } + {Array.isArray(result?.chunk) && result.chunk.map(renderRoomSelector)}
    diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index 2c9d6d46..46fe7b3f 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -8,12 +8,6 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { leave } from '../../../client/action/room'; -import { - createSpaceShortcut, - deleteSpaceShortcut, - categorizeSpace, - unCategorizeSpace, -} from '../../../client/action/accountData'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; @@ -32,14 +26,9 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; import ShieldUserIC from '../../../../public/res/ic/outlined/shield-user.svg'; import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; -import PinIC from '../../../../public/res/ic/outlined/pin.svg'; -import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; -import CategoryIC from '../../../../public/res/ic/outlined/category.svg'; -import CategoryFilledIC from '../../../../public/res/ic/filled/category.svg'; import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; -import { useForceUpdate } from '../../hooks/useForceUpdate'; const tabText = { GENERAL: 'General', @@ -48,54 +37,36 @@ const tabText = { PERMISSIONS: 'Permissions', }; -const tabItems = [{ - iconSrc: SettingsIC, - text: tabText.GENERAL, - disabled: false, -}, { - iconSrc: UserIC, - text: tabText.MEMBERS, - disabled: false, -}, { - iconSrc: EmojiIC, - text: tabText.EMOJIS, - disabled: false, -}, { - iconSrc: ShieldUserIC, - text: tabText.PERMISSIONS, - disabled: false, -}]; +const tabItems = [ + { + iconSrc: SettingsIC, + text: tabText.GENERAL, + disabled: false, + }, + { + iconSrc: UserIC, + text: tabText.MEMBERS, + disabled: false, + }, + { + iconSrc: EmojiIC, + text: tabText.EMOJIS, + disabled: false, + }, + { + iconSrc: ShieldUserIC, + text: tabText.PERMISSIONS, + disabled: false, + }, +]; function GeneralSettings({ roomId }) { - const isPinned = initMatrix.accountData.spaceShortcut.has(roomId); - const isCategorized = initMatrix.accountData.categorizedSpaces.has(roomId); const roomName = initMatrix.matrixClient.getRoom(roomId)?.name; - const [, forceUpdate] = useForceUpdate(); return ( <>
    Options - { - if (isCategorized) unCategorizeSpace(roomId); - else categorizeSpace(roomId); - forceUpdate(); - }} - iconSrc={isCategorized ? CategoryFilledIC : CategoryIC} - > - {isCategorized ? 'Uncategorize subspaces' : 'Categorize subspaces'} - - { - if (isPinned) deleteSpaceShortcut(roomId); - else createSpaceShortcut(roomId); - forceUpdate(); - }} - iconSrc={isPinned ? PinFilledIC : PinIC} - > - {isPinned ? 'Unpin from sidebar' : 'Pin to sidebar'} - { @@ -103,7 +74,7 @@ function GeneralSettings({ roomId }) { 'Leave space', `Are you sure that you want to leave "${roomName}" space?`, 'Leave', - 'danger', + 'danger' ); if (isConfirmed) leave(roomId); }} @@ -165,12 +136,12 @@ function SpaceSettings() { {isOpen && twemojify(room.name)} — space settings - )} + } contentOptions={} onRequestClose={requestClose} > diff --git a/src/app/pages/App.tsx b/src/app/pages/App.tsx index 62c173f9..b16462df 100644 --- a/src/app/pages/App.tsx +++ b/src/app/pages/App.tsx @@ -1,84 +1,43 @@ import React from 'react'; import { Provider as JotaiProvider } from 'jotai'; -import { - Route, - RouterProvider, - createBrowserRouter, - createHashRouter, - createRoutesFromElements, - redirect, -} from 'react-router-dom'; +import { RouterProvider } from 'react-router-dom'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { ClientConfigLoader } from '../components/ClientConfigLoader'; -import { ClientConfig, ClientConfigProvider } from '../hooks/useClientConfig'; -import { AuthLayout, Login, Register, ResetPassword, authLayoutLoader } from './auth'; -import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, ROOT_PATH } from './paths'; -import { isAuthenticated } from '../../client/state/auth'; -import Client from '../templates/client/Client'; -import { getLoginPath } from './pathUtils'; +import { ClientConfigProvider } from '../hooks/useClientConfig'; import { ConfigConfigError, ConfigConfigLoading } from './ConfigConfig'; import { FeatureCheck } from './FeatureCheck'; +import { createRouter } from './Router'; +import { ScreenSizeProvider, useScreenSize } from '../hooks/useScreenSize'; -const createRouter = (clientConfig: ClientConfig) => { - const { hashRouter } = clientConfig; +const queryClient = new QueryClient(); - const routes = createRoutesFromElements( - - { - if (isAuthenticated()) return redirect('/home'); - return redirect(getLoginPath()); - }} - /> - }> - } /> - } /> - } /> - - - { - if (!isAuthenticated()) return redirect(getLoginPath()); - return null; - }} - > - } /> - direct

    } /> - :spaceIdOrAlias

    } /> - explore

    } /> -
    - Page not found

    } /> -
    - ); - - if (hashRouter?.enabled) { - return createHashRouter(routes, { basename: hashRouter.basename }); - } - return createBrowserRouter(routes, { - basename: import.meta.env.BASE_URL, - }); -}; - -// TODO: app crash boundary function App() { + const screenSize = useScreenSize(); + return ( - - } - error={(err, retry, ignore) => ( - - )} - > - {(clientConfig) => ( - - - - - - )} - - + + + } + error={(err, retry, ignore) => ( + + )} + > + {(clientConfig) => ( + + + + + + + + + )} + + + ); } diff --git a/src/app/pages/MobileFriendly.tsx b/src/app/pages/MobileFriendly.tsx new file mode 100644 index 00000000..ca947ac6 --- /dev/null +++ b/src/app/pages/MobileFriendly.tsx @@ -0,0 +1,44 @@ +import { ReactNode } from 'react'; +import { useMatch } from 'react-router-dom'; +import { ScreenSize, useScreenSizeContext } from '../hooks/useScreenSize'; +import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from './paths'; + +type MobileFriendlyClientNavProps = { + children: ReactNode; +}; +export function MobileFriendlyClientNav({ children }: MobileFriendlyClientNavProps) { + const screenSize = useScreenSizeContext(); + const homeMatch = useMatch({ path: HOME_PATH, caseSensitive: true, end: true }); + const directMatch = useMatch({ path: DIRECT_PATH, caseSensitive: true, end: true }); + const spaceMatch = useMatch({ path: SPACE_PATH, caseSensitive: true, end: true }); + const exploreMatch = useMatch({ path: EXPLORE_PATH, caseSensitive: true, end: true }); + const inboxMatch = useMatch({ path: INBOX_PATH, caseSensitive: true, end: true }); + + if ( + screenSize === ScreenSize.Mobile && + !(homeMatch || directMatch || spaceMatch || exploreMatch || inboxMatch) + ) { + return null; + } + + return children; +} + +type MobileFriendlyPageNavProps = { + path: string; + children: ReactNode; +}; +export function MobileFriendlyPageNav({ path, children }: MobileFriendlyPageNavProps) { + const screenSize = useScreenSizeContext(); + const exactPath = useMatch({ + path, + caseSensitive: true, + end: true, + }); + + if (screenSize === ScreenSize.Mobile && !exactPath) { + return null; + } + + return children; +} diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx new file mode 100644 index 00000000..ffa20d4e --- /dev/null +++ b/src/app/pages/Router.tsx @@ -0,0 +1,269 @@ +import React from 'react'; +import { + Outlet, + Route, + createBrowserRouter, + createHashRouter, + createRoutesFromElements, + redirect, +} from 'react-router-dom'; + +import { ClientConfig } from '../hooks/useClientConfig'; +import { AuthLayout, Login, Register, ResetPassword } from './auth'; +import { + DIRECT_PATH, + EXPLORE_PATH, + HOME_PATH, + LOGIN_PATH, + INBOX_PATH, + REGISTER_PATH, + RESET_PASSWORD_PATH, + SPACE_PATH, + _CREATE_PATH, + _FEATURED_PATH, + _INVITES_PATH, + _JOIN_PATH, + _LOBBY_PATH, + _NOTIFICATIONS_PATH, + _ROOM_PATH, + _SEARCH_PATH, + _SERVER_PATH, +} from './paths'; +import { isAuthenticated } from '../../client/state/auth'; +import { + getAppPathFromHref, + getExploreFeaturedPath, + getHomePath, + getInboxNotificationsPath, + getLoginPath, + getOriginBaseUrl, + getSpaceLobbyPath, +} from './pathUtils'; +import { ClientBindAtoms, ClientLayout, ClientRoot } from './client'; +import { Home, HomeRouteRoomProvider, HomeSearch } from './client/home'; +import { Direct, DirectRouteRoomProvider } from './client/direct'; +import { RouteSpaceProvider, Space, SpaceRouteRoomProvider, SpaceSearch } from './client/space'; +import { Explore, FeaturedRooms, PublicRooms } from './client/explore'; +import { Notifications, Inbox, Invites } from './client/inbox'; +import { setAfterLoginRedirectPath } from './afterLoginRedirectPath'; +import { Room } from '../features/room'; +import { Lobby } from '../features/lobby'; +import { WelcomePage } from './client/WelcomePage'; +import { SidebarNav } from './client/SidebarNav'; +import { PageRoot } from '../components/page'; +import { ScreenSize } from '../hooks/useScreenSize'; +import { MobileFriendlyPageNav, MobileFriendlyClientNav } from './MobileFriendly'; +import { ClientInitStorageAtom } from './client/ClientInitStorageAtom'; + +export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) => { + const { hashRouter } = clientConfig; + const mobile = screenSize === ScreenSize.Mobile; + + const routes = createRoutesFromElements( + + { + if (isAuthenticated()) return redirect(getHomePath()); + const afterLoginPath = getAppPathFromHref(getOriginBaseUrl(), window.location.href); + if (afterLoginPath) setAfterLoginRedirectPath(afterLoginPath); + return redirect(getLoginPath()); + }} + /> + { + if (isAuthenticated()) { + return redirect(getHomePath()); + } + + return null; + }} + element={} + > + } /> + } /> + } /> + + + { + if (!isAuthenticated()) { + const afterLoginPath = getAppPathFromHref( + getOriginBaseUrl(hashRouter), + window.location.href + ); + if (afterLoginPath) setAfterLoginRedirectPath(afterLoginPath); + return redirect(getLoginPath()); + } + return null; + }} + element={ + + + + + + + } + > + + + + + + } + > + + + + } + > + + + } + > + {mobile ? null : } />} + create

    } /> + join

    } /> + } /> + + + + } + /> + + + + + } + > + + + } + > + {mobile ? null : } />} + create

    } /> + + + + } + /> + + + + + + } + > + + + + } + > + {mobile ? null : ( + { + const { spaceIdOrAlias } = params; + if (spaceIdOrAlias) { + return redirect(getSpaceLobbyPath(spaceIdOrAlias)); + } + return null; + }} + element={} + /> + )} + } /> + } /> + + + + } + /> + + + + + } + > + + + } + > + {mobile ? null : ( + redirect(getExploreFeaturedPath())} + element={} + /> + )} + } /> + } /> + + + + + } + > + + + } + > + {mobile ? null : ( + redirect(getInboxNotificationsPath())} + element={} + /> + )} + } /> + } /> + + + Page not found

    } /> +
    + ); + + if (hashRouter?.enabled) { + return createHashRouter(routes, { basename: hashRouter.basename }); + } + return createBrowserRouter(routes, { + basename: import.meta.env.BASE_URL, + }); +}; diff --git a/src/app/pages/afterLoginRedirectPath.ts b/src/app/pages/afterLoginRedirectPath.ts new file mode 100644 index 00000000..60e09da3 --- /dev/null +++ b/src/app/pages/afterLoginRedirectPath.ts @@ -0,0 +1,12 @@ +const AFTER_LOGIN_REDIRECT_PATH_KEY = 'after_login_redirect_url'; + +export const setAfterLoginRedirectPath = (url: string): void => { + localStorage.setItem(AFTER_LOGIN_REDIRECT_PATH_KEY, url); +}; +export const getAfterLoginRedirectPath = (): string | undefined => { + const url = localStorage.getItem(AFTER_LOGIN_REDIRECT_PATH_KEY); + return url ?? undefined; +}; +export const deleteAfterLoginRedirectPath = (): void => { + localStorage.removeItem(AFTER_LOGIN_REDIRECT_PATH_KEY); +}; diff --git a/src/app/pages/auth/AuthLayout.tsx b/src/app/pages/auth/AuthLayout.tsx index c58ecdd5..2ea94142 100644 --- a/src/app/pages/auth/AuthLayout.tsx +++ b/src/app/pages/auth/AuthLayout.tsx @@ -1,11 +1,9 @@ import React, { useCallback, useEffect } from 'react'; import { Box, Header, Scroll, Spinner, Text, color } from 'folds'; import { - LoaderFunction, Outlet, generatePath, matchPath, - redirect, useLocation, useNavigate, useParams, @@ -15,14 +13,13 @@ import classNames from 'classnames'; import { AuthFooter } from './AuthFooter'; import * as css from './styles.css'; import * as PatternsCss from '../../styles/Patterns.css'; -import { isAuthenticated } from '../../../client/state/auth'; import { clientAllowedServer, clientDefaultServer, useClientConfig, } from '../../hooks/useClientConfig'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; -import { LOGIN_PATH, REGISTER_PATH } from '../paths'; +import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH } from '../paths'; import CinnySVG from '../../../../public/res/svg/cinny.svg'; import { ServerPicker } from './ServerPicker'; import { AutoDiscoveryAction, autoDiscovery } from '../../cs-api'; @@ -33,18 +30,13 @@ import { AuthFlowsLoader } from '../../components/AuthFlowsLoader'; import { AuthFlowsProvider } from '../../hooks/useAuthFlows'; import { AuthServerProvider } from '../../hooks/useAuthServer'; -export const authLayoutLoader: LoaderFunction = () => { - if (isAuthenticated()) { - return redirect('/'); - } - - return null; -}; - const currentAuthPath = (pathname: string): string => { if (matchPath(LOGIN_PATH, pathname)) { return LOGIN_PATH; } + if (matchPath(RESET_PASSWORD_PATH, pathname)) { + return RESET_PASSWORD_PATH; + } if (matchPath(REGISTER_PATH, pathname)) { return REGISTER_PATH; } @@ -175,6 +167,7 @@ export function AuthLayout() { ( mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId); + const anyAsBtn = providers.find( + (provider) => !provider.icon || !mx.mxcUrlToHttp(provider.icon, 96, 96, 'crop', false) + ); + return ( {providers.map((provider) => { @@ -23,7 +27,7 @@ export function SSOLogin({ providers, redirectUrl, asIcons }: SSOLoginProps) { const buttonTitle = `Continue with ${name}`; - if (iconUrl && asIcons) { + if (!anyAsBtn && iconUrl && asIcons) { return ( void; }) { - const [serverMenu, setServerMenu] = useState(false); + const [serverMenuAnchor, setServerMenuAnchor] = useState(); const serverInputRef = useRef(null); useEffect(() => { @@ -53,7 +54,7 @@ export function ServerPicker({ const handleKeyDown: KeyboardEventHandler = (evt) => { if (evt.key === 'ArrowDown') { evt.preventDefault(); - setServerMenu(true); + setServerMenuAnchor(undefined); } if (evt.key === 'Enter') { evt.preventDefault(); @@ -67,7 +68,12 @@ export function ServerPicker({ if (selectedServer) { onServerChange(selectedServer); } - setServerMenu(false); + setServerMenuAnchor(undefined); + }; + + const handleOpenServerMenu: MouseEventHandler = (evt) => { + const target = evt.currentTarget.parentElement ?? evt.currentTarget; + setServerMenuAnchor(target.getBoundingClientRect()); }; return ( @@ -81,11 +87,11 @@ export function ServerPicker({ onKeyDown={handleKeyDown} size="500" readOnly={!allowCustomServer} - onClick={allowCustomServer ? undefined : () => setServerMenu(true)} + onClick={allowCustomServer ? undefined : handleOpenServerMenu} after={ serverList.length === 0 || (serverList.length === 1 && !allowCustomServer) ? undefined : ( setServerMenu(false), + onDeactivate: () => setServerMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', @@ -120,18 +126,15 @@ export function ServerPicker({ } > - {(anchorRef) => ( - setServerMenu(true)} - variant={allowCustomServer ? 'Background' : 'Surface'} - size="300" - aria-pressed={serverMenu} - radii="300" - > - - - )} + + + ) } diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx index 901b19cb..e1689d1e 100644 --- a/src/app/pages/auth/login/Login.tsx +++ b/src/app/pages/auth/login/Login.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { Box, Text, color } from 'folds'; import { Link, useSearchParams } from 'react-router-dom'; import { useAuthFlows } from '../../../hooks/useAuthFlows'; @@ -23,18 +23,22 @@ const getLoginTokenSearchParam = () => { return loginToken ?? undefined; }; -const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => ({ - username: searchParams.get('username') ?? undefined, - email: searchParams.get('email') ?? undefined, - loginToken: searchParams.get('loginToken') ?? undefined, -}); +const useLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => + useMemo( + () => ({ + username: searchParams.get('username') ?? undefined, + email: searchParams.get('email') ?? undefined, + loginToken: searchParams.get('loginToken') ?? undefined, + }), + [searchParams] + ); export function Login() { const server = useAuthServer(); const { hashRouter } = useClientConfig(); const { loginFlows } = useAuthFlows(); const [searchParams] = useSearchParams(); - const loginSearchParams = getLoginSearchParams(searchParams); + const loginSearchParams = useLoginSearchParams(searchParams); const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server)); const loginTokenForHashRouter = getLoginTokenSearchParam(); const absoluteLoginPath = usePathWithOrigin(getLoginPath(server)); diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx index ea52aad8..b9dd14b7 100644 --- a/src/app/pages/auth/login/PasswordLoginForm.tsx +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -1,4 +1,4 @@ -import React, { FormEventHandler, useCallback, useState } from 'react'; +import React, { FormEventHandler, MouseEventHandler, useCallback, useState } from 'react'; import { Box, Button, @@ -12,6 +12,7 @@ import { OverlayBackdrop, OverlayCenter, PopOut, + RectCords, Spinner, Text, config, @@ -37,17 +38,21 @@ import { FieldError } from '../FiledError'; import { getResetPasswordPath } from '../../pathUtils'; function UsernameHint({ server }: { server: string }) { - const [open, setOpen] = useState(false); + const [anchor, setAnchor] = useState(); + + const handleOpenMenu: MouseEventHandler = (evt) => { + setAnchor(evt.currentTarget.getBoundingClientRect()); + }; return ( setOpen(false), + onDeactivate: () => setAnchor(undefined), clickOutsideDeactivates: true, }} > @@ -84,20 +89,17 @@ function UsernameHint({ server }: { server: string }) { } > - {(targetRef) => ( - setOpen(true)} - ref={targetRef} - type="button" - variant="Background" - size="300" - radii="300" - aria-pressed={open} - > - - - )} + + + ); } diff --git a/src/app/pages/auth/login/loginUtil.ts b/src/app/pages/auth/login/loginUtil.ts index b2fd3870..1e2248d9 100644 --- a/src/app/pages/auth/login/loginUtil.ts +++ b/src/app/pages/auth/login/loginUtil.ts @@ -5,8 +5,12 @@ import { useNavigate } from 'react-router-dom'; import { ClientConfig, clientAllowedServer } from '../../../hooks/useClientConfig'; import { autoDiscovery, specVersions } from '../../../cs-api'; import { updateLocalStore } from '../../../../client/action/auth'; -import { ROOT_PATH } from '../../paths'; import { ErrorCode } from '../../../cs-errorcode'; +import { + deleteAfterLoginRedirectPath, + getAfterLoginRedirectPath, +} from '../../afterLoginRedirectPath'; +import { getHomePath } from '../../pathUtils'; export enum GetBaseUrlError { NotAllow = 'NotAllow', @@ -111,8 +115,9 @@ export const useLoginComplete = (data?: CustomLoginResponse) => { if (data) { const { response: loginRes, baseUrl: loginBaseUrl } = data; updateLocalStore(loginRes.access_token, loginRes.device_id, loginRes.user_id, loginBaseUrl); - // TODO: add after login redirect url - navigate(ROOT_PATH, { replace: true }); + const afterLoginRedirectUrl = getAfterLoginRedirectPath(); + deleteAfterLoginRedirectPath(); + navigate(afterLoginRedirectUrl ?? getHomePath(), { replace: true }); } }, [data, navigate]); }; diff --git a/src/app/pages/auth/register/Register.tsx b/src/app/pages/auth/register/Register.tsx index 756b13b3..c859d0e5 100644 --- a/src/app/pages/auth/register/Register.tsx +++ b/src/app/pages/auth/register/Register.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { Box, Text, color } from 'folds'; import { Link, useSearchParams } from 'react-router-dom'; import { useAuthServer } from '../../../hooks/useAuthServer'; @@ -12,17 +12,21 @@ import { getLoginPath } from '../../pathUtils'; import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin'; import { RegisterPathSearchParams } from '../../paths'; -const getRegisterSearchParams = (searchParams: URLSearchParams): RegisterPathSearchParams => ({ - username: searchParams.get('username') ?? undefined, - email: searchParams.get('email') ?? undefined, - token: searchParams.get('token') ?? undefined, -}); +const useRegisterSearchParams = (searchParams: URLSearchParams): RegisterPathSearchParams => + useMemo( + () => ({ + username: searchParams.get('username') ?? undefined, + email: searchParams.get('email') ?? undefined, + token: searchParams.get('token') ?? undefined, + }), + [searchParams] + ); export function Register() { const server = useAuthServer(); const { loginFlows, registerFlows } = useAuthFlows(); const [searchParams] = useSearchParams(); - const registerSearchParams = getRegisterSearchParams(searchParams); + const registerSearchParams = useRegisterSearchParams(searchParams); const { sso } = useParsedLoginFlows(loginFlows.flows); // redirect to /login because only that path handle m.login.token diff --git a/src/app/pages/auth/register/registerUtil.ts b/src/app/pages/auth/register/registerUtil.ts index 23c3d6a1..e8145780 100644 --- a/src/app/pages/auth/register/registerUtil.ts +++ b/src/app/pages/auth/register/registerUtil.ts @@ -9,8 +9,14 @@ import { import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { updateLocalStore } from '../../../../client/action/auth'; -import { ROOT_PATH } from '../../paths'; +import { LoginPathSearchParams } from '../../paths'; import { ErrorCode } from '../../../cs-errorcode'; +import { + deleteAfterLoginRedirectPath, + getAfterLoginRedirectPath, +} from '../../afterLoginRedirectPath'; +import { getHomePath, getLoginPath, withSearchParam } from '../../pathUtils'; +import { getMxIdLocalPart, getMxIdServer } from '../../../utils/matrix'; export enum RegisterError { UserTaken = 'UserTaken', @@ -114,11 +120,18 @@ export const useRegisterComplete = (data?: CustomRegisterResponse) => { if (accessToken && deviceId) { updateLocalStore(accessToken, deviceId, userId, baseUrl); - // TODO: add after register redirect url - navigate(ROOT_PATH, { replace: true }); + const afterLoginRedirectPath = getAfterLoginRedirectPath(); + deleteAfterLoginRedirectPath(); + navigate(afterLoginRedirectPath ?? getHomePath(), { replace: true }); } else { - // TODO: navigate to login with userId - navigate(ROOT_PATH, { replace: true }); + const username = getMxIdLocalPart(userId); + const userServer = getMxIdServer(userId); + navigate( + withSearchParam(getLoginPath(userServer), { + username, + }), + { replace: true } + ); } } }, [data, navigate]); diff --git a/src/app/pages/auth/reset-password/ResetPassword.tsx b/src/app/pages/auth/reset-password/ResetPassword.tsx index 1ada9afd..c5e1d2ad 100644 --- a/src/app/pages/auth/reset-password/ResetPassword.tsx +++ b/src/app/pages/auth/reset-password/ResetPassword.tsx @@ -1,24 +1,25 @@ import { Box, Text } from 'folds'; -import React from 'react'; +import React, { useMemo } from 'react'; import { Link, useSearchParams } from 'react-router-dom'; import { getLoginPath } from '../../pathUtils'; import { useAuthServer } from '../../../hooks/useAuthServer'; import { PasswordResetForm } from './PasswordResetForm'; +import { ResetPasswordPathSearchParams } from '../../paths'; -export type ResetPasswordSearchParams = { - email?: string; -}; - -const getResetPasswordSearchParams = ( +const useResetPasswordSearchParams = ( searchParams: URLSearchParams -): ResetPasswordSearchParams => ({ - email: searchParams.get('email') ?? undefined, -}); +): ResetPasswordPathSearchParams => + useMemo( + () => ({ + email: searchParams.get('email') ?? undefined, + }), + [searchParams] + ); export function ResetPassword() { const server = useAuthServer(); const [searchParams] = useSearchParams(); - const resetPasswordSearchParams = getResetPasswordSearchParams(searchParams); + const resetPasswordSearchParams = useResetPasswordSearchParams(searchParams); return ( diff --git a/src/app/pages/client/ClientBindAtoms.ts b/src/app/pages/client/ClientBindAtoms.ts new file mode 100644 index 00000000..5d57321e --- /dev/null +++ b/src/app/pages/client/ClientBindAtoms.ts @@ -0,0 +1,14 @@ +import { ReactNode } from 'react'; + +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { useBindAtoms } from '../../state/hooks/useBindAtoms'; + +type ClientBindAtomsProps = { + children: ReactNode; +}; +export function ClientBindAtoms({ children }: ClientBindAtomsProps) { + const mx = useMatrixClient(); + useBindAtoms(mx); + + return children; +} diff --git a/src/app/pages/client/ClientInitStorageAtom.tsx b/src/app/pages/client/ClientInitStorageAtom.tsx new file mode 100644 index 00000000..1abee707 --- /dev/null +++ b/src/app/pages/client/ClientInitStorageAtom.tsx @@ -0,0 +1,38 @@ +import React, { ReactNode, useMemo } from 'react'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { makeClosedNavCategoriesAtom } from '../../state/closedNavCategories'; +import { ClosedNavCategoriesProvider } from '../../state/hooks/closedNavCategories'; +import { makeClosedLobbyCategoriesAtom } from '../../state/closedLobbyCategories'; +import { ClosedLobbyCategoriesProvider } from '../../state/hooks/closedLobbyCategories'; +import { makeNavToActivePathAtom } from '../../state/navToActivePath'; +import { NavToActivePathProvider } from '../../state/hooks/navToActivePath'; +import { makeOpenedSidebarFolderAtom } from '../../state/openedSidebarFolder'; +import { OpenedSidebarFolderProvider } from '../../state/hooks/openedSidebarFolder'; + +type ClientInitStorageAtomProps = { + children: ReactNode; +}; +export function ClientInitStorageAtom({ children }: ClientInitStorageAtomProps) { + const mx = useMatrixClient(); + const userId = mx.getUserId()!; + + const closedNavCategoriesAtom = useMemo(() => makeClosedNavCategoriesAtom(userId), [userId]); + + const closedLobbyCategoriesAtom = useMemo(() => makeClosedLobbyCategoriesAtom(userId), [userId]); + + const navToActivePathAtom = useMemo(() => makeNavToActivePathAtom(userId), [userId]); + + const openedSidebarFolderAtom = useMemo(() => makeOpenedSidebarFolderAtom(userId), [userId]); + + return ( + + + + + {children} + + + + + ); +} diff --git a/src/app/pages/client/ClientLayout.tsx b/src/app/pages/client/ClientLayout.tsx new file mode 100644 index 00000000..208d12e4 --- /dev/null +++ b/src/app/pages/client/ClientLayout.tsx @@ -0,0 +1,15 @@ +import React, { ReactNode } from 'react'; +import { Box } from 'folds'; + +type ClientLayoutProps = { + nav: ReactNode; + children: ReactNode; +}; +export function ClientLayout({ nav, children }: ClientLayoutProps) { + return ( + + {nav} + {children} + + ); +} diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx new file mode 100644 index 00000000..1bb7855b --- /dev/null +++ b/src/app/pages/client/ClientRoot.tsx @@ -0,0 +1,87 @@ +import { Box, Spinner, Text } from 'folds'; +import React, { ReactNode, useEffect, useState } from 'react'; +import initMatrix from '../../../client/initMatrix'; +import { initHotkeys } from '../../../client/event/hotkeys'; +import { initRoomListListener } from '../../../client/event/roomList'; +import { getSecret } from '../../../client/state/auth'; +import { SplashScreen } from '../../components/splash-screen'; +import { CapabilitiesAndMediaConfigLoader } from '../../components/CapabilitiesAndMediaConfigLoader'; +import { CapabilitiesProvider } from '../../hooks/useCapabilities'; +import { MediaConfigProvider } from '../../hooks/useMediaConfig'; +import { MatrixClientProvider } from '../../hooks/useMatrixClient'; +import { SpecVersions } from './SpecVersions'; +import Windows from '../../organisms/pw/Windows'; +import Dialogs from '../../organisms/pw/Dialogs'; +import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; + +function SystemEmojiFeature() { + const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); + + if (twitterEmoji) { + document.documentElement.style.setProperty('--font-emoji', 'Twemoji'); + } else { + document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); + } + + return null; +} + +function ClientRootLoading() { + return ( + + + + Heating up + + + ); +} + +type ClientRootProps = { + children: ReactNode; +}; +export function ClientRoot({ children }: ClientRootProps) { + const [loading, setLoading] = useState(true); + const { baseUrl } = getSecret(); + + useEffect(() => { + const handleStart = () => { + initHotkeys(); + initRoomListListener(initMatrix.roomList); + setLoading(false); + }; + initMatrix.once('init_loading_finished', handleStart); + if (!initMatrix.matrixClient) initMatrix.init(); + return () => { + initMatrix.removeListener('init_loading_finished', handleStart); + }; + }, []); + + return ( + + {loading ? ( + + ) : ( + + + {(capabilities, mediaConfig) => ( + + + {children} + + {/* TODO: remove these components after navigation refactor */} + + + + + + + )} + + + )} + + ); +} diff --git a/src/app/pages/client/SidebarNav.tsx b/src/app/pages/client/SidebarNav.tsx new file mode 100644 index 00000000..fb6bd742 --- /dev/null +++ b/src/app/pages/client/SidebarNav.tsx @@ -0,0 +1,76 @@ +import React, { useRef } from 'react'; +import { Icon, Icons, Scroll } from 'folds'; + +import { + Sidebar, + SidebarContent, + SidebarStackSeparator, + SidebarStack, + SidebarAvatar, + SidebarItemTooltip, + SidebarItem, +} from '../../components/sidebar'; +import { DirectTab, HomeTab, SpaceTabs, InboxTab, ExploreTab, UserTab } from './sidebar'; +import { openCreateRoom, openSearch } from '../../../client/action/navigation'; + +export function SidebarNav() { + const scrollRef = useRef(null); + + return ( + + + + + + + + + + + + + {(triggerRef) => ( + openCreateRoom(true)} + > + + + )} + + + + + } + sticky={ + <> + + + + + {(triggerRef) => ( + openSearch()} + > + + + )} + + + + + + + + } + /> + + ); +} diff --git a/src/app/pages/client/SpecVersions.tsx b/src/app/pages/client/SpecVersions.tsx new file mode 100644 index 00000000..952885cd --- /dev/null +++ b/src/app/pages/client/SpecVersions.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react'; +import { Box, Dialog, config, Text, Button, Spinner } from 'folds'; +import { SpecVersionsLoader } from '../../components/SpecVersionsLoader'; +import { SpecVersionsProvider } from '../../hooks/useSpecVersions'; +import { SplashScreen } from '../../components/splash-screen'; + +export function SpecVersions({ baseUrl, children }: { baseUrl: string; children: ReactNode }) { + return ( + ( + + + + Connecting to server + + + )} + error={(err, retry, ignore) => ( + + + + + + Failed to connect to homeserver. Either homeserver is down or your internet. + + + + + + + + )} + > + {(versions) => {children}} + + ); +} diff --git a/src/app/pages/client/WelcomePage.tsx b/src/app/pages/client/WelcomePage.tsx new file mode 100644 index 00000000..2486625f --- /dev/null +++ b/src/app/pages/client/WelcomePage.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { Box, Button, Icon, Icons, Text, config, toRem } from 'folds'; +import { Page, PageHero, PageHeroSection } from '../../components/page'; +import CinnySVG from '../../../../public/res/svg/cinny.svg'; + +export function WelcomePage() { + return ( + + + + } + title="Welcome to Cinny" + subTitle={ + + Yet anothor matrix client.{' '} + + v3.2.0 + + + } + > + + + + + + + + + + + ); +} diff --git a/src/app/pages/client/direct/Direct.tsx b/src/app/pages/client/direct/Direct.tsx new file mode 100644 index 00000000..673a5d9f --- /dev/null +++ b/src/app/pages/client/direct/Direct.tsx @@ -0,0 +1,263 @@ +import React, { MouseEventHandler, forwardRef, useMemo, useRef, useState } from 'react'; +import { useAtom, useAtomValue } from 'jotai'; +import { + Avatar, + Box, + Button, + Icon, + IconButton, + Icons, + Menu, + MenuItem, + PopOut, + RectCords, + Text, + config, + toRem, +} from 'folds'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import FocusTrap from 'focus-trap-react'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { factoryRoomIdByActivity } from '../../../utils/sort'; +import { + NavButton, + NavCategory, + NavCategoryHeader, + NavEmptyCenter, + NavEmptyLayout, + NavItem, + NavItemContent, +} from '../../../components/nav'; +import { getDirectRoomPath } from '../../pathUtils'; +import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { VirtualTile } from '../../../components/virtualizer'; +import { RoomNavCategoryButton, RoomNavItem } from '../../../features/room-nav'; +import { muteChangesAtom } from '../../../state/room-list/mutedRoomList'; +import { makeNavCategoryId } from '../../../state/closedNavCategories'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { useCategoryHandler } from '../../../hooks/useCategoryHandler'; +import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; +import { useDirectRooms } from './useDirectRooms'; +import { openInviteUser } from '../../../../client/action/navigation'; +import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; +import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { markAsRead } from '../../../../client/action/notifications'; + +type DirectMenuProps = { + requestClose: () => void; +}; +const DirectMenu = forwardRef(({ requestClose }, ref) => { + const orphanRooms = useDirectRooms(); + const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + + const handleMarkAsRead = () => { + if (!unread) return; + orphanRooms.forEach((rId) => markAsRead(rId)); + requestClose(); + }; + + return ( + + + } + radii="300" + aria-disabled={!unread} + > + + Mark as Read + + + + + ); +}); + +function DirectHeader() { + const [menuAnchor, setMenuAnchor] = useState(); + + const handleOpenMenu: MouseEventHandler = (evt) => { + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + <> + + + + + Direct Messages + + + + + + + + + + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} /> + + } + /> + + ); +} + +function DirectEmpty() { + return ( + + } + title={ + + No Direct Messages + + } + content={ + + You do not have any direct messages yet. + + } + options={ + + } + /> + + ); +} + +const DEFAULT_CATEGORY_ID = makeNavCategoryId('direct', 'direct'); +export function Direct() { + const mx = useMatrixClient(); + useNavToActivePathMapper('direct'); + const scrollRef = useRef(null); + const directs = useDirectRooms(); + const muteChanges = useAtomValue(muteChangesAtom); + const mutedRooms = muteChanges.added; + const roomToUnread = useAtomValue(roomToUnreadAtom); + + const selectedRoomId = useSelectedRoom(); + const noRoomToDisplay = directs.length === 0; + const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom()); + + const sortedDirects = useMemo(() => { + const items = Array.from(directs).sort(factoryRoomIdByActivity(mx)); + if (closedCategories.has(DEFAULT_CATEGORY_ID)) { + return items.filter((rId) => roomToUnread.has(rId) || rId === selectedRoomId); + } + return items; + }, [mx, directs, closedCategories, roomToUnread, selectedRoomId]); + + const virtualizer = useVirtualizer({ + count: sortedDirects.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 38, + overscan: 10, + }); + + const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) => + closedCategories.has(categoryId) + ); + + return ( + + + {noRoomToDisplay ? ( + + ) : ( + + + + + openInviteUser()}> + + + + + + + + Create Chat + + + + + + + + + + + Chats + + +
    + {virtualizer.getVirtualItems().map((vItem) => { + const roomId = sortedDirects[vItem.index]; + const room = mx.getRoom(roomId); + if (!room) return null; + const selected = selectedRoomId === roomId; + + return ( + + + + ); + })} +
    +
    +
    +
    + )} +
    + ); +} diff --git a/src/app/pages/client/direct/RoomProvider.tsx b/src/app/pages/client/direct/RoomProvider.tsx new file mode 100644 index 00000000..c78a8f44 --- /dev/null +++ b/src/app/pages/client/direct/RoomProvider.tsx @@ -0,0 +1,26 @@ +import React, { ReactNode } from 'react'; +import { useParams } from 'react-router-dom'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { RoomProvider } from '../../../hooks/useRoom'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; +import { useDirectRooms } from './useDirectRooms'; + +export function DirectRouteRoomProvider({ children }: { children: ReactNode }) { + const mx = useMatrixClient(); + const rooms = useDirectRooms(); + + const { roomIdOrAlias } = useParams(); + const roomId = useSelectedRoom(); + const room = mx.getRoom(roomId); + + if (!room || !rooms.includes(room.roomId)) { + return ; + } + + return ( + + {children} + + ); +} diff --git a/src/app/pages/client/direct/index.ts b/src/app/pages/client/direct/index.ts new file mode 100644 index 00000000..36f44d63 --- /dev/null +++ b/src/app/pages/client/direct/index.ts @@ -0,0 +1,2 @@ +export * from './Direct'; +export * from './RoomProvider'; diff --git a/src/app/pages/client/direct/useDirectRooms.ts b/src/app/pages/client/direct/useDirectRooms.ts new file mode 100644 index 00000000..00009927 --- /dev/null +++ b/src/app/pages/client/direct/useDirectRooms.ts @@ -0,0 +1,12 @@ +import { useAtomValue } from 'jotai'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { useDirects } from '../../../state/hooks/roomList'; + +export const useDirectRooms = () => { + const mx = useMatrixClient(); + const mDirects = useAtomValue(mDirectAtom); + const directs = useDirects(mx, allRoomsAtom, mDirects); + return directs; +}; diff --git a/src/app/pages/client/explore/Explore.tsx b/src/app/pages/client/explore/Explore.tsx new file mode 100644 index 00000000..67f8dc3f --- /dev/null +++ b/src/app/pages/client/explore/Explore.tsx @@ -0,0 +1,269 @@ +import React, { FormEventHandler, useCallback, useRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import FocusTrap from 'focus-trap-react'; +import { + Avatar, + Box, + Button, + Dialog, + Header, + Icon, + IconButton, + Icons, + Input, + Overlay, + OverlayBackdrop, + OverlayCenter, + Text, + color, + config, +} from 'folds'; +import { + NavCategory, + NavCategoryHeader, + NavItem, + NavItemContent, + NavLink, +} from '../../../components/nav'; +import { getExploreFeaturedPath, getExploreServerPath } from '../../pathUtils'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { + useExploreFeaturedSelected, + useExploreServer, +} from '../../../hooks/router/useExploreSelected'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { getMxIdServer } from '../../../utils/matrix'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; +import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; + +export function AddServer() { + const mx = useMatrixClient(); + const navigate = useNavigate(); + const [dialog, setDialog] = useState(false); + const serverInputRef = useRef(null); + + const [exploreState] = useAsyncCallback( + useCallback((server: string) => mx.publicRooms({ server, limit: 1 }), [mx]) + ); + + const getInputServer = (): string | undefined => { + const serverInput = serverInputRef.current; + if (!serverInput) return undefined; + const server = serverInput.value.trim(); + return server || undefined; + }; + + const handleSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const server = getInputServer(); + if (!server) return; + // explore(server); + + navigate(getExploreServerPath(server)); + setDialog(false); + }; + + const handleView = () => { + const server = getInputServer(); + if (!server) return; + navigate(getExploreServerPath(server)); + setDialog(false); + }; + + return ( + <> + }> + + setDialog(false), + }} + > + +
    + + Add Server + + setDialog(false)} radii="300"> + + +
    + + Add server name to explore public communities. + + Server Name + + {exploreState.status === AsyncStatus.Error && ( + + Failed to load public rooms. Please try again. + + )} + + + {/* */} + + + + +
    +
    +
    +
    + + + ); +} + +export function Explore() { + const mx = useMatrixClient(); + useNavToActivePathMapper('explore'); + const userId = mx.getUserId(); + const clientConfig = useClientConfig(); + const userServer = userId ? getMxIdServer(userId) : undefined; + const servers = + clientConfig.featuredCommunities?.servers?.filter((server) => server !== userServer) ?? []; + + const featuredSelected = useExploreFeaturedSelected(); + const selectedServer = useExploreServer(); + + return ( + + + + + + Explore Community + + + + + + + + + + + + + + + + + + Featured + + + + + + + {userServer && ( + + + + + + + + + + {userServer} + + + + + + + )} + + {servers.length > 0 && ( + + + + Servers + + + {servers.map((server) => ( + + + + + + + + + + {server} + + + + + + + ))} + + )} + + + + + + + ); +} diff --git a/src/app/pages/client/explore/Featured.tsx b/src/app/pages/client/explore/Featured.tsx new file mode 100644 index 00000000..4838127f --- /dev/null +++ b/src/app/pages/client/explore/Featured.tsx @@ -0,0 +1,121 @@ +import React from 'react'; +import { Box, Icon, Icons, Scroll, Text } from 'folds'; +import { useAtomValue } from 'jotai'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { RoomCard, RoomCardGrid } from '../../../components/room-card'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { RoomSummaryLoader } from '../../../components/RoomSummaryLoader'; +import { + Page, + PageContent, + PageContentCenter, + PageHero, + PageHeroSection, +} from '../../../components/page'; +import { RoomTopicViewer } from '../../../components/room-topic-viewer'; +import * as css from './style.css'; +import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; + +export function FeaturedRooms() { + const { featuredCommunities } = useClientConfig(); + const { rooms, spaces } = featuredCommunities ?? {}; + const allRooms = useAtomValue(allRoomsAtom); + const { navigateSpace, navigateRoom } = useRoomNavigate(); + + return ( + + + + + + + + } + title="Featured by Client" + subTitle="Find and explore public rooms and spaces featured by client provider." + /> + + + {spaces && spaces.length > 0 && ( + + Featured Spaces + + {spaces.map((roomIdOrAlias) => ( + + {(roomSummary) => ( + ( + + )} + /> + )} + + ))} + + + )} + {rooms && rooms.length > 0 && ( + + Featured Rooms + + {rooms.map((roomIdOrAlias) => ( + + {(roomSummary) => ( + ( + + )} + /> + )} + + ))} + + + )} + {((spaces && spaces.length === 0 && rooms && rooms.length === 0) || + (!spaces && !rooms)) && ( + + + + No rooms or spaces featured by client provider. + + + )} + + + + + + + + ); +} diff --git a/src/app/pages/client/explore/Server.tsx b/src/app/pages/client/explore/Server.tsx new file mode 100644 index 00000000..9fe4e78e --- /dev/null +++ b/src/app/pages/client/explore/Server.tsx @@ -0,0 +1,645 @@ +import React, { + FormEventHandler, + MouseEventHandler, + RefObject, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { + Box, + Button, + Chip, + Icon, + Icons, + Input, + Line, + Menu, + MenuItem, + PopOut, + RectCords, + Scroll, + Spinner, + Text, + config, + toRem, +} from 'folds'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import FocusTrap from 'focus-trap-react'; +import { useAtomValue } from 'jotai'; +import { useQuery } from '@tanstack/react-query'; +import { MatrixClient, Method, RoomType } from 'matrix-js-sdk'; +import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { RoomTopicViewer } from '../../../components/room-topic-viewer'; +import { RoomCard, RoomCardBase, RoomCardGrid } from '../../../components/room-card'; +import { ExploreServerPathSearchParams } from '../../paths'; +import { getExploreServerPath, withSearchParam } from '../../pathUtils'; +import * as css from './style.css'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; +import { getMxIdServer } from '../../../utils/matrix'; + +const useServerSearchParams = (searchParams: URLSearchParams): ExploreServerPathSearchParams => + useMemo( + () => ({ + limit: searchParams.get('limit') ?? undefined, + since: searchParams.get('since') ?? undefined, + term: searchParams.get('term') ?? undefined, + type: searchParams.get('type') ?? undefined, + instance: searchParams.get('instance') ?? undefined, + }), + [searchParams] + ); + +type RoomTypeFilter = { + title: string; + value: string | undefined; +}; +const useRoomTypeFilters = (): RoomTypeFilter[] => + useMemo( + () => [ + { + title: 'All', + value: undefined, + }, + { + title: 'Spaces', + value: RoomType.Space, + }, + { + title: 'Rooms', + value: 'null', + }, + ], + [] + ); + +const FALLBACK_ROOMS_LIMIT = 24; + +type SearchProps = { + active?: boolean; + loading?: boolean; + searchInputRef: RefObject; + onSearch: (term: string) => void; + onReset: () => void; +}; +function Search({ active, loading, searchInputRef, onSearch, onReset }: SearchProps) { + const handleSearchSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const { searchInput } = evt.target as HTMLFormElement & { + searchInput: HTMLInputElement; + }; + + const searchTerm = searchInput.value.trim() || undefined; + if (searchTerm) { + onSearch(searchTerm); + } + }; + + return ( + + + Search + + ) : ( + + ) + } + after={ + active ? ( + } + onClick={onReset} + > + Clear + + ) : ( + + Enter + + ) + } + /> + + ); +} + +const DEFAULT_INSTANCE_NAME = 'Matrix'; +function ThirdPartyProtocolsSelector({ + instanceId, + onChange, +}: { + instanceId?: string; + onChange: (instanceId?: string) => void; +}) { + const mx = useMatrixClient(); + const [menuAnchor, setMenuAnchor] = useState(); + + const { data } = useQuery({ + queryKey: ['thirdparty', 'protocols'], + queryFn: () => mx.getThirdpartyProtocols(), + }); + + const handleInstanceSelect: MouseEventHandler = (evt): void => { + const insId = evt.currentTarget.getAttribute('data-instance-id') ?? undefined; + onChange(insId); + setMenuAnchor(undefined); + }; + + const handleOpenMenu: MouseEventHandler = (evt) => { + setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + }; + + const instances = data && Object.keys(data).flatMap((protocol) => data[protocol].instances); + if (!instances || instances.length === 0) return null; + const selectedInstance = instances.find((instance) => instanceId === instance.instance_id); + + return ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + }} + > + + + + Protocols + + + + + {DEFAULT_INSTANCE_NAME} + + + {instances.map((instance) => ( + + + {instance.desc} + + + ))} + + + + + } + > + } + > + + {selectedInstance?.desc ?? DEFAULT_INSTANCE_NAME} + + + + ); +} + +type LimitButtonProps = { + limit: number; + onLimitChange: (limit: string) => void; +}; +function LimitButton({ limit, onLimitChange }: LimitButtonProps) { + const [menuAnchor, setMenuAnchor] = useState(); + + const handleLimitSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + const limitInput = evt.currentTarget.limitInput as HTMLInputElement; + if (!limitInput) return; + const newLimit = limitInput.value.trim(); + if (!newLimit) return; + onLimitChange(newLimit); + }; + + const setLimit = (l: string) => { + setMenuAnchor(undefined); + onLimitChange(l); + }; + const handleOpenMenu: MouseEventHandler = (evt) => { + setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + }; + + return ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + }} + > + + + + Presets + + setLimit('24')} radii="Pill"> + 24 + + setLimit('48')} radii="Pill"> + 48 + + setLimit('96')} radii="Pill"> + 96 + + + + + + Custom Limit + + + + + + + + } + > + } + > + {`Page Limit: ${limit}`} + + + ); +} + +export function PublicRooms() { + const { server } = useParams(); + const mx = useMatrixClient(); + const userId = mx.getUserId(); + const userServer = userId && getMxIdServer(userId); + const allRooms = useAtomValue(allRoomsAtom); + const { navigateSpace, navigateRoom } = useRoomNavigate(); + + const [searchParams] = useSearchParams(); + const serverSearchParams = useServerSearchParams(searchParams); + const isSearch = !!serverSearchParams.term; + const scrollRef = useRef(null); + const searchInputRef = useRef(null); + const navigate = useNavigate(); + const roomTypeFilters = useRoomTypeFilters(); + + const currentLimit: number = useMemo(() => { + const limitParam = serverSearchParams.limit; + if (!limitParam) return FALLBACK_ROOMS_LIMIT; + return parseInt(limitParam, 10) || FALLBACK_ROOMS_LIMIT; + }, [serverSearchParams.limit]); + + const resetScroll = useCallback(() => { + const scroll = scrollRef.current; + if (scroll) scroll.scrollTop = 0; + }, []); + + const fetchPublicRooms = useCallback(() => { + const limit = + typeof serverSearchParams.limit === 'string' + ? parseInt(serverSearchParams.limit, 10) + : FALLBACK_ROOMS_LIMIT; + const roomType: string | null | undefined = + serverSearchParams.type === 'null' ? null : serverSearchParams.type; + + return mx.http.authedRequest>>( + Method.Post, + '/publicRooms', + { + server, + }, + { + limit, + since: serverSearchParams.since, + filter: { + generic_search_term: serverSearchParams.term, + room_types: roomType !== undefined ? [roomType] : undefined, + }, + third_party_instance_id: serverSearchParams.instance, + } + ); + }, [mx, server, serverSearchParams]); + + const { data, isLoading, error } = useQuery({ + queryKey: [ + server, + 'publicRooms', + serverSearchParams.limit, + serverSearchParams.since, + serverSearchParams.term, + serverSearchParams.type, + serverSearchParams.instance, + ], + queryFn: fetchPublicRooms, + }); + + useEffect(() => { + if (isLoading) resetScroll(); + }, [isLoading, resetScroll]); + + const explore = (newSearchParams: ExploreServerPathSearchParams) => { + if (!server) return; + + const sParams: Record = { + ...serverSearchParams, + ...newSearchParams, + }; + Object.keys(sParams).forEach((key) => { + if (sParams[key] === undefined) delete sParams[key]; + }); + const path = withSearchParam(getExploreServerPath(server), sParams); + navigate(path); + }; + + const paginateBack = () => { + const token = data?.prev_batch; + explore({ since: token }); + }; + + const paginateFront = () => { + const token = data?.next_batch; + explore({ since: token }); + }; + + const handleSearch = (term: string) => { + explore({ + term, + since: undefined, + }); + }; + + const handleSearchClear = () => { + if (searchInputRef.current) { + searchInputRef.current.value = ''; + } + explore({ + term: undefined, + since: undefined, + }); + }; + + const handleRoomFilterClick: MouseEventHandler = (evt) => { + const filter = evt.currentTarget.getAttribute('data-room-filter'); + explore({ + type: filter ?? undefined, + since: undefined, + }); + }; + + const handleLimitChange = (limit: string) => { + explore({ limit }); + }; + + const handleInstanceIdChange = (instanceId?: string) => { + explore({ instance: instanceId, since: undefined }); + }; + + return ( + + + {isSearch ? ( + <> + + } + onClick={handleSearchClear} + > + {server} + + + + + + + Search + + + + + ) : ( + + + + {server} + + + )} + + + + + + + + + + {isSearch ? ( + {`Results for "${serverSearchParams.term}"`} + ) : ( + Popular Communities + )} + + {roomTypeFilters.map((filter) => ( + + ) + } + outlined + > + {filter.title} + + ))} + {userServer === server && ( + <> + + + + )} + + + + + {isLoading && ( + + {[...Array(currentLimit).keys()].map((item) => ( + + ))} + + )} + {error && ( + + {error.name} + {error.message} + + )} + {data && + (data.chunk.length > 0 ? ( + <> + + {data?.chunk.map((chunkRoom) => ( + ( + + )} + /> + ))} + + + {(data.prev_batch || data.next_batch) && ( + + + + + + )} + + ) : ( + + + + No communities found! + + + ))} + + + + + + + + ); +} diff --git a/src/app/pages/client/explore/index.ts b/src/app/pages/client/explore/index.ts new file mode 100644 index 00000000..1149a10d --- /dev/null +++ b/src/app/pages/client/explore/index.ts @@ -0,0 +1,3 @@ +export * from './Explore'; +export * from './Server'; +export * from './Featured'; diff --git a/src/app/pages/client/explore/style.css.ts b/src/app/pages/client/explore/style.css.ts new file mode 100644 index 00000000..9186cb22 --- /dev/null +++ b/src/app/pages/client/explore/style.css.ts @@ -0,0 +1,19 @@ +import { style } from '@vanilla-extract/css'; +import { config } from 'folds'; +import { ContainerColor } from '../../../styles/ContainerColor.css'; + +export const RoomsInfoCard = style([ + ContainerColor({ variant: 'SurfaceVariant' }), + { + padding: `${config.space.S700} ${config.space.S300}`, + borderRadius: config.radii.R400, + }, +]); + +export const PublicRoomsError = style([ + ContainerColor({ variant: 'Critical' }), + { + padding: config.space.S300, + borderRadius: config.radii.R400, + }, +]); diff --git a/src/app/pages/client/home/Home.tsx b/src/app/pages/client/home/Home.tsx new file mode 100644 index 00000000..33714191 --- /dev/null +++ b/src/app/pages/client/home/Home.tsx @@ -0,0 +1,315 @@ +import React, { MouseEventHandler, forwardRef, useMemo, useRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { + Avatar, + Box, + Button, + Icon, + IconButton, + Icons, + Menu, + MenuItem, + PopOut, + RectCords, + Text, + config, + toRem, +} from 'folds'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import { useAtom, useAtomValue } from 'jotai'; +import FocusTrap from 'focus-trap-react'; +import { factoryRoomIdByActivity, factoryRoomIdByAtoZ } from '../../../utils/sort'; +import { + NavButton, + NavCategory, + NavCategoryHeader, + NavEmptyCenter, + NavEmptyLayout, + NavItem, + NavItemContent, + NavLink, +} from '../../../components/nav'; +import { getExplorePath, getHomeRoomPath, getHomeSearchPath } from '../../pathUtils'; +import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { useHomeSearchSelected } from '../../../hooks/router/useHomeSelected'; +import { useHomeRooms } from './useHomeRooms'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { VirtualTile } from '../../../components/virtualizer'; +import { RoomNavCategoryButton, RoomNavItem } from '../../../features/room-nav'; +import { muteChangesAtom } from '../../../state/room-list/mutedRoomList'; +import { makeNavCategoryId } from '../../../state/closedNavCategories'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { useCategoryHandler } from '../../../hooks/useCategoryHandler'; +import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; +import { openCreateRoom, openJoinAlias } from '../../../../client/action/navigation'; +import { PageNav, PageNavHeader, PageNavContent } from '../../../components/page'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { markAsRead } from '../../../../client/action/notifications'; +import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; + +type HomeMenuProps = { + requestClose: () => void; +}; +const HomeMenu = forwardRef(({ requestClose }, ref) => { + const orphanRooms = useHomeRooms(); + const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + + const handleMarkAsRead = () => { + if (!unread) return; + orphanRooms.forEach((rId) => markAsRead(rId)); + requestClose(); + }; + + return ( + + + } + radii="300" + aria-disabled={!unread} + > + + Mark as Read + + + + + ); +}); + +function HomeHeader() { + const [menuAnchor, setMenuAnchor] = useState(); + + const handleOpenMenu: MouseEventHandler = (evt) => { + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + <> + + + + + Home + + + + + + + + + + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} /> + + } + /> + + ); +} + +function HomeEmpty() { + const navigate = useNavigate(); + + return ( + + } + title={ + + No Rooms + + } + content={ + + You do not have any rooms yet. + + } + options={ + <> + + + + } + /> + + ); +} + +const DEFAULT_CATEGORY_ID = makeNavCategoryId('home', 'room'); +export function Home() { + const mx = useMatrixClient(); + useNavToActivePathMapper('home'); + const scrollRef = useRef(null); + const rooms = useHomeRooms(); + const muteChanges = useAtomValue(muteChangesAtom); + const mutedRooms = muteChanges.added; + const roomToUnread = useAtomValue(roomToUnreadAtom); + + const selectedRoomId = useSelectedRoom(); + const searchSelected = useHomeSearchSelected(); + const noRoomToDisplay = rooms.length === 0; + const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom()); + + const sortedRooms = useMemo(() => { + const items = Array.from(rooms).sort( + closedCategories.has(DEFAULT_CATEGORY_ID) + ? factoryRoomIdByActivity(mx) + : factoryRoomIdByAtoZ(mx) + ); + if (closedCategories.has(DEFAULT_CATEGORY_ID)) { + return items.filter((rId) => roomToUnread.has(rId) || rId === selectedRoomId); + } + return items; + }, [mx, rooms, closedCategories, roomToUnread, selectedRoomId]); + + const virtualizer = useVirtualizer({ + count: sortedRooms.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 38, + overscan: 10, + }); + + const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) => + closedCategories.has(categoryId) + ); + + return ( + + + {noRoomToDisplay ? ( + + ) : ( + + + + + openCreateRoom()}> + + + + + + + + Create Room + + + + + + + + openJoinAlias()}> + + + + + + + + Join with Address + + + + + + + + + + + + + + + + Message Search + + + + + + + + + + + Rooms + + +
    + {virtualizer.getVirtualItems().map((vItem) => { + const roomId = sortedRooms[vItem.index]; + const room = mx.getRoom(roomId); + if (!room) return null; + const selected = selectedRoomId === roomId; + + return ( + + + + ); + })} +
    +
    +
    +
    + )} +
    + ); +} diff --git a/src/app/pages/client/home/RoomProvider.tsx b/src/app/pages/client/home/RoomProvider.tsx new file mode 100644 index 00000000..282cee7d --- /dev/null +++ b/src/app/pages/client/home/RoomProvider.tsx @@ -0,0 +1,26 @@ +import React, { ReactNode } from 'react'; +import { useParams } from 'react-router-dom'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { RoomProvider } from '../../../hooks/useRoom'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; +import { useHomeRooms } from './useHomeRooms'; + +export function HomeRouteRoomProvider({ children }: { children: ReactNode }) { + const mx = useMatrixClient(); + const rooms = useHomeRooms(); + + const { roomIdOrAlias } = useParams(); + const roomId = useSelectedRoom(); + const room = mx.getRoom(roomId); + + if (!room || !rooms.includes(room.roomId)) { + return ; + } + + return ( + + {children} + + ); +} diff --git a/src/app/pages/client/home/Search.tsx b/src/app/pages/client/home/Search.tsx new file mode 100644 index 00000000..af7b1eb9 --- /dev/null +++ b/src/app/pages/client/home/Search.tsx @@ -0,0 +1,37 @@ +import React, { useRef } from 'react'; +import { Box, Icon, Icons, Text, Scroll } from 'folds'; +import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; +import { MessageSearch } from '../../../features/message-search'; +import { useHomeRooms } from './useHomeRooms'; + +export function HomeSearch() { + const scrollRef = useRef(null); + const rooms = useHomeRooms(); + + return ( + + + + + + Message Search + + + + + + + + + + + + + + ); +} diff --git a/src/app/pages/client/home/index.ts b/src/app/pages/client/home/index.ts new file mode 100644 index 00000000..80764481 --- /dev/null +++ b/src/app/pages/client/home/index.ts @@ -0,0 +1,3 @@ +export * from './Home'; +export * from './Search'; +export * from './RoomProvider'; diff --git a/src/app/pages/client/home/useHomeRooms.ts b/src/app/pages/client/home/useHomeRooms.ts new file mode 100644 index 00000000..b0181b08 --- /dev/null +++ b/src/app/pages/client/home/useHomeRooms.ts @@ -0,0 +1,14 @@ +import { useAtomValue } from 'jotai'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { useOrphanRooms } from '../../../state/hooks/roomList'; + +export const useHomeRooms = () => { + const mx = useMatrixClient(); + const mDirects = useAtomValue(mDirectAtom); + const roomToParents = useAtomValue(roomToParentsAtom); + const rooms = useOrphanRooms(mx, allRoomsAtom, mDirects, roomToParents); + return rooms; +}; diff --git a/src/app/pages/client/inbox/Inbox.tsx b/src/app/pages/client/inbox/Inbox.tsx new file mode 100644 index 00000000..686296b7 --- /dev/null +++ b/src/app/pages/client/inbox/Inbox.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { Avatar, Box, Icon, Icons, Text } from 'folds'; +import { useAtomValue } from 'jotai'; +import { NavCategory, NavItem, NavItemContent, NavLink } from '../../../components/nav'; +import { getInboxInvitesPath, getInboxNotificationsPath } from '../../pathUtils'; +import { + useInboxInvitesSelected, + useInboxNotificationsSelected, +} from '../../../hooks/router/useInbox'; +import { UnreadBadge } from '../../../components/unread-badge'; +import { allInvitesAtom } from '../../../state/room-list/inviteList'; +import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; +import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; + +function InvitesNavItem() { + const invitesSelected = useInboxInvitesSelected(); + const allInvites = useAtomValue(allInvitesAtom); + const inviteCount = allInvites.length; + + return ( + 0} + aria-selected={invitesSelected} + > + + + + + + + + + Invitations + + + {inviteCount > 0 && } + + + + + ); +} + +export function Inbox() { + useNavToActivePathMapper('inbox'); + const notificationsSelected = useInboxNotificationsSelected(); + + return ( + + + + + + Inbox + + + + + + + + + + + + + + + + + + Notifications + + + + + + + + + + + + ); +} diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx new file mode 100644 index 00000000..91dc0291 --- /dev/null +++ b/src/app/pages/client/inbox/Invites.tsx @@ -0,0 +1,288 @@ +import React, { useCallback, useRef, useState } from 'react'; +import { + Avatar, + Box, + Button, + Icon, + Icons, + Overlay, + OverlayBackdrop, + OverlayCenter, + Scroll, + Spinner, + Text, + color, + config, +} from 'folds'; +import { useAtomValue } from 'jotai'; +import FocusTrap from 'focus-trap-react'; +import { MatrixError, Room } from 'matrix-js-sdk'; +import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; +import { useDirectInvites, useRoomInvites, useSpaceInvites } from '../../../state/hooks/inviteList'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { allInvitesAtom } from '../../../state/room-list/inviteList'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { SequenceCard } from '../../../components/sequence-card'; +import { + getDirectRoomAvatarUrl, + getMemberDisplayName, + getRoomAvatarUrl, + isDirectInvite, +} from '../../../utils/room'; +import { nameInitials } from '../../../utils/common'; +import { RoomAvatar } from '../../../components/room-avatar'; +import { addRoomIdToMDirect, getMxIdLocalPart, guessDmRoomUserId } from '../../../utils/matrix'; +import { Time } from '../../../components/message'; +import { useElementSizeObserver } from '../../../hooks/useElementSizeObserver'; +import { onEnterOrSpace } from '../../../utils/keyboard'; +import { RoomTopicViewer } from '../../../components/room-topic-viewer'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; +import { useRoomTopic } from '../../../hooks/useRoomMeta'; + +const COMPACT_CARD_WIDTH = 548; + +type InviteCardProps = { + room: Room; + userId: string; + direct?: boolean; + compact?: boolean; + onNavigate: (roomId: string) => void; +}; +function InviteCard({ room, userId, direct, compact, onNavigate }: InviteCardProps) { + const mx = useMatrixClient(); + const roomName = room.name || room.getCanonicalAlias() || room.roomId; + const member = room.getMember(userId); + const memberEvent = member?.events.member; + const memberTs = memberEvent?.getTs() ?? 0; + const senderId = memberEvent?.getSender(); + const senderName = senderId + ? getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId + : undefined; + + const topic = useRoomTopic(room); + + const [viewTopic, setViewTopic] = useState(false); + const closeTopic = () => setViewTopic(false); + const openTopic = () => setViewTopic(true); + + const [joinState, join] = useAsyncCallback( + useCallback(async () => { + const dmUserId = isDirectInvite(room, userId) ? guessDmRoomUserId(room, userId) : undefined; + + await mx.joinRoom(room.roomId); + if (dmUserId) { + await addRoomIdToMDirect(mx, room.roomId, dmUserId); + } + onNavigate(room.roomId); + }, [mx, room, userId, onNavigate]) + ); + const [leaveState, leave] = useAsyncCallback, MatrixError, []>( + useCallback(() => mx.leave(room.roomId), [mx, room]) + ); + + const joining = + joinState.status === AsyncStatus.Loading || joinState.status === AsyncStatus.Success; + const leaving = + leaveState.status === AsyncStatus.Loading || leaveState.status === AsyncStatus.Success; + + return ( + + + + + Invited by {senderName} + + + + + + + + ( + + {nameInitials(roomName)} + + )} + /> + + + + + + {roomName} + + {topic && ( + + {topic} + + )} + }> + + + + + + + + {joinState.status === AsyncStatus.Error && ( + + {joinState.error.message} + + )} + {leaveState.status === AsyncStatus.Error && ( + + {leaveState.error.message} + + )} + + + + + + + + + ); +} + +export function Invites() { + const mx = useMatrixClient(); + const userId = mx.getUserId()!; + const mDirects = useAtomValue(mDirectAtom); + const directInvites = useDirectInvites(mx, allInvitesAtom, mDirects); + const spaceInvites = useSpaceInvites(mx, allInvitesAtom); + const roomInvites = useRoomInvites(mx, allInvitesAtom, mDirects); + const containerRef = useRef(null); + const [compact, setCompact] = useState(document.body.clientWidth <= COMPACT_CARD_WIDTH); + useElementSizeObserver( + useCallback(() => containerRef.current, []), + useCallback((width) => setCompact(width <= COMPACT_CARD_WIDTH), []) + ); + + const { navigateRoom, navigateSpace } = useRoomNavigate(); + + const renderInvite = (roomId: string, direct: boolean, handleNavigate: (rId: string) => void) => { + const room = mx.getRoom(roomId); + if (!room) return null; + return ( + + ); + }; + + return ( + + + + + + Invitations + + + + + + + + + {directInvites.length > 0 && ( + + Direct Messages + + {directInvites.map((roomId) => renderInvite(roomId, true, navigateRoom))} + + + )} + {spaceInvites.length > 0 && ( + + Spaces + + {spaceInvites.map((roomId) => renderInvite(roomId, false, navigateSpace))} + + + )} + {roomInvites.length > 0 && ( + + Rooms + + {roomInvites.map((roomId) => renderInvite(roomId, false, navigateRoom))} + + + )} + {directInvites.length === 0 && + spaceInvites.length === 0 && + roomInvites.length === 0 && ( +
    + + No Pending Invitations + + You don't have any new pending invitations to display yet. + + +
    + )} +
    +
    +
    +
    +
    +
    + ); +} diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx new file mode 100644 index 00000000..1ab08f01 --- /dev/null +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -0,0 +1,609 @@ +/* eslint-disable react/destructuring-assignment */ +import React, { MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + Avatar, + Box, + Chip, + Header, + Icon, + IconButton, + Icons, + Scroll, + Text, + config, + toRem, +} from 'folds'; +import { useSearchParams } from 'react-router-dom'; +import { + INotification, + INotificationsResponse, + IRoomEvent, + JoinRule, + Method, + Room, +} from 'matrix-js-sdk'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import { HTMLReactParserOptions } from 'html-react-parser'; +import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { getMxIdLocalPart, isRoomId, isUserId } from '../../../utils/matrix'; +import { InboxNotificationsPathSearchParams } from '../../paths'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { SequenceCard } from '../../../components/sequence-card'; +import { RoomAvatar, RoomIcon } from '../../../components/room-avatar'; +import { getMemberAvatarMxc, getMemberDisplayName, getRoomAvatarUrl } from '../../../utils/room'; +import { ScrollTopContainer } from '../../../components/scroll-top-container'; +import { useInterval } from '../../../hooks/useInterval'; +import { + AvatarBase, + ImageContent, + MSticker, + ModernLayout, + RedactedContent, + Reply, + Time, + Username, +} from '../../../components/message'; +import colorMXID from '../../../../util/colorMXID'; +import { getReactCustomHtmlParser } from '../../../plugins/react-custom-html-parser'; +import { openJoinAlias, openProfileViewer } from '../../../../client/action/navigation'; +import { RenderMessageContent } from '../../../components/RenderMessageContent'; +import { useSetting } from '../../../state/hooks/settings'; +import { settingsAtom } from '../../../state/settings'; +import { Image } from '../../../components/media'; +import { ImageViewer } from '../../../components/image-viewer'; +import { GetContentCallback, MessageEvent, StateEvent } from '../../../../types/matrix/room'; +import { useMatrixEventRenderer } from '../../../hooks/useMatrixEventRenderer'; +import * as customHtmlCss from '../../../styles/CustomHtml.css'; +import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; +import { useRoomUnread } from '../../../state/hooks/unread'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { markAsRead } from '../../../../client/action/notifications'; +import { ContainerColor } from '../../../styles/ContainerColor.css'; +import { VirtualTile } from '../../../components/virtualizer'; +import { UserAvatar } from '../../../components/user-avatar'; + +type RoomNotificationsGroup = { + roomId: string; + notifications: INotification[]; +}; +type NotificationTimeline = { + nextToken?: string; + groups: RoomNotificationsGroup[]; +}; +type LoadTimeline = (from?: string) => Promise; +type SilentReloadTimeline = () => Promise; + +const groupNotifications = (notifications: INotification[]): RoomNotificationsGroup[] => { + const groups: RoomNotificationsGroup[] = []; + notifications.forEach((notification) => { + const groupIndex = groups.length - 1; + const lastAddedGroup: RoomNotificationsGroup | undefined = groups[groupIndex]; + if (lastAddedGroup && notification.room_id === lastAddedGroup.roomId) { + lastAddedGroup.notifications.push(notification); + return; + } + groups.push({ + roomId: notification.room_id, + notifications: [notification], + }); + }); + return groups; +}; + +const useNotificationTimeline = ( + paginationLimit: number, + onlyHighlight?: boolean +): [NotificationTimeline, LoadTimeline, SilentReloadTimeline] => { + const mx = useMatrixClient(); + const [notificationTimeline, setNotificationTimeline] = useState({ + groups: [], + }); + + const fetchNotifications = useCallback( + (from?: string, limit?: number, only?: 'highlight') => { + const queryParams = { from, limit, only }; + return mx.http.authedRequest( + Method.Get, + '/notifications', + queryParams + ); + }, + [mx] + ); + + const loadTimeline: LoadTimeline = useCallback( + async (from) => { + if (!from) { + setNotificationTimeline({ groups: [] }); + } + const data = await fetchNotifications( + from, + paginationLimit, + onlyHighlight ? 'highlight' : undefined + ); + const groups = groupNotifications(data.notifications); + + setNotificationTimeline((currentTimeline) => { + if (currentTimeline.nextToken === from) { + return { + nextToken: data.next_token, + groups: from ? currentTimeline.groups.concat(groups) : groups, + }; + } + return currentTimeline; + }); + }, + [paginationLimit, onlyHighlight, fetchNotifications] + ); + + /** + * Reload timeline silently i.e without setting to default + * before fetching notifications from start + */ + const silentReloadTimeline: SilentReloadTimeline = useCallback(async () => { + const data = await fetchNotifications( + undefined, + paginationLimit, + onlyHighlight ? 'highlight' : undefined + ); + const groups = groupNotifications(data.notifications); + setNotificationTimeline({ + nextToken: data.next_token, + groups, + }); + }, [paginationLimit, onlyHighlight, fetchNotifications]); + + return [notificationTimeline, loadTimeline, silentReloadTimeline]; +}; + +type RoomNotificationsGroupProps = { + room: Room; + notifications: INotification[]; + mediaAutoLoad?: boolean; + urlPreview?: boolean; + onOpen: (roomId: string, eventId: string) => void; +}; +function RoomNotificationsGroupComp({ + room, + notifications, + mediaAutoLoad, + urlPreview, + onOpen, +}: RoomNotificationsGroupProps) { + const mx = useMatrixClient(); + const unread = useRoomUnread(room.roomId, roomToUnreadAtom); + const { navigateRoom, navigateSpace } = useRoomNavigate(); + + const htmlReactParserOptions = useMemo( + () => + getReactCustomHtmlParser(mx, room, { + handleSpoilerClick: (evt) => { + const target = evt.currentTarget; + if (target.getAttribute('aria-pressed') === 'true') { + evt.stopPropagation(); + target.setAttribute('aria-pressed', 'false'); + target.style.cursor = 'initial'; + } + }, + handleMentionClick: (evt) => { + const target = evt.currentTarget; + const mentionId = target.getAttribute('data-mention-id'); + if (typeof mentionId !== 'string') return; + if (isUserId(mentionId)) { + openProfileViewer(mentionId, room.roomId); + return; + } + if (isRoomId(mentionId) && mx.getRoom(mentionId)) { + if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); + else navigateRoom(mentionId); + return; + } + openJoinAlias(mentionId); + }, + }), + [mx, room, navigateRoom, navigateSpace] + ); + + const renderMatrixEvent = useMatrixEventRenderer<[IRoomEvent, string, GetContentCallback]>( + { + [MessageEvent.RoomMessage]: (event, displayName, getContent) => { + if (event.unsigned?.redacted_because) { + return ; + } + + return ( + + ); + }, + [MessageEvent.Sticker]: (event, displayName, getContent) => { + if (event.unsigned?.redacted_because) { + return ; + } + return ( + ( + } + renderViewer={(p) => } + /> + )} + /> + ); + }, + [StateEvent.RoomTombstone]: (event) => { + const { content } = event; + return ( + + + Room Tombstone. {content.body} + + + ); + }, + }, + undefined, + (event) => { + if (event.unsigned?.redacted_because) { + return ; + } + return ( + + + {event.type} + {' event'} + + + ); + } + ); + + const handleOpenClick: MouseEventHandler = (evt) => { + const eventId = evt.currentTarget.getAttribute('data-event-id'); + if (!eventId) return; + onOpen(room.roomId, eventId); + }; + const handleMarkAsRead = () => { + markAsRead(room.roomId); + }; + + return ( + +
    + + + ( + + )} + /> + + + {room.name} + + + + {unread && ( + } + > + Mark as Read + + )} + +
    + + {notifications.map((notification) => { + const { event } = notification; + + const displayName = + getMemberDisplayName(room, event.sender) ?? + getMxIdLocalPart(event.sender) ?? + event.sender; + const senderAvatarMxc = getMemberAvatarMxc(room, event.sender); + const getContent = (() => event.content) as GetContentCallback; + + const replyEventId = event.content['m.relates_to']?.['m.in_reply_to']?.event_id; + + return ( + + + + } + /> + + + } + > + + + + + {displayName} + + + + + + Open + + + + {replyEventId && ( + + )} + {renderMatrixEvent(event.type, false, event, displayName, getContent)} + + + ); + })} + +
    + ); +} + +const useNotificationsSearchParams = ( + searchParams: URLSearchParams +): InboxNotificationsPathSearchParams => + useMemo( + () => ({ + only: searchParams.get('only') ?? undefined, + }), + [searchParams] + ); + +const DEFAULT_REFRESH_MS = 10000; + +export function Notifications() { + const mx = useMatrixClient(); + const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); + const [urlPreview] = useSetting(settingsAtom, 'urlPreview'); + + const { navigateRoom } = useRoomNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const notificationsSearchParams = useNotificationsSearchParams(searchParams); + const scrollRef = useRef(null); + const scrollTopAnchorRef = useRef(null); + const [refreshIntervalTime, setRefreshIntervalTime] = useState(DEFAULT_REFRESH_MS); + + const onlyHighlight = notificationsSearchParams.only === 'highlight'; + const setOnlyHighlighted = (highlight: boolean) => { + if (highlight) { + setSearchParams( + new URLSearchParams({ + only: 'highlight', + }) + ); + return; + } + setSearchParams(); + }; + + const [notificationTimeline, _loadTimeline, silentReloadTimeline] = useNotificationTimeline( + 24, + onlyHighlight + ); + const [timelineState, loadTimeline] = useAsyncCallback(_loadTimeline); + + const virtualizer = useVirtualizer({ + count: notificationTimeline.groups.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 40, + overscan: 4, + }); + const vItems = virtualizer.getVirtualItems(); + + useInterval( + useCallback(() => { + if (document.hasFocus()) { + silentReloadTimeline(); + } + }, [silentReloadTimeline]), + refreshIntervalTime + ); + + const handleScrollTopVisibility = useCallback( + (onTop: boolean) => setRefreshIntervalTime(onTop ? DEFAULT_REFRESH_MS : -1), + [] + ); + + useEffect(() => { + loadTimeline(); + }, [loadTimeline]); + + const lastVItem = vItems[vItems.length - 1]; + const lastVItemIndex: number | undefined = lastVItem?.index; + useEffect(() => { + if ( + timelineState.status === AsyncStatus.Success && + notificationTimeline.groups.length - 1 === lastVItemIndex && + notificationTimeline.nextToken + ) { + loadTimeline(notificationTimeline.nextToken); + } + }, [timelineState, notificationTimeline, lastVItemIndex, loadTimeline]); + + return ( + + + + + + Notification Messages + + + + + + + + + + + + Filter + + setOnlyHighlighted(false)} + variant={!onlyHighlight ? 'Success' : 'Surface'} + aria-pressed={!onlyHighlight} + before={!onlyHighlight && } + outlined + > + All Notifications + + setOnlyHighlighted(true)} + variant={onlyHighlight ? 'Success' : 'Surface'} + aria-pressed={onlyHighlight} + before={onlyHighlight && } + outlined + > + Highlighted + + + + + virtualizer.scrollToOffset(0)} + variant="SurfaceVariant" + radii="Pill" + outlined + size="300" + aria-label="Scroll to Top" + > + + + +
    + {vItems.map((vItem) => { + const group = notificationTimeline.groups[vItem.index]; + if (!group) return null; + const groupRoom = mx.getRoom(group.roomId); + if (!groupRoom) return null; + + return ( + + + + ); + })} +
    + + {timelineState.status === AsyncStatus.Success && + notificationTimeline.groups.length === 0 && ( + + No Notifications + + You don't have any new notifications to display yet. + + + )} + + {timelineState.status === AsyncStatus.Loading && ( + + {[...Array(8).keys()].map((key) => ( + + ))} + + )} + {timelineState.status === AsyncStatus.Error && ( + + {(timelineState.error as Error).name} + {(timelineState.error as Error).message} + + )} +
    +
    +
    +
    +
    +
    + ); +} diff --git a/src/app/pages/client/inbox/index.ts b/src/app/pages/client/inbox/index.ts new file mode 100644 index 00000000..c8036b47 --- /dev/null +++ b/src/app/pages/client/inbox/index.ts @@ -0,0 +1,3 @@ +export * from './Inbox'; +export * from './Notifications'; +export * from './Invites'; diff --git a/src/app/pages/client/index.ts b/src/app/pages/client/index.ts new file mode 100644 index 00000000..5668e81d --- /dev/null +++ b/src/app/pages/client/index.ts @@ -0,0 +1,3 @@ +export * from './ClientRoot'; +export * from './ClientBindAtoms'; +export * from './ClientLayout'; diff --git a/src/app/pages/client/sidebar/DirectTab.tsx b/src/app/pages/client/sidebar/DirectTab.tsx new file mode 100644 index 00000000..f25d7bdc --- /dev/null +++ b/src/app/pages/client/sidebar/DirectTab.tsx @@ -0,0 +1,132 @@ +import React, { MouseEventHandler, forwardRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds'; +import FocusTrap from 'focus-trap-react'; +import { useAtomValue } from 'jotai'; +import { useDirects } from '../../../state/hooks/roomList'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { getDirectPath, joinPathComponent } from '../../pathUtils'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { + SidebarAvatar, + SidebarItem, + SidebarItemBadge, + SidebarItemTooltip, +} from '../../../components/sidebar'; +import { useDirectSelected } from '../../../hooks/router/useDirectSelected'; +import { UnreadBadge } from '../../../components/unread-badge'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; +import { useDirectRooms } from '../direct/useDirectRooms'; +import { markAsRead } from '../../../../client/action/notifications'; + +type DirectMenuProps = { + requestClose: () => void; +}; +const DirectMenu = forwardRef(({ requestClose }, ref) => { + const orphanRooms = useDirectRooms(); + const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + + const handleMarkAsRead = () => { + if (!unread) return; + orphanRooms.forEach((rId) => markAsRead(rId)); + requestClose(); + }; + + return ( + + + } + radii="300" + aria-disabled={!unread} + > + + Mark as Read + + + + + ); +}); + +export function DirectTab() { + const navigate = useNavigate(); + const mx = useMatrixClient(); + const screenSize = useScreenSizeContext(); + const navToActivePath = useAtomValue(useNavToActivePathAtom()); + + const mDirects = useAtomValue(mDirectAtom); + const directs = useDirects(mx, allRoomsAtom, mDirects); + const directUnread = useRoomsUnread(directs, roomToUnreadAtom); + const [menuAnchor, setMenuAnchor] = useState(); + + const directSelected = useDirectSelected(); + + const handleDirectClick = () => { + const activePath = navToActivePath.get('direct'); + if (activePath && screenSize !== ScreenSize.Mobile) { + navigate(joinPathComponent(activePath)); + return; + } + + navigate(getDirectPath()); + }; + + const handleContextMenu: MouseEventHandler = (evt) => { + evt.preventDefault(); + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + return ( + + + {(triggerRef) => ( + + + + )} + + {directUnread && ( + 0}> + 0} count={directUnread.total} /> + + )} + {menuAnchor && ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} /> + + } + /> + )} + + ); +} diff --git a/src/app/pages/client/sidebar/ExploreTab.tsx b/src/app/pages/client/sidebar/ExploreTab.tsx new file mode 100644 index 00000000..a45b5830 --- /dev/null +++ b/src/app/pages/client/sidebar/ExploreTab.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { Icon, Icons } from 'folds'; +import { useNavigate } from 'react-router-dom'; +import { useAtomValue } from 'jotai'; +import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '../../../components/sidebar'; +import { useExploreSelected } from '../../../hooks/router/useExploreSelected'; +import { + getExploreFeaturedPath, + getExplorePath, + getExploreServerPath, + joinPathComponent, +} from '../../pathUtils'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { getMxIdServer } from '../../../utils/matrix'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; + +export function ExploreTab() { + const mx = useMatrixClient(); + const screenSize = useScreenSizeContext(); + const clientConfig = useClientConfig(); + const navigate = useNavigate(); + const navToActivePath = useAtomValue(useNavToActivePathAtom()); + + const exploreSelected = useExploreSelected(); + + const handleExploreClick = () => { + if (screenSize === ScreenSize.Mobile) { + navigate(getExplorePath()); + return; + } + + const activePath = navToActivePath.get('explore'); + if (activePath) { + navigate(joinPathComponent(activePath)); + return; + } + + if (clientConfig.featuredCommunities?.openAsDefault) { + navigate(getExploreFeaturedPath()); + return; + } + const userId = mx.getUserId(); + const userServer = userId ? getMxIdServer(userId) : undefined; + if (userServer) { + navigate(getExploreServerPath(userServer)); + return; + } + navigate(getExplorePath()); + }; + + return ( + + + {(triggerRef) => ( + + + + )} + + + ); +} diff --git a/src/app/pages/client/sidebar/HomeTab.tsx b/src/app/pages/client/sidebar/HomeTab.tsx new file mode 100644 index 00000000..0b5135ca --- /dev/null +++ b/src/app/pages/client/sidebar/HomeTab.tsx @@ -0,0 +1,134 @@ +import React, { MouseEventHandler, forwardRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds'; +import { useAtomValue } from 'jotai'; +import FocusTrap from 'focus-trap-react'; +import { useOrphanRooms } from '../../../state/hooks/roomList'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { getHomePath, joinPathComponent } from '../../pathUtils'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { + SidebarAvatar, + SidebarItem, + SidebarItemBadge, + SidebarItemTooltip, +} from '../../../components/sidebar'; +import { useHomeSelected } from '../../../hooks/router/useHomeSelected'; +import { UnreadBadge } from '../../../components/unread-badge'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; +import { useHomeRooms } from '../home/useHomeRooms'; +import { markAsRead } from '../../../../client/action/notifications'; + +type HomeMenuProps = { + requestClose: () => void; +}; +const HomeMenu = forwardRef(({ requestClose }, ref) => { + const orphanRooms = useHomeRooms(); + const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + + const handleMarkAsRead = () => { + if (!unread) return; + orphanRooms.forEach((rId) => markAsRead(rId)); + requestClose(); + }; + + return ( + + + } + radii="300" + aria-disabled={!unread} + > + + Mark as Read + + + + + ); +}); + +export function HomeTab() { + const navigate = useNavigate(); + const mx = useMatrixClient(); + const screenSize = useScreenSizeContext(); + const navToActivePath = useAtomValue(useNavToActivePathAtom()); + + const mDirects = useAtomValue(mDirectAtom); + const roomToParents = useAtomValue(roomToParentsAtom); + const orphanRooms = useOrphanRooms(mx, allRoomsAtom, mDirects, roomToParents); + const homeUnread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + const homeSelected = useHomeSelected(); + const [menuAnchor, setMenuAnchor] = useState(); + + const handleHomeClick = () => { + const activePath = navToActivePath.get('home'); + if (activePath && screenSize !== ScreenSize.Mobile) { + navigate(joinPathComponent(activePath)); + return; + } + + navigate(getHomePath()); + }; + + const handleContextMenu: MouseEventHandler = (evt) => { + evt.preventDefault(); + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + + + {(triggerRef) => ( + + + + )} + + {homeUnread && ( + 0}> + 0} count={homeUnread.total} /> + + )} + {menuAnchor && ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} /> + + } + /> + )} + + ); +} diff --git a/src/app/pages/client/sidebar/InboxTab.tsx b/src/app/pages/client/sidebar/InboxTab.tsx new file mode 100644 index 00000000..5d13a9ab --- /dev/null +++ b/src/app/pages/client/sidebar/InboxTab.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Icon, Icons } from 'folds'; +import { useAtomValue } from 'jotai'; +import { + SidebarAvatar, + SidebarItem, + SidebarItemBadge, + SidebarItemTooltip, +} from '../../../components/sidebar'; +import { allInvitesAtom } from '../../../state/room-list/inviteList'; +import { + getInboxInvitesPath, + getInboxNotificationsPath, + getInboxPath, + joinPathComponent, +} from '../../pathUtils'; +import { useInboxSelected } from '../../../hooks/router/useInbox'; +import { UnreadBadge } from '../../../components/unread-badge'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; + +export function InboxTab() { + const screenSize = useScreenSizeContext(); + const navigate = useNavigate(); + const navToActivePath = useAtomValue(useNavToActivePathAtom()); + const inboxSelected = useInboxSelected(); + const allInvites = useAtomValue(allInvitesAtom); + const inviteCount = allInvites.length; + + const handleInboxClick = () => { + if (screenSize === ScreenSize.Mobile) { + navigate(getInboxPath()); + return; + } + const activePath = navToActivePath.get('inbox'); + if (activePath) { + navigate(joinPathComponent(activePath)); + return; + } + + const path = inviteCount > 0 ? getInboxInvitesPath() : getInboxNotificationsPath(); + navigate(path); + }; + + return ( + + + {(triggerRef) => ( + + + + )} + + {inviteCount > 0 && ( + + + + )} + + ); +} diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx new file mode 100644 index 00000000..99c04965 --- /dev/null +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -0,0 +1,844 @@ +import React, { + MouseEventHandler, + ReactNode, + RefObject, + forwardRef, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { useNavigate } from 'react-router-dom'; +import { + Box, + Icon, + IconButton, + Icons, + Line, + Menu, + MenuItem, + PopOut, + RectCords, + Text, + config, + toRem, +} from 'folds'; +import { useAtom, useAtomValue } from 'jotai'; +import { Room } from 'matrix-js-sdk'; +import { + draggable, + dropTargetForElements, + monitorForElements, +} from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; +import { + attachInstruction, + extractInstruction, + Instruction, +} from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item'; +import { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element'; +import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'; +import FocusTrap from 'focus-trap-react'; +import { + useOrphanSpaces, + useRecursiveChildScopeFactory, + useSpaceChildren, +} from '../../../state/hooks/roomList'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { + getOriginBaseUrl, + getSpaceLobbyPath, + getSpacePath, + joinPathComponent, + withOriginBaseUrl, +} from '../../pathUtils'; +import { + SidebarAvatar, + SidebarItem, + SidebarItemBadge, + SidebarItemTooltip, + SidebarStack, + SidebarStackSeparator, + SidebarFolder, + SidebarFolderDropTarget, +} from '../../../components/sidebar'; +import { RoomUnreadProvider, RoomsUnreadProvider } from '../../../components/RoomUnreadProvider'; +import { useSelectedSpace } from '../../../hooks/router/useSelectedSpace'; +import { UnreadBadge } from '../../../components/unread-badge'; +import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { RoomAvatar } from '../../../components/room-avatar'; +import { nameInitials, randomStr } from '../../../utils/common'; +import { + ISidebarFolder, + SidebarItems, + TSidebarItem, + makeCinnySpacesContent, + parseSidebar, + sidebarItemWithout, + useSidebarItems, +} from '../../../hooks/useSidebarItems'; +import { AccountDataEvent } from '../../../../types/matrix/accountData'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; +import { useOpenedSidebarFolderAtom } from '../../../state/hooks/openedSidebarFolder'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { usePowerLevels, usePowerLevelsAPI } from '../../../hooks/usePowerLevels'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { markAsRead } from '../../../../client/action/notifications'; +import { copyToClipboard } from '../../../utils/dom'; +import { openInviteUser, openSpaceSettings } from '../../../../client/action/navigation'; + +type SpaceMenuProps = { + room: Room; + requestClose: () => void; + onUnpin?: (roomId: string) => void; +}; +const SpaceMenu = forwardRef( + ({ room, requestClose, onUnpin }, ref) => { + const mx = useMatrixClient(); + const { hashRouter } = useClientConfig(); + const roomToParents = useAtomValue(roomToParentsAtom); + const powerLevels = usePowerLevels(room); + const { getPowerLevel, canDoAction } = usePowerLevelsAPI(powerLevels); + const canInvite = canDoAction('invite', getPowerLevel(mx.getUserId() ?? '')); + + const allChild = useSpaceChildren( + allRoomsAtom, + room.roomId, + useRecursiveChildScopeFactory(mx, roomToParents) + ); + const unread = useRoomsUnread(allChild, roomToUnreadAtom); + + const handleMarkAsRead = () => { + allChild.forEach((childRoomId) => markAsRead(childRoomId)); + requestClose(); + }; + + const handleUnpin = () => { + onUnpin?.(room.roomId); + requestClose(); + }; + + const handleCopyLink = () => { + const spacePath = getSpacePath(getCanonicalAliasOrRoomId(mx, room.roomId)); + copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), spacePath)); + requestClose(); + }; + + const handleInvite = () => { + openInviteUser(room.roomId); + requestClose(); + }; + + const handleRoomSettings = () => { + openSpaceSettings(room.roomId); + requestClose(); + }; + + return ( + + + } + radii="300" + disabled={!unread} + > + + Mark as Read + + + {onUnpin && ( + } + > + + Unpin + + + )} + + + + } + radii="300" + disabled={!canInvite} + > + + Invite + + + } + radii="300" + > + + Copy Link + + + } + radii="300" + > + + Space Settings + + + + + ); + } +); + +type InstructionType = Instruction['type']; +type FolderDraggable = { + folder: ISidebarFolder; + spaceId?: string; + open?: boolean; +}; +type SidebarDraggable = string | FolderDraggable; + +const useDraggableItem = ( + item: SidebarDraggable, + targetRef: RefObject, + onDragging: (item?: SidebarDraggable) => void, + dragHandleRef?: RefObject +): boolean => { + const [dragging, setDragging] = useState(false); + + useEffect(() => { + const target = targetRef.current; + const dragHandle = dragHandleRef?.current ?? undefined; + + return !target + ? undefined + : draggable({ + element: target, + dragHandle, + getInitialData: () => ({ item }), + onDragStart: () => { + setDragging(true); + onDragging?.(item); + }, + onDrop: () => { + setDragging(false); + onDragging?.(undefined); + }, + }); + }, [targetRef, dragHandleRef, item, onDragging]); + + return dragging; +}; + +const useDropTarget = ( + item: SidebarDraggable, + targetRef: RefObject +): Instruction | undefined => { + const [dropState, setDropState] = useState(); + + useEffect(() => { + const target = targetRef.current; + if (!target) return undefined; + + return dropTargetForElements({ + element: target, + canDrop: ({ source }) => { + const dragItem = source.data.item as SidebarDraggable; + return dragItem !== item; + }, + getData: ({ input, element }) => { + const block: Instruction['type'][] = ['reparent']; + if (typeof item === 'object' && item.spaceId) block.push('make-child'); + + const insData = attachInstruction( + {}, + { + input, + element, + currentLevel: 0, + indentPerLevel: 0, + mode: 'standard', + block, + } + ); + + const instruction: Instruction | null = extractInstruction(insData); + setDropState(instruction ?? undefined); + + return { + item, + instructionType: instruction ? instruction.type : undefined, + }; + }, + onDragLeave: () => setDropState(undefined), + onDrop: () => setDropState(undefined), + }); + }, [item, targetRef]); + + return dropState; +}; + +function useDropTargetInstruction( + item: SidebarDraggable, + targetRef: RefObject, + instructionType: T +): T | undefined { + const [dropState, setDropState] = useState(); + + useEffect(() => { + const target = targetRef.current; + if (!target) return undefined; + + return dropTargetForElements({ + element: target, + canDrop: ({ source }) => { + const dragItem = source.data.item as SidebarDraggable; + return dragItem !== item; + }, + getData: () => { + setDropState(instructionType); + + return { + item, + instructionType, + }; + }, + onDragLeave: () => setDropState(undefined), + onDrop: () => setDropState(undefined), + }); + }, [item, targetRef, instructionType]); + + return dropState; +} + +const useDnDMonitor = ( + scrollRef: RefObject, + onDragging: (dragItem?: SidebarDraggable) => void, + onReorder: ( + draggable: SidebarDraggable, + container: SidebarDraggable, + instruction: InstructionType + ) => void +) => { + useEffect(() => { + const scrollElement = scrollRef.current; + if (!scrollElement) { + throw Error('Scroll element ref not configured'); + } + + return combine( + monitorForElements({ + onDrop: ({ source, location }) => { + onDragging(undefined); + const { dropTargets } = location.current; + if (dropTargets.length === 0) return; + const item = source.data.item as SidebarDraggable; + const containerItem = dropTargets[0].data.item as SidebarDraggable; + const instructionType = dropTargets[0].data.instructionType as + | InstructionType + | undefined; + if (!instructionType) return; + onReorder(item, containerItem, instructionType); + }, + }), + autoScrollForElements({ + element: scrollElement, + }) + ); + }, [scrollRef, onDragging, onReorder]); +}; + +type SpaceTabProps = { + space: Room; + selected: boolean; + onClick: MouseEventHandler; + folder?: ISidebarFolder; + onDragging: (dragItem?: SidebarDraggable) => void; + disabled?: boolean; + onUnpin?: (roomId: string) => void; +}; +function SpaceTab({ + space, + selected, + onClick, + folder, + onDragging, + disabled, + onUnpin, +}: SpaceTabProps) { + const mx = useMatrixClient(); + const targetRef = useRef(null); + + const spaceDraggable: SidebarDraggable = useMemo( + () => + folder + ? { + folder, + spaceId: space.roomId, + } + : space.roomId, + [folder, space] + ); + + useDraggableItem(spaceDraggable, targetRef, onDragging); + const dropState = useDropTarget(spaceDraggable, targetRef); + const dropType = dropState?.type; + + const [menuAnchor, setMenuAnchor] = useState(); + + const handleContextMenu: MouseEventHandler = (evt) => { + evt.preventDefault(); + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + + {(unread) => ( + + + {(triggerRef) => ( + + ( + {nameInitials(space.name, 2)} + )} + /> + + )} + + {unread && ( + 0}> + 0} count={unread.total} /> + + )} + {menuAnchor && ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} + onUnpin={onUnpin} + /> + + } + /> + )} + + )} + + ); +} + +type OpenedSpaceFolderProps = { + folder: ISidebarFolder; + onClose: MouseEventHandler; + children?: ReactNode; +}; +function OpenedSpaceFolder({ folder, onClose, children }: OpenedSpaceFolderProps) { + const aboveTargetRef = useRef(null); + const belowTargetRef = useRef(null); + + const spaceDraggable: SidebarDraggable = useMemo(() => ({ folder, open: true }), [folder]); + + const orderAbove = useDropTargetInstruction(spaceDraggable, aboveTargetRef, 'reorder-above'); + const orderBelow = useDropTargetInstruction(spaceDraggable, belowTargetRef, 'reorder-below'); + + return ( + + + + + + + + {children} + + + ); +} + +type ClosedSpaceFolderProps = { + folder: ISidebarFolder; + selected: boolean; + onOpen: MouseEventHandler; + onDragging: (dragItem?: SidebarDraggable) => void; + disabled?: boolean; +}; +function ClosedSpaceFolder({ + folder, + selected, + onOpen, + onDragging, + disabled, +}: ClosedSpaceFolderProps) { + const mx = useMatrixClient(); + const handlerRef = useRef(null); + + const spaceDraggable: FolderDraggable = useMemo(() => ({ folder }), [folder]); + useDraggableItem(spaceDraggable, handlerRef, onDragging); + const dropState = useDropTarget(spaceDraggable, handlerRef); + const dropType = dropState?.type; + + const tooltipName = + folder.name ?? folder.content.map((i) => mx.getRoom(i)?.name ?? '').join(', ') ?? 'Unnamed'; + + return ( + + {(unread) => ( + + + {(tooltipRef) => ( + + {folder.content.map((sId) => { + const space = mx.getRoom(sId); + if (!space) return null; + + return ( + + ( + + {nameInitials(space.name, 2)} + + )} + /> + + ); + })} + + )} + + {unread && ( + 0}> + 0} count={unread.total} /> + + )} + + )} + + ); +} + +type SpaceTabsProps = { + scrollRef: RefObject; +}; +export function SpaceTabs({ scrollRef }: SpaceTabsProps) { + const navigate = useNavigate(); + const mx = useMatrixClient(); + const screenSize = useScreenSizeContext(); + const roomToParents = useAtomValue(roomToParentsAtom); + const orphanSpaces = useOrphanSpaces(mx, allRoomsAtom, roomToParents); + const [sidebarItems, localEchoSidebarItem] = useSidebarItems(orphanSpaces); + const navToActivePath = useAtomValue(useNavToActivePathAtom()); + const [openedFolder, setOpenedFolder] = useAtom(useOpenedSidebarFolderAtom()); + const [draggingItem, setDraggingItem] = useState(); + + useDnDMonitor( + scrollRef, + setDraggingItem, + useCallback( + (item, containerItem, instructionType) => { + const newItems: SidebarItems = []; + + const matchDest = (sI: TSidebarItem, dI: SidebarDraggable): boolean => { + if (typeof sI === 'string' && typeof dI === 'string') { + return sI === dI; + } + if (typeof sI === 'object' && typeof dI === 'object') { + return sI.id === dI.folder.id; + } + return false; + }; + const itemAsFolderContent = (i: SidebarDraggable): string[] => { + if (typeof i === 'string') { + return [i]; + } + if (i.spaceId) { + return [i.spaceId]; + } + return [...i.folder.content]; + }; + + sidebarItems.forEach((i) => { + const sameFolders = + typeof item === 'object' && + typeof containerItem === 'object' && + item.folder.id === containerItem.folder.id; + + // remove draggable space from current position or folder + if (!sameFolders && matchDest(i, item)) { + if (typeof item === 'object' && item.spaceId) { + const folderContent = item.folder.content.filter((s) => s !== item.spaceId); + if (folderContent.length === 0) { + // remove open state from local storage + setOpenedFolder({ type: 'DELETE', id: item.folder.id }); + return; + } + newItems.push({ + ...item.folder, + content: folderContent, + }); + } + return; + } + if (matchDest(i, containerItem)) { + // we can make child only if + // container item is space or closed folder + if (instructionType === 'make-child') { + const child: string[] = itemAsFolderContent(item); + if (typeof containerItem === 'string') { + const folder: ISidebarFolder = { + id: randomStr(), + content: [containerItem].concat(child), + }; + newItems.push(folder); + return; + } + newItems.push({ + ...containerItem.folder, + content: containerItem.folder.content.concat(child), + }); + return; + } + + // drop inside opened folder + // or reordering inside same folder + if (typeof containerItem === 'object' && containerItem.spaceId) { + const child = itemAsFolderContent(item); + const newContent: string[] = []; + containerItem.folder.content + .filter((sId) => !child.includes(sId)) + .forEach((sId) => { + if (sId === containerItem.spaceId) { + if (instructionType === 'reorder-below') { + newContent.push(sId, ...child); + } + if (instructionType === 'reorder-above') { + newContent.push(...child, sId); + } + return; + } + newContent.push(sId); + }); + const folder = { + ...containerItem.folder, + content: newContent, + }; + + newItems.push(folder); + return; + } + + // drop above or below space or closed/opened folder + if (typeof item === 'string') { + if (instructionType === 'reorder-below') newItems.push(i); + newItems.push(item); + if (instructionType === 'reorder-above') newItems.push(i); + } else if (item.spaceId) { + if (instructionType === 'reorder-above') { + newItems.push(item.spaceId); + } + if (sameFolders && typeof i === 'object') { + // remove from folder if placing around itself + const newI = { ...i, content: i.content.filter((sId) => sId !== item.spaceId) }; + if (newI.content.length > 0) newItems.push(newI); + } else { + newItems.push(i); + } + if (instructionType === 'reorder-below') { + newItems.push(item.spaceId); + } + } else { + if (instructionType === 'reorder-below') newItems.push(i); + newItems.push(item.folder); + if (instructionType === 'reorder-above') newItems.push(i); + } + return; + } + newItems.push(i); + }); + + const newSpacesContent = makeCinnySpacesContent(mx, newItems); + localEchoSidebarItem(parseSidebar(mx, orphanSpaces, newSpacesContent)); + mx.setAccountData(AccountDataEvent.CinnySpaces, newSpacesContent); + }, + [mx, sidebarItems, setOpenedFolder, localEchoSidebarItem, orphanSpaces] + ) + ); + + const selectedSpaceId = useSelectedSpace(); + + const handleSpaceClick: MouseEventHandler = (evt) => { + const target = evt.currentTarget; + const targetSpaceId = target.getAttribute('data-id'); + if (!targetSpaceId) return; + + if (screenSize === ScreenSize.Mobile) { + navigate(getSpacePath(getCanonicalAliasOrRoomId(mx, targetSpaceId))); + return; + } + + const activePath = navToActivePath.get(targetSpaceId); + if (activePath) { + navigate(joinPathComponent(activePath)); + return; + } + + navigate(getSpaceLobbyPath(getCanonicalAliasOrRoomId(mx, targetSpaceId))); + }; + + const handleFolderToggle: MouseEventHandler = (evt) => { + const target = evt.currentTarget; + const targetFolderId = target.getAttribute('data-id'); + if (!targetFolderId) return; + + setOpenedFolder({ + type: openedFolder.has(targetFolderId) ? 'DELETE' : 'PUT', + id: targetFolderId, + }); + }; + + const handleUnpin = useCallback( + (roomId: string) => { + if (orphanSpaces.includes(roomId)) return; + const newItems = sidebarItemWithout(sidebarItems, roomId); + + const newSpacesContent = makeCinnySpacesContent(mx, newItems); + localEchoSidebarItem(parseSidebar(mx, orphanSpaces, newSpacesContent)); + mx.setAccountData(AccountDataEvent.CinnySpaces, newSpacesContent); + }, + [mx, sidebarItems, orphanSpaces, localEchoSidebarItem] + ); + + if (sidebarItems.length === 0) return null; + return ( + <> + + + {sidebarItems.map((item) => { + if (typeof item === 'object') { + if (openedFolder.has(item.id)) { + return ( + + {item.content.map((sId) => { + const space = mx.getRoom(sId); + if (!space) return null; + return ( + + ); + })} + + ); + } + + return ( + + ); + } + + const space = mx.getRoom(item); + if (!space) return null; + + return ( + + ); + })} + + + ); +} diff --git a/src/app/pages/client/sidebar/UserTab.tsx b/src/app/pages/client/sidebar/UserTab.tsx new file mode 100644 index 00000000..89c035bb --- /dev/null +++ b/src/app/pages/client/sidebar/UserTab.tsx @@ -0,0 +1,63 @@ +import React, { useEffect, useState } from 'react'; +import { Text } from 'folds'; +import { UserEvent, UserEventHandlerMap } from 'matrix-js-sdk'; +import { SidebarItem, SidebarItemTooltip, SidebarAvatar } from '../../../components/sidebar'; +import { openSettings } from '../../../../client/action/navigation'; +import { UserAvatar } from '../../../components/user-avatar'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { getMxIdLocalPart } from '../../../utils/matrix'; +import { nameInitials } from '../../../utils/common'; + +type UserProfile = { + avatar_url?: string; + displayname?: string; +}; +export function UserTab() { + const mx = useMatrixClient(); + const userId = mx.getUserId()!; + + const [profile, setProfile] = useState({}); + const displayName = profile.displayname ?? getMxIdLocalPart(userId) ?? userId; + const avatarUrl = profile.avatar_url + ? mx.mxcUrlToHttp(profile.avatar_url, 96, 96, 'crop') ?? undefined + : undefined; + + useEffect(() => { + const user = mx.getUser(userId); + const onAvatarChange: UserEventHandlerMap[UserEvent.AvatarUrl] = (event, myUser) => { + setProfile((cp) => ({ + ...cp, + avatar_url: myUser.avatarUrl, + })); + }; + const onDisplayNameChange: UserEventHandlerMap[UserEvent.DisplayName] = (event, myUser) => { + setProfile((cp) => ({ + ...cp, + avatar_url: myUser.displayName, + })); + }; + mx.getProfileInfo(userId).then((info) => setProfile(() => ({ ...info }))); + user?.on(UserEvent.AvatarUrl, onAvatarChange); + user?.on(UserEvent.DisplayName, onDisplayNameChange); + return () => { + user?.removeListener(UserEvent.AvatarUrl, onAvatarChange); + user?.removeListener(UserEvent.DisplayName, onDisplayNameChange); + }; + }, [mx, userId]); + + return ( + + + {(triggerRef) => ( + openSettings()}> + {nameInitials(displayName)}} + /> + + )} + + + ); +} diff --git a/src/app/pages/client/sidebar/index.ts b/src/app/pages/client/sidebar/index.ts new file mode 100644 index 00000000..63c5d4bb --- /dev/null +++ b/src/app/pages/client/sidebar/index.ts @@ -0,0 +1,6 @@ +export * from './HomeTab'; +export * from './DirectTab'; +export * from './SpaceTabs'; +export * from './InboxTab'; +export * from './ExploreTab'; +export * from './UserTab'; diff --git a/src/app/pages/client/space/RoomProvider.tsx b/src/app/pages/client/space/RoomProvider.tsx new file mode 100644 index 00000000..1105e220 --- /dev/null +++ b/src/app/pages/client/space/RoomProvider.tsx @@ -0,0 +1,37 @@ +import React, { ReactNode } from 'react'; +import { useParams } from 'react-router-dom'; +import { useAtomValue } from 'jotai'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { RoomProvider } from '../../../hooks/useRoom'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; +import { useSpace } from '../../../hooks/useSpace'; +import { getAllParents } from '../../../utils/room'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; + +export function SpaceRouteRoomProvider({ children }: { children: ReactNode }) { + const mx = useMatrixClient(); + const space = useSpace(); + const roomToParents = useAtomValue(roomToParentsAtom); + const allRooms = useAtomValue(allRoomsAtom); + + const { roomIdOrAlias } = useParams(); + const roomId = useSelectedRoom(); + const room = mx.getRoom(roomId); + + if ( + !room || + room.isSpaceRoom() || + !allRooms.includes(room.roomId) || + !getAllParents(roomToParents, room.roomId).has(space.roomId) + ) { + return ; + } + + return ( + + {children} + + ); +} diff --git a/src/app/pages/client/space/Search.tsx b/src/app/pages/client/space/Search.tsx new file mode 100644 index 00000000..6e7ac57d --- /dev/null +++ b/src/app/pages/client/space/Search.tsx @@ -0,0 +1,52 @@ +import React, { useRef } from 'react'; +import { Box, Icon, Icons, Text, Scroll } from 'folds'; +import { useAtomValue } from 'jotai'; +import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; +import { MessageSearch } from '../../../features/message-search'; +import { useSpace } from '../../../hooks/useSpace'; +import { useRecursiveChildRoomScopeFactory, useSpaceChildren } from '../../../state/hooks/roomList'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; + +export function SpaceSearch() { + const mx = useMatrixClient(); + const scrollRef = useRef(null); + const space = useSpace(); + + const mDirects = useAtomValue(mDirectAtom); + const roomToParents = useAtomValue(roomToParentsAtom); + const rooms = useSpaceChildren( + allRoomsAtom, + space.roomId, + useRecursiveChildRoomScopeFactory(mx, mDirects, roomToParents) + ); + + return ( + + + + + + Message Search + + + + + + + + + + + + + + ); +} diff --git a/src/app/pages/client/space/Space.tsx b/src/app/pages/client/space/Space.tsx new file mode 100644 index 00000000..8eab6b49 --- /dev/null +++ b/src/app/pages/client/space/Space.tsx @@ -0,0 +1,417 @@ +import React, { + MouseEventHandler, + forwardRef, + useCallback, + useMemo, + useRef, + useState, +} from 'react'; +import { useAtom, useAtomValue } from 'jotai'; +import { + Avatar, + Box, + Icon, + IconButton, + Icons, + Line, + Menu, + MenuItem, + PopOut, + RectCords, + Text, + config, + toRem, +} from 'folds'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import { IJoinRuleEventContent, JoinRule, Room } from 'matrix-js-sdk'; +import FocusTrap from 'focus-trap-react'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { mDirectAtom } from '../../../state/mDirectList'; +import { + NavCategory, + NavCategoryHeader, + NavItem, + NavItemContent, + NavLink, +} from '../../../components/nav'; +import { + getOriginBaseUrl, + getSpaceLobbyPath, + getSpacePath, + getSpaceRoomPath, + getSpaceSearchPath, + withOriginBaseUrl, +} from '../../pathUtils'; +import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; +import { + useSpaceLobbySelected, + useSpaceSearchSelected, +} from '../../../hooks/router/useSelectedSpace'; +import { useSpace } from '../../../hooks/useSpace'; +import { VirtualTile } from '../../../components/virtualizer'; +import { RoomNavCategoryButton, RoomNavItem } from '../../../features/room-nav'; +import { muteChangesAtom } from '../../../state/room-list/mutedRoomList'; +import { makeNavCategoryId } from '../../../state/closedNavCategories'; +import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; +import { useCategoryHandler } from '../../../hooks/useCategoryHandler'; +import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; +import { useRoomName } from '../../../hooks/useRoomMeta'; +import { useSpaceJoinedHierarchy } from '../../../hooks/useSpaceHierarchy'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; +import { usePowerLevels, usePowerLevelsAPI } from '../../../hooks/usePowerLevels'; +import { openInviteUser, openSpaceSettings } from '../../../../client/action/navigation'; +import { useRecursiveChildScopeFactory, useSpaceChildren } from '../../../state/hooks/roomList'; +import { roomToParentsAtom } from '../../../state/room/roomToParents'; +import { markAsRead } from '../../../../client/action/notifications'; +import { useRoomsUnread } from '../../../state/hooks/unread'; +import { UseStateProvider } from '../../../components/UseStateProvider'; +import { LeaveSpacePrompt } from '../../../components/leave-space-prompt'; +import { copyToClipboard } from '../../../utils/dom'; +import { useClientConfig } from '../../../hooks/useClientConfig'; +import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; +import { useStateEvent } from '../../../hooks/useStateEvent'; +import { StateEvent } from '../../../../types/matrix/room'; + +type SpaceMenuProps = { + room: Room; + requestClose: () => void; +}; +const SpaceMenu = forwardRef(({ room, requestClose }, ref) => { + const mx = useMatrixClient(); + const { hashRouter } = useClientConfig(); + const roomToParents = useAtomValue(roomToParentsAtom); + const powerLevels = usePowerLevels(room); + const { getPowerLevel, canDoAction } = usePowerLevelsAPI(powerLevels); + const canInvite = canDoAction('invite', getPowerLevel(mx.getUserId() ?? '')); + + const allChild = useSpaceChildren( + allRoomsAtom, + room.roomId, + useRecursiveChildScopeFactory(mx, roomToParents) + ); + const unread = useRoomsUnread(allChild, roomToUnreadAtom); + + const handleMarkAsRead = () => { + allChild.forEach((childRoomId) => markAsRead(childRoomId)); + requestClose(); + }; + + const handleCopyLink = () => { + const spacePath = getSpacePath(getCanonicalAliasOrRoomId(mx, room.roomId)); + copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), spacePath)); + requestClose(); + }; + + const handleInvite = () => { + openInviteUser(room.roomId); + requestClose(); + }; + + const handleRoomSettings = () => { + openSpaceSettings(room.roomId); + requestClose(); + }; + + return ( + + + } + radii="300" + disabled={!unread} + > + + Mark as Read + + + + + + } + radii="300" + disabled={!canInvite} + > + + Invite + + + } + radii="300" + > + + Copy Link + + + } + radii="300" + > + + Space Settings + + + + + + + {(promptLeave, setPromptLeave) => ( + <> + setPromptLeave(true)} + variant="Critical" + fill="None" + size="300" + after={} + radii="300" + aria-pressed={promptLeave} + > + + Leave Space + + + {promptLeave && ( + setPromptLeave(false)} + /> + )} + + )} + + + + ); +}); + +function SpaceHeader() { + const space = useSpace(); + const spaceName = useRoomName(space); + const [menuAnchor, setMenuAnchor] = useState(); + + const joinRules = useStateEvent( + space, + StateEvent.RoomJoinRules + )?.getContent(); + + const handleOpenMenu: MouseEventHandler = (evt) => { + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + <> + + + + + {spaceName} + + {joinRules?.join_rule !== JoinRule.Public && } + + + + + + + + + {menuAnchor && ( + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + }} + > + setMenuAnchor(undefined)} /> + + } + /> + )} + + ); +} + +export function Space() { + const mx = useMatrixClient(); + const space = useSpace(); + useNavToActivePathMapper(space.roomId); + const spaceIdOrAlias = getCanonicalAliasOrRoomId(mx, space.roomId); + const scrollRef = useRef(null); + const mDirects = useAtomValue(mDirectAtom); + const roomToUnread = useAtomValue(roomToUnreadAtom); + const allRooms = useAtomValue(allRoomsAtom); + const allJoinedRooms = useMemo(() => new Set(allRooms), [allRooms]); + const muteChanges = useAtomValue(muteChangesAtom); + const mutedRooms = muteChanges.added; + + const selectedRoomId = useSelectedRoom(); + const lobbySelected = useSpaceLobbySelected(spaceIdOrAlias); + const searchSelected = useSpaceSearchSelected(spaceIdOrAlias); + + const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom()); + + const getRoom = useCallback( + (rId: string) => { + if (allJoinedRooms.has(rId)) { + return mx.getRoom(rId) ?? undefined; + } + return undefined; + }, + [mx, allJoinedRooms] + ); + + const hierarchy = useSpaceJoinedHierarchy( + space.roomId, + getRoom, + useCallback( + (parentId, roomId) => { + if (!closedCategories.has(makeNavCategoryId(space.roomId, parentId))) { + return false; + } + const showRoom = roomToUnread.has(roomId) || roomId === selectedRoomId; + if (showRoom) return false; + return true; + }, + [space.roomId, closedCategories, roomToUnread, selectedRoomId] + ), + useCallback( + (sId) => closedCategories.has(makeNavCategoryId(space.roomId, sId)), + [closedCategories, space.roomId] + ) + ); + + const virtualizer = useVirtualizer({ + count: hierarchy.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 0, + overscan: 10, + }); + + const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) => + closedCategories.has(categoryId) + ); + + const getToLink = (roomId: string) => + getSpaceRoomPath(spaceIdOrAlias, getCanonicalAliasOrRoomId(mx, roomId)); + + return ( + + + + + + + + + + + + + + + Lobby + + + + + + + + + + + + + + + + Message Search + + + + + + + + + {virtualizer.getVirtualItems().map((vItem) => { + const { roomId } = hierarchy[vItem.index] ?? {}; + const room = mx.getRoom(roomId); + if (!room) return null; + + if (room.isSpaceRoom()) { + const categoryId = makeNavCategoryId(space.roomId, roomId); + + return ( + +
    + + + {roomId === space.roomId ? 'Rooms' : room?.name} + + +
    +
    + ); + } + + return ( + + + + ); + })} +
    +
    +
    +
    + ); +} diff --git a/src/app/pages/client/space/SpaceProvider.tsx b/src/app/pages/client/space/SpaceProvider.tsx new file mode 100644 index 00000000..530fc3cc --- /dev/null +++ b/src/app/pages/client/space/SpaceProvider.tsx @@ -0,0 +1,30 @@ +import React, { ReactNode } from 'react'; +import { useParams } from 'react-router-dom'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { useSpaces } from '../../../state/hooks/roomList'; +import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { useSelectedSpace } from '../../../hooks/router/useSelectedSpace'; +import { SpaceProvider } from '../../../hooks/useSpace'; +import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; + +type RouteSpaceProviderProps = { + children: ReactNode; +}; +export function RouteSpaceProvider({ children }: RouteSpaceProviderProps) { + const mx = useMatrixClient(); + const joinedSpaces = useSpaces(mx, allRoomsAtom); + const { spaceIdOrAlias } = useParams(); + + const selectedSpaceId = useSelectedSpace(); + const space = mx.getRoom(selectedSpaceId); + + if (!space || !joinedSpaces.includes(space.roomId)) { + return ; + } + + return ( + + {children} + + ); +} diff --git a/src/app/pages/client/space/index.ts b/src/app/pages/client/space/index.ts new file mode 100644 index 00000000..0e32d93b --- /dev/null +++ b/src/app/pages/client/space/index.ts @@ -0,0 +1,4 @@ +export * from './SpaceProvider'; +export * from './Space'; +export * from './Search'; +export * from './RoomProvider'; diff --git a/src/app/pages/pathUtils.ts b/src/app/pages/pathUtils.ts index db39ce39..cbd453ae 100644 --- a/src/app/pages/pathUtils.ts +++ b/src/app/pages/pathUtils.ts @@ -1,5 +1,32 @@ -import { generatePath } from 'react-router-dom'; -import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, ROOT_PATH } from './paths'; +import { generatePath, Path } from 'react-router-dom'; +import { + DIRECT_CREATE_PATH, + DIRECT_PATH, + DIRECT_ROOM_PATH, + EXPLORE_FEATURED_PATH, + EXPLORE_PATH, + EXPLORE_SERVER_PATH, + HOME_CREATE_PATH, + HOME_JOIN_PATH, + HOME_PATH, + HOME_ROOM_PATH, + HOME_SEARCH_PATH, + LOGIN_PATH, + INBOX_INVITES_PATH, + INBOX_NOTIFICATIONS_PATH, + INBOX_PATH, + REGISTER_PATH, + RESET_PASSWORD_PATH, + ROOT_PATH, + SPACE_LOBBY_PATH, + SPACE_PATH, + SPACE_ROOM_PATH, + SPACE_SEARCH_PATH, +} from './paths'; +import { trimLeadingSlash, trimTrailingSlash } from '../utils/common'; +import { HashRouterConfig } from '../hooks/useClientConfig'; + +export const joinPathComponent = (path: Path): string => path.pathname + path.search + path.hash; export const withSearchParam = >( path: string, @@ -9,6 +36,38 @@ export const withSearchParam = >( return `${path}?${params}`; }; +export const encodeSearchParamValueArray = (ids: string[]): string => ids.join(','); +export const decodeSearchParamValueArray = (idsParam: string): string[] => idsParam.split(','); + +export const getOriginBaseUrl = (hashRouterConfig?: HashRouterConfig): string => { + const baseUrl = `${trimTrailingSlash(window.location.origin)}${import.meta.env.BASE_URL}`; + + if (hashRouterConfig?.enabled) { + return `${trimTrailingSlash(baseUrl)}/#${hashRouterConfig.basename}`; + } + + return baseUrl; +}; + +export const withOriginBaseUrl = (baseUrl: string, path: string): string => + `${trimTrailingSlash(baseUrl)}${path}`; + +export const getAppPathFromHref = (baseUrl: string, href: string): string => { + // if hash is in baseUrl means we are using hashRouter + const baseHashIndex = baseUrl.indexOf('#'); + if (baseHashIndex > -1) { + const hrefHashIndex = href.indexOf('#'); + // href may/not have "/" around "#" + // we need to take care of this when extracting app path + const trimmedBaseUrl = trimLeadingSlash(baseUrl.slice(baseHashIndex + 1)); + const trimmedHref = trimLeadingSlash(href.slice(hrefHashIndex + 1)); + + const appPath = trimmedHref.slice(trimmedBaseUrl.length); + return `/${trimLeadingSlash(appPath)}`; + } + + return href.slice(trimTrailingSlash(baseUrl).length); +}; export const getRootPath = (): string => ROOT_PATH; @@ -26,3 +85,73 @@ export const getResetPasswordPath = (server?: string): string => { const params = server ? { server: encodeURIComponent(server) } : undefined; return generatePath(RESET_PASSWORD_PATH, params); }; + +export const getHomePath = (): string => HOME_PATH; +export const getHomeCreatePath = (): string => HOME_CREATE_PATH; +export const getHomeJoinPath = (): string => HOME_JOIN_PATH; +export const getHomeSearchPath = (): string => HOME_SEARCH_PATH; +export const getHomeRoomPath = (roomIdOrAlias: string, eventId?: string): string => { + const params = { + roomIdOrAlias: encodeURIComponent(roomIdOrAlias), + eventId: eventId ? encodeURIComponent(eventId) : null, + }; + + return generatePath(HOME_ROOM_PATH, params); +}; + +export const getDirectPath = (): string => DIRECT_PATH; +export const getDirectCreatePath = (): string => DIRECT_CREATE_PATH; +export const getDirectRoomPath = (roomIdOrAlias: string, eventId?: string): string => { + const params = { + roomIdOrAlias: encodeURIComponent(roomIdOrAlias), + eventId: eventId ? encodeURIComponent(eventId) : null, + }; + + return generatePath(DIRECT_ROOM_PATH, params); +}; + +export const getSpacePath = (spaceIdOrAlias: string): string => { + const params = { + spaceIdOrAlias: encodeURIComponent(spaceIdOrAlias), + }; + + return generatePath(SPACE_PATH, params); +}; +export const getSpaceLobbyPath = (spaceIdOrAlias: string): string => { + const params = { + spaceIdOrAlias: encodeURIComponent(spaceIdOrAlias), + }; + return generatePath(SPACE_LOBBY_PATH, params); +}; +export const getSpaceSearchPath = (spaceIdOrAlias: string): string => { + const params = { + spaceIdOrAlias: encodeURIComponent(spaceIdOrAlias), + }; + return generatePath(SPACE_SEARCH_PATH, params); +}; +export const getSpaceRoomPath = ( + spaceIdOrAlias: string, + roomIdOrAlias: string, + eventId?: string +): string => { + const params = { + spaceIdOrAlias: encodeURIComponent(spaceIdOrAlias), + roomIdOrAlias: encodeURIComponent(roomIdOrAlias), + eventId: eventId ? encodeURIComponent(eventId) : null, + }; + + return generatePath(SPACE_ROOM_PATH, params); +}; + +export const getExplorePath = (): string => EXPLORE_PATH; +export const getExploreFeaturedPath = (): string => EXPLORE_FEATURED_PATH; +export const getExploreServerPath = (server: string): string => { + const params = { + server: encodeURIComponent(server), + }; + return generatePath(EXPLORE_SERVER_PATH, params); +}; + +export const getInboxPath = (): string => INBOX_PATH; +export const getInboxNotificationsPath = (): string => INBOX_NOTIFICATIONS_PATH; +export const getInboxInvitesPath = (): string => INBOX_INVITES_PATH; diff --git a/src/app/pages/paths.ts b/src/app/pages/paths.ts index cd622641..fd3266e9 100644 --- a/src/app/pages/paths.ts +++ b/src/app/pages/paths.ts @@ -14,4 +14,69 @@ export type RegisterPathSearchParams = { }; export const REGISTER_PATH = '/register/:server?/'; +export type ResetPasswordPathSearchParams = { + email?: string; +}; export const RESET_PASSWORD_PATH = '/reset-password/:server?/'; + +export const _CREATE_PATH = 'create/'; +export const _JOIN_PATH = 'join/'; +export const _LOBBY_PATH = 'lobby/'; +/** + * array of rooms and senders mxId assigned + * to search param as string should be "," separated + * Like: url?rooms=!one:server,!two:server + */ +export type _SearchPathSearchParams = { + global?: string; + term?: string; + order?: string; + rooms?: string; + senders?: string; +}; +export const _SEARCH_PATH = 'search/'; +export const _ROOM_PATH = ':roomIdOrAlias/:eventId?/'; + +export const HOME_PATH = '/home/'; +export const HOME_CREATE_PATH = `/home/${_CREATE_PATH}`; +export const HOME_JOIN_PATH = `/home/${_JOIN_PATH}`; +export const HOME_SEARCH_PATH = `/home/${_SEARCH_PATH}`; +export const HOME_ROOM_PATH = `/home/${_ROOM_PATH}`; + +export const DIRECT_PATH = '/direct/'; +export const DIRECT_CREATE_PATH = `/direct/${_CREATE_PATH}`; +export const DIRECT_ROOM_PATH = `/direct/${_ROOM_PATH}`; + +export const SPACE_PATH = '/:spaceIdOrAlias/'; +export const SPACE_LOBBY_PATH = `/:spaceIdOrAlias/${_LOBBY_PATH}`; +export const SPACE_SEARCH_PATH = `/:spaceIdOrAlias/${_SEARCH_PATH}`; +export const SPACE_ROOM_PATH = `/:spaceIdOrAlias/${_ROOM_PATH}`; + +export const _FEATURED_PATH = 'featured/'; +export const _SERVER_PATH = ':server/'; +export const EXPLORE_PATH = '/explore/'; +export const EXPLORE_FEATURED_PATH = `/explore/${_FEATURED_PATH}`; + +export type ExploreServerPathSearchParams = { + limit?: string; + since?: string; + term?: string; + type?: string; + instance?: string; +}; +export const EXPLORE_SERVER_PATH = `/explore/${_SERVER_PATH}`; + +export const _NOTIFICATIONS_PATH = 'notifications/'; +export const _INVITES_PATH = 'invites/'; +export const INBOX_PATH = '/inbox/'; +export type InboxNotificationsPathSearchParams = { + only?: string; +}; +export const INBOX_NOTIFICATIONS_PATH = `/inbox/${_NOTIFICATIONS_PATH}`; +export const INBOX_INVITES_PATH = `/inbox/${_INVITES_PATH}`; + +export const USER_SETTINGS_PATH = '/user-settings/'; + +export const SPACE_SETTINGS_PATH = '/space-settings/'; + +export const ROOM_SETTINGS_PATH = '/room-settings/'; diff --git a/src/app/plugins/millify.ts b/src/app/plugins/millify.ts new file mode 100644 index 00000000..d8608dee --- /dev/null +++ b/src/app/plugins/millify.ts @@ -0,0 +1,9 @@ +import millifyPlugin from 'millify'; +import { MillifyOptions } from 'millify/dist/options'; + +export const millify = (count: number, options?: Partial): string => + millifyPlugin(count, { + precision: 1, + locales: [], + ...options, + }); diff --git a/src/app/plugins/pdfjs-dist.ts b/src/app/plugins/pdfjs-dist.ts index 5412ea45..1b2991f4 100644 --- a/src/app/plugins/pdfjs-dist.ts +++ b/src/app/plugins/pdfjs-dist.ts @@ -2,12 +2,15 @@ import { useCallback } from 'react'; import type * as PdfJsDist from 'pdfjs-dist'; import type { GetViewportParameters } from 'pdfjs-dist/types/src/display/api'; import { useAsyncCallback } from '../hooks/useAsyncCallback'; +import { trimTrailingSlash } from '../utils/common'; export const usePdfJSLoader = () => useAsyncCallback( useCallback(async () => { const pdf = await import('pdfjs-dist'); - pdf.GlobalWorkerOptions.workerSrc = 'pdf.worker.min.js'; + pdf.GlobalWorkerOptions.workerSrc = `${trimTrailingSlash( + import.meta.env.BASE_URL + )}/pdf.worker.min.js`; return pdf; }, []) ); diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index ee41687d..a8086687 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -14,7 +14,7 @@ import { Opts as LinkifyOpts } from 'linkifyjs'; import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; -import { getMxIdLocalPart, getRoomWithCanonicalAlias } from '../utils/matrix'; +import { getMxIdLocalPart, getCanonicalAliasRoomId } from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; @@ -35,12 +35,12 @@ export const LINKIFY_OPTS: LinkifyOpts = { ignoreTags: ['span'], }; -const textToEmojifyJSX = (text: string): (string | JSX.Element)[] => +export const scaleSystemEmoji = (text: string): (string | JSX.Element)[] => findAndReplace( text, EMOJI_REG_G, (match, pushIndex) => ( - + {match[0]} @@ -49,19 +49,36 @@ const textToEmojifyJSX = (text: string): (string | JSX.Element)[] => (txt) => txt ); -export const emojifyAndLinkify = (text: string, linkify?: boolean) => { - const emojifyJSX = textToEmojifyJSX(text); - - if (linkify) { - return {emojifyJSX}; - } - return emojifyJSX; +export const makeHighlightRegex = (highlights: string[]): RegExp | undefined => { + const pattern = highlights.join('|'); + if (!pattern) return undefined; + return new RegExp(pattern, 'gi'); }; +export const highlightText = ( + regex: RegExp, + data: (string | JSX.Element)[] +): (string | JSX.Element)[] => + data.flatMap((text) => { + if (typeof text !== 'string') return text; + + return findAndReplace( + text, + regex, + (match, pushIndex) => ( + + {match[0]} + + ), + (txt) => txt + ); + }); + export const getReactCustomHtmlParser = ( mx: MatrixClient, room: Room, params: { + highlightRegex?: RegExp; handleSpoilerClick?: ReactEventHandler; handleMentionClick?: ReactEventHandler; } @@ -207,10 +224,9 @@ export const getReactCustomHtmlParser = ( const mentionId = mention[1]; const mentionPrefix = mention[2]; if (mentionPrefix === '#' || mentionPrefix === '!') { - const mentionRoom = - mentionPrefix === '#' - ? getRoomWithCanonicalAlias(mx, mentionId) - : mx.getRoom(mentionId); + const mentionRoom = mx.getRoom( + mentionPrefix === '#' ? getCanonicalAliasRoomId(mx, mentionId) : mentionId + ); return ( {jsx}; + } + return jsx; } return undefined; }, diff --git a/src/app/state/closedLobbyCategories.ts b/src/app/state/closedLobbyCategories.ts new file mode 100644 index 00000000..40ecd163 --- /dev/null +++ b/src/app/state/closedLobbyCategories.ts @@ -0,0 +1,68 @@ +import { WritableAtom, atom } from 'jotai'; +import produce from 'immer'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +const CLOSED_LOBBY_CATEGORY = 'closedLobbyCategories'; + +type ClosedLobbyCategoriesAction = + | { + type: 'PUT'; + categoryId: string; + } + | { + type: 'DELETE'; + categoryId: string; + }; + +export type ClosedLobbyCategoriesAtom = WritableAtom< + Set, + [ClosedLobbyCategoriesAction], + undefined +>; + +export const makeClosedLobbyCategoriesAtom = (userId: string): ClosedLobbyCategoriesAtom => { + const storeKey = `${CLOSED_LOBBY_CATEGORY}${userId}`; + + const baseClosedLobbyCategoriesAtom = atomWithLocalStorage>( + storeKey, + (key) => { + const arrayValue = getLocalStorageItem(key, []); + return new Set(arrayValue); + }, + (key, value) => { + const arrayValue = Array.from(value); + setLocalStorageItem(key, arrayValue); + } + ); + + const closedLobbyCategoriesAtom = atom, [ClosedLobbyCategoriesAction], undefined>( + (get) => get(baseClosedLobbyCategoriesAtom), + (get, set, action) => { + if (action.type === 'DELETE') { + set( + baseClosedLobbyCategoriesAtom, + produce(get(baseClosedLobbyCategoriesAtom), (draft) => { + draft.delete(action.categoryId); + }) + ); + return; + } + if (action.type === 'PUT') { + set( + baseClosedLobbyCategoriesAtom, + produce(get(baseClosedLobbyCategoriesAtom), (draft) => { + draft.add(action.categoryId); + }) + ); + } + } + ); + + return closedLobbyCategoriesAtom; +}; + +export const makeLobbyCategoryId = (...args: string[]): string => args.join('|'); diff --git a/src/app/state/closedNavCategories.ts b/src/app/state/closedNavCategories.ts new file mode 100644 index 00000000..ea61cb2e --- /dev/null +++ b/src/app/state/closedNavCategories.ts @@ -0,0 +1,68 @@ +import { WritableAtom, atom } from 'jotai'; +import produce from 'immer'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +const CLOSED_NAV_CATEGORY = 'closedNavCategories'; + +type ClosedNavCategoriesAction = + | { + type: 'PUT'; + categoryId: string; + } + | { + type: 'DELETE'; + categoryId: string; + }; + +export type ClosedNavCategoriesAtom = WritableAtom< + Set, + [ClosedNavCategoriesAction], + undefined +>; + +export const makeClosedNavCategoriesAtom = (userId: string): ClosedNavCategoriesAtom => { + const storeKey = `${CLOSED_NAV_CATEGORY}${userId}`; + + const baseClosedNavCategoriesAtom = atomWithLocalStorage>( + storeKey, + (key) => { + const arrayValue = getLocalStorageItem(key, []); + return new Set(arrayValue); + }, + (key, value) => { + const arrayValue = Array.from(value); + setLocalStorageItem(key, arrayValue); + } + ); + + const closedNavCategoriesAtom = atom, [ClosedNavCategoriesAction], undefined>( + (get) => get(baseClosedNavCategoriesAtom), + (get, set, action) => { + if (action.type === 'DELETE') { + set( + baseClosedNavCategoriesAtom, + produce(get(baseClosedNavCategoriesAtom), (draft) => { + draft.delete(action.categoryId); + }) + ); + return; + } + if (action.type === 'PUT') { + set( + baseClosedNavCategoriesAtom, + produce(get(baseClosedNavCategoriesAtom), (draft) => { + draft.add(action.categoryId); + }) + ); + } + } + ); + + return closedNavCategoriesAtom; +}; + +export const makeNavCategoryId = (...args: string[]): string => args.join('|'); diff --git a/src/app/state/hooks/closedLobbyCategories.ts b/src/app/state/hooks/closedLobbyCategories.ts new file mode 100644 index 00000000..1545254f --- /dev/null +++ b/src/app/state/hooks/closedLobbyCategories.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from 'react'; +import { ClosedLobbyCategoriesAtom } from '../closedLobbyCategories'; + +const ClosedLobbyCategoriesAtomContext = createContext(null); +export const ClosedLobbyCategoriesProvider = ClosedLobbyCategoriesAtomContext.Provider; + +export const useClosedLobbyCategoriesAtom = (): ClosedLobbyCategoriesAtom => { + const anAtom = useContext(ClosedLobbyCategoriesAtomContext); + + if (!anAtom) { + throw new Error('ClosedLobbyCategoriesAtom is not provided!'); + } + + return anAtom; +}; diff --git a/src/app/state/hooks/closedNavCategories.ts b/src/app/state/hooks/closedNavCategories.ts new file mode 100644 index 00000000..ed34c1e6 --- /dev/null +++ b/src/app/state/hooks/closedNavCategories.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from 'react'; +import { ClosedNavCategoriesAtom } from '../closedNavCategories'; + +const ClosedNavCategoriesAtomContext = createContext(null); +export const ClosedNavCategoriesProvider = ClosedNavCategoriesAtomContext.Provider; + +export const useClosedNavCategoriesAtom = (): ClosedNavCategoriesAtom => { + const anAtom = useContext(ClosedNavCategoriesAtomContext); + + if (!anAtom) { + throw new Error('ClosedNavCategoriesAtom is not provided!'); + } + + return anAtom; +}; diff --git a/src/app/state/hooks/inviteList.ts b/src/app/state/hooks/inviteList.ts index ffe44445..5e003fb1 100644 --- a/src/app/state/hooks/inviteList.ts +++ b/src/app/state/hooks/inviteList.ts @@ -3,9 +3,8 @@ import { selectAtom } from 'jotai/utils'; import { MatrixClient } from 'matrix-js-sdk'; import { useCallback } from 'react'; import { isDirectInvite, isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; -import { compareRoomsEqual } from '../utils'; -import { mDirectAtom } from '../mDirectList'; -import { allInvitesAtom } from '../inviteList'; +import { compareRoomsEqual } from '../room-list/utils'; +import { allInvitesAtom } from '../room-list/inviteList'; export const useSpaceInvites = (mx: MatrixClient, invitesAtom: typeof allInvitesAtom) => { const selector = useCallback( @@ -18,9 +17,8 @@ export const useSpaceInvites = (mx: MatrixClient, invitesAtom: typeof allInvites export const useRoomInvites = ( mx: MatrixClient, invitesAtom: typeof allInvitesAtom, - directAtom: typeof mDirectAtom + mDirects: Set ) => { - const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter( @@ -36,9 +34,8 @@ export const useRoomInvites = ( export const useDirectInvites = ( mx: MatrixClient, invitesAtom: typeof allInvitesAtom, - directAtom: typeof mDirectAtom + mDirects: Set ) => { - const mDirects = useAtomValue(directAtom); const selector = useCallback( (rooms: string[]) => rooms.filter( diff --git a/src/app/state/hooks/navToActivePath.ts b/src/app/state/hooks/navToActivePath.ts new file mode 100644 index 00000000..5f8798f2 --- /dev/null +++ b/src/app/state/hooks/navToActivePath.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from 'react'; +import { NavToActivePathAtom } from '../navToActivePath'; + +const NavToActivePathAtomContext = createContext(null); +export const NavToActivePathProvider = NavToActivePathAtomContext.Provider; + +export const useNavToActivePathAtom = (): NavToActivePathAtom => { + const anAtom = useContext(NavToActivePathAtomContext); + + if (!anAtom) { + throw new Error('NavToActivePathAtom is not provided!'); + } + + return anAtom; +}; diff --git a/src/app/state/hooks/openedSidebarFolder.ts b/src/app/state/hooks/openedSidebarFolder.ts new file mode 100644 index 00000000..3a165334 --- /dev/null +++ b/src/app/state/hooks/openedSidebarFolder.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from 'react'; +import { OpenedSidebarFolderAtom } from '../openedSidebarFolder'; + +const OpenedSidebarFolderAtomContext = createContext(null); +export const OpenedSidebarFolderProvider = OpenedSidebarFolderAtomContext.Provider; + +export const useOpenedSidebarFolderAtom = (): OpenedSidebarFolderAtom => { + const anAtom = useContext(OpenedSidebarFolderAtomContext); + + if (!anAtom) { + throw new Error('OpenedSidebarFolderAtom is not provided!'); + } + + return anAtom; +}; diff --git a/src/app/state/hooks/roomList.ts b/src/app/state/hooks/roomList.ts index c0a7bfb8..d64ecd5b 100644 --- a/src/app/state/hooks/roomList.ts +++ b/src/app/state/hooks/roomList.ts @@ -1,52 +1,177 @@ -import { useAtomValue } from 'jotai'; +import { Atom, useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { MatrixClient } from 'matrix-js-sdk'; -import { useCallback } from 'react'; -import { isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; -import { compareRoomsEqual } from '../utils'; -import { mDirectAtom } from '../mDirectList'; -import { allRoomsAtom } from '../roomList'; +import { useCallback, useMemo } from 'react'; +import { getAllParents, isRoom, isSpace, isUnsupportedRoom } from '../../utils/room'; +import { compareRoomsEqual } from '../room-list/utils'; +import { RoomToParents } from '../../../types/matrix/room'; -export const useSpaces = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => { - const selector = useCallback( - (rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))), - [mx] - ); - return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); +export type RoomsAtom = Atom; +export type RoomSelector = (roomId: string) => boolean | undefined; + +export const selectedRoomsAtom = ( + roomsAtom: RoomsAtom, + selector: (roomId: string) => boolean | undefined +) => selectAtom(roomsAtom, (rooms) => rooms.filter(selector), compareRoomsEqual); + +export const useSelectedRooms = (roomsAtom: RoomsAtom, selector: RoomSelector) => { + const anAtom = useMemo(() => selectedRoomsAtom(roomsAtom, selector), [roomsAtom, selector]); + + return useAtomValue(anAtom); }; -export const useRooms = ( +export type SpaceChildSelectorFactory = (parentId: string) => RoomSelector; + +export const useRecursiveChildScopeFactory = ( mx: MatrixClient, - roomsAtom: typeof allRoomsAtom, - directAtom: typeof mDirectAtom + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isRoom(mx.getRoom(roomId)) && + roomToParents.has(roomId) && + getAllParents(roomToParents, roomId).has(parentId), + [mx, roomToParents] + ); + +export const useChildSpaceScopeFactory = ( + mx: MatrixClient, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isSpace(mx.getRoom(roomId)) && roomToParents.get(roomId)?.has(parentId), + [mx, roomToParents] + ); + +export const useRecursiveChildSpaceScopeFactory = ( + mx: MatrixClient, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isSpace(mx.getRoom(roomId)) && + roomToParents.has(roomId) && + getAllParents(roomToParents, roomId).has(parentId), + [mx, roomToParents] + ); + +export const useChildRoomScopeFactory = ( + mx: MatrixClient, + mDirects: Set, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isRoom(mx.getRoom(roomId)) && + !mDirects.has(roomId) && + roomToParents.get(roomId)?.has(parentId), + [mx, mDirects, roomToParents] + ); + +export const useRecursiveChildRoomScopeFactory = ( + mx: MatrixClient, + mDirects: Set, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isRoom(mx.getRoom(roomId)) && + !mDirects.has(roomId) && + roomToParents.has(roomId) && + getAllParents(roomToParents, roomId).has(parentId), + [mx, mDirects, roomToParents] + ); + +export const useChildDirectScopeFactory = ( + mx: MatrixClient, + mDirects: Set, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isRoom(mx.getRoom(roomId)) && + mDirects.has(roomId) && + roomToParents.get(roomId)?.has(parentId), + [mx, mDirects, roomToParents] + ); + +export const useRecursiveChildDirectScopeFactory = ( + mx: MatrixClient, + mDirects: Set, + roomToParents: RoomToParents +): SpaceChildSelectorFactory => + useCallback( + (parentId: string) => (roomId) => + isRoom(mx.getRoom(roomId)) && + mDirects.has(roomId) && + roomToParents.has(roomId) && + getAllParents(roomToParents, roomId).has(parentId), + [mx, mDirects, roomToParents] + ); + +export const useSpaceChildren = ( + roomsAtom: RoomsAtom, + spaceId: string, + selectorFactory: SpaceChildSelectorFactory ) => { - const mDirects = useAtomValue(directAtom); - const selector = useCallback( - (rooms: string[]) => - rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId)), + const recursiveChildRoomSelector = useMemo( + () => selectorFactory(spaceId), + [selectorFactory, spaceId] + ); + return useSelectedRooms(roomsAtom, recursiveChildRoomSelector); +}; + +export const useSpaces = (mx: MatrixClient, roomsAtom: RoomsAtom) => { + const selector: RoomSelector = useCallback((roomId) => isSpace(mx.getRoom(roomId)), [mx]); + return useSelectedRooms(roomsAtom, selector); +}; + +export const useOrphanSpaces = ( + mx: MatrixClient, + roomsAtom: RoomsAtom, + roomToParents: RoomToParents +) => { + const selector: RoomSelector = useCallback( + (roomId) => isSpace(mx.getRoom(roomId)) && !roomToParents.has(roomId), + [mx, roomToParents] + ); + return useSelectedRooms(roomsAtom, selector); +}; + +export const useRooms = (mx: MatrixClient, roomsAtom: RoomsAtom, mDirects: Set) => { + const selector: RoomSelector = useCallback( + (roomId: string) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId), [mx, mDirects] ); - return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); + return useSelectedRooms(roomsAtom, selector); }; -export const useDirects = ( +export const useOrphanRooms = ( mx: MatrixClient, - roomsAtom: typeof allRoomsAtom, - directAtom: typeof mDirectAtom + roomsAtom: RoomsAtom, + mDirects: Set, + roomToParents: RoomToParents ) => { - const mDirects = useAtomValue(directAtom); - const selector = useCallback( - (rooms: string[]) => - rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId)), + const selector: RoomSelector = useCallback( + (roomId) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId) && !roomToParents.has(roomId), + [mx, mDirects, roomToParents] + ); + return useSelectedRooms(roomsAtom, selector); +}; + +export const useDirects = (mx: MatrixClient, roomsAtom: RoomsAtom, mDirects: Set) => { + const selector: RoomSelector = useCallback( + (roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId), [mx, mDirects] ); - return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); + return useSelectedRooms(roomsAtom, selector); }; -export const useUnsupportedRooms = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => { - const selector = useCallback( - (rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))), +export const useUnsupportedRooms = (mx: MatrixClient, roomsAtom: RoomsAtom) => { + const selector: RoomSelector = useCallback( + (roomId) => isUnsupportedRoom(mx.getRoom(roomId)), [mx] ); - return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual)); + return useSelectedRooms(roomsAtom, selector); }; diff --git a/src/app/state/hooks/unread.ts b/src/app/state/hooks/unread.ts new file mode 100644 index 00000000..62386d02 --- /dev/null +++ b/src/app/state/hooks/unread.ts @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; +import { useAtomValue } from 'jotai'; +import { selectAtom } from 'jotai/utils'; +import { RoomToUnread, Unread } from '../../../types/matrix/room'; +import { roomToUnreadAtom, unreadEqual } from '../room/roomToUnread'; + +const compareUnreadEqual = (u1?: Unread, u2?: Unread): boolean => { + if (!u1 || !u2) return false; + return unreadEqual(u1, u2); +}; + +const getRoomsUnread = (rooms: string[], roomToUnread: RoomToUnread): Unread | undefined => { + const unread = rooms.reduce((u, roomId) => { + const roomUnread = roomToUnread.get(roomId); + if (!roomUnread) return u; + const newUnread: Unread = u ?? { + total: 0, + highlight: 0, + from: new Set(), + }; + newUnread.total += roomUnread.total; + newUnread.highlight += roomUnread.highlight; + newUnread.from?.add(roomId); + return newUnread; + }, undefined); + return unread; +}; + +export const useRoomsUnread = ( + rooms: string[], + roomToUnreadAtm: typeof roomToUnreadAtom +): Unread | undefined => { + const selector = useCallback( + (roomToUnread: RoomToUnread) => getRoomsUnread(rooms, roomToUnread), + [rooms] + ); + return useAtomValue(selectAtom(roomToUnreadAtm, selector, compareUnreadEqual)); +}; + +export const useRoomUnread = ( + roomId: string, + roomToUnreadAtm: typeof roomToUnreadAtom +): Unread | undefined => { + const selector = useCallback((roomToUnread: RoomToUnread) => roomToUnread.get(roomId), [roomId]); + return useAtomValue(selectAtom(roomToUnreadAtm, selector, compareUnreadEqual)); +}; diff --git a/src/app/state/hooks/useBindAtoms.ts b/src/app/state/hooks/useBindAtoms.ts index 6dc2a3de..136c833f 100644 --- a/src/app/state/hooks/useBindAtoms.ts +++ b/src/app/state/hooks/useBindAtoms.ts @@ -1,10 +1,11 @@ import { MatrixClient } from 'matrix-js-sdk'; -import { allInvitesAtom, useBindAllInvitesAtom } from '../inviteList'; -import { allRoomsAtom, useBindAllRoomsAtom } from '../roomList'; +import { allInvitesAtom, useBindAllInvitesAtom } from '../room-list/inviteList'; +import { allRoomsAtom, useBindAllRoomsAtom } from '../room-list/roomList'; import { mDirectAtom, useBindMDirectAtom } from '../mDirectList'; -import { muteChangesAtom, mutedRoomsAtom, useBindMutedRoomsAtom } from '../mutedRoomList'; -import { roomToUnreadAtom, useBindRoomToUnreadAtom } from '../roomToUnread'; -import { roomToParentsAtom, useBindRoomToParentsAtom } from '../roomToParents'; +import { muteChangesAtom, mutedRoomsAtom, useBindMutedRoomsAtom } from '../room-list/mutedRoomList'; +import { roomToUnreadAtom, useBindRoomToUnreadAtom } from '../room/roomToUnread'; +import { roomToParentsAtom, useBindRoomToParentsAtom } from '../room/roomToParents'; +import { roomIdToTypingMembersAtom, useBindRoomIdToTypingMembersAtom } from '../typingMembers'; export const useBindAtoms = (mx: MatrixClient) => { useBindMDirectAtom(mx, mDirectAtom); @@ -13,4 +14,6 @@ export const useBindAtoms = (mx: MatrixClient) => { useBindRoomToParentsAtom(mx, roomToParentsAtom); useBindMutedRoomsAtom(mx, mutedRoomsAtom); useBindRoomToUnreadAtom(mx, roomToUnreadAtom, muteChangesAtom); + + useBindRoomIdToTypingMembersAtom(mx, roomIdToTypingMembersAtom); }; diff --git a/src/app/state/mDirectList.ts b/src/app/state/mDirectList.ts index 1fa8311f..95165255 100644 --- a/src/app/state/mDirectList.ts +++ b/src/app/state/mDirectList.ts @@ -30,10 +30,12 @@ export const useBindMDirectAtom = (mx: MatrixClient, mDirect: typeof mDirectAtom } const handleAccountData = (event: MatrixEvent) => { - setMDirect({ - type: 'UPDATE', - rooms: getMDirects(event), - }); + if (event.getType() === AccountDataEvent.Direct) { + setMDirect({ + type: 'UPDATE', + rooms: getMDirects(event), + }); + } }; mx.on(ClientEvent.AccountData, handleAccountData); diff --git a/src/app/state/navToActivePath.ts b/src/app/state/navToActivePath.ts new file mode 100644 index 00000000..80869146 --- /dev/null +++ b/src/app/state/navToActivePath.ts @@ -0,0 +1,66 @@ +import { WritableAtom, atom } from 'jotai'; +import produce from 'immer'; +import { Path } from 'react-router-dom'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +const NAV_TO_ACTIVE_PATH = 'navToActivePath'; + +type NavToActivePath = Map; + +type NavToActivePathAction = + | { + type: 'PUT'; + navId: string; + path: Path; + } + | { + type: 'DELETE'; + navId: string; + }; + +export type NavToActivePathAtom = WritableAtom; + +export const makeNavToActivePathAtom = (userId: string): NavToActivePathAtom => { + const storeKey = `${NAV_TO_ACTIVE_PATH}${userId}`; + + const baseNavToActivePathAtom = atomWithLocalStorage( + storeKey, + (key) => { + const obj: Record = getLocalStorageItem(key, {}); + return new Map(Object.entries(obj)); + }, + (key, value) => { + const obj: Record = Object.fromEntries(value); + setLocalStorageItem(key, obj); + } + ); + + const navToActivePathAtom = atom( + (get) => get(baseNavToActivePathAtom), + (get, set, action) => { + if (action.type === 'DELETE') { + set( + baseNavToActivePathAtom, + produce(get(baseNavToActivePathAtom), (draft) => { + draft.delete(action.navId); + }) + ); + return; + } + if (action.type === 'PUT') { + set( + baseNavToActivePathAtom, + produce(get(baseNavToActivePathAtom), (draft) => { + draft.set(action.navId, action.path); + }) + ); + } + } + ); + + return navToActivePathAtom; +}; diff --git a/src/app/state/openedSidebarFolder.ts b/src/app/state/openedSidebarFolder.ts new file mode 100644 index 00000000..70373b3b --- /dev/null +++ b/src/app/state/openedSidebarFolder.ts @@ -0,0 +1,66 @@ +import { WritableAtom, atom } from 'jotai'; +import produce from 'immer'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +const OPENED_SIDEBAR_FOLDER = 'openedSidebarFolder'; + +type OpenedSidebarFolderAction = + | { + type: 'PUT'; + id: string; + } + | { + type: 'DELETE'; + id: string; + }; + +export type OpenedSidebarFolderAtom = WritableAtom< + Set, + [OpenedSidebarFolderAction], + undefined +>; + +export const makeOpenedSidebarFolderAtom = (userId: string): OpenedSidebarFolderAtom => { + const storeKey = `${OPENED_SIDEBAR_FOLDER}${userId}`; + + const baseOpenedSidebarFolderAtom = atomWithLocalStorage>( + storeKey, + (key) => { + const arrayValue = getLocalStorageItem(key, []); + return new Set(arrayValue); + }, + (key, value) => { + const arrayValue = Array.from(value); + setLocalStorageItem(key, arrayValue); + } + ); + + const openedSidebarFolderAtom = atom, [OpenedSidebarFolderAction], undefined>( + (get) => get(baseOpenedSidebarFolderAtom), + (get, set, action) => { + if (action.type === 'DELETE') { + set( + baseOpenedSidebarFolderAtom, + produce(get(baseOpenedSidebarFolderAtom), (draft) => { + draft.delete(action.id); + }) + ); + return; + } + if (action.type === 'PUT') { + set( + baseOpenedSidebarFolderAtom, + produce(get(baseOpenedSidebarFolderAtom), (draft) => { + draft.add(action.id); + }) + ); + } + } + ); + + return openedSidebarFolderAtom; +}; diff --git a/src/app/state/inviteList.ts b/src/app/state/room-list/inviteList.ts similarity index 94% rename from src/app/state/inviteList.ts rename to src/app/state/room-list/inviteList.ts index a6dc7966..4fa97be4 100644 --- a/src/app/state/inviteList.ts +++ b/src/app/state/room-list/inviteList.ts @@ -1,7 +1,7 @@ import { atom, WritableAtom } from 'jotai'; import { MatrixClient } from 'matrix-js-sdk'; import { useMemo } from 'react'; -import { Membership } from '../../types/matrix/room'; +import { Membership } from '../../../types/matrix/room'; import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); diff --git a/src/app/state/mutedRoomList.ts b/src/app/state/room-list/mutedRoomList.ts similarity index 96% rename from src/app/state/mutedRoomList.ts rename to src/app/state/room-list/mutedRoomList.ts index f818450b..cb56ec0f 100644 --- a/src/app/state/mutedRoomList.ts +++ b/src/app/state/room-list/mutedRoomList.ts @@ -1,8 +1,8 @@ import { atom, useSetAtom } from 'jotai'; import { ClientEvent, IPushRule, IPushRules, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; import { useEffect } from 'react'; -import { MuteChanges } from '../../types/matrix/room'; -import { findMutedRule, isMutedRule } from '../utils/room'; +import { MuteChanges } from '../../../types/matrix/room'; +import { findMutedRule, isMutedRule } from '../../utils/room'; export type MutedRoomsUpdate = | { diff --git a/src/app/state/roomList.ts b/src/app/state/room-list/roomList.ts similarity index 93% rename from src/app/state/roomList.ts rename to src/app/state/room-list/roomList.ts index e0fa170f..736a0bc2 100644 --- a/src/app/state/roomList.ts +++ b/src/app/state/room-list/roomList.ts @@ -1,7 +1,7 @@ import { atom } from 'jotai'; import { MatrixClient } from 'matrix-js-sdk'; import { useMemo } from 'react'; -import { Membership } from '../../types/matrix/room'; +import { Membership } from '../../../types/matrix/room'; import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); diff --git a/src/app/state/utils.ts b/src/app/state/room-list/utils.ts similarity index 91% rename from src/app/state/utils.ts rename to src/app/state/room-list/utils.ts index 4c4caa5c..1ca7e7de 100644 --- a/src/app/state/utils.ts +++ b/src/app/state/room-list/utils.ts @@ -1,7 +1,7 @@ import { useSetAtom, WritableAtom } from 'jotai'; import { ClientEvent, MatrixClient, Room, RoomEvent } from 'matrix-js-sdk'; import { useEffect } from 'react'; -import { Membership } from '../../types/matrix/room'; +import { Membership } from '../../../types/matrix/room'; export type RoomsAction = | { @@ -38,7 +38,9 @@ export const useBindRoomsWithMembershipsAtom = ( }; const handleMembershipChange = (room: Room) => { - if (!satisfyMembership(room)) { + if (satisfyMembership(room)) { + setRoomsAtom({ type: 'PUT', roomId: room.roomId }); + } else { setRoomsAtom({ type: 'DELETE', roomId: room.roomId }); } }; diff --git a/src/app/state/roomInputDrafts.ts b/src/app/state/room/roomInputDrafts.ts similarity index 88% rename from src/app/state/roomInputDrafts.ts rename to src/app/state/room/roomInputDrafts.ts index 2708b8bd..60b42fdb 100644 --- a/src/app/state/roomInputDrafts.ts +++ b/src/app/state/room/roomInputDrafts.ts @@ -2,9 +2,9 @@ import { atom } from 'jotai'; import { atomFamily } from 'jotai/utils'; import { Descendant } from 'slate'; import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; -import { TListAtom, createListAtom } from './list'; -import { createUploadAtomFamily } from './upload'; -import { TUploadContent } from '../utils/matrix'; +import { TListAtom, createListAtom } from '../list'; +import { createUploadAtomFamily } from '../upload'; +import { TUploadContent } from '../../utils/matrix'; export const roomUploadAtomFamily = createUploadAtomFamily(); diff --git a/src/app/state/roomToParents.ts b/src/app/state/room/roomToParents.ts similarity index 93% rename from src/app/state/roomToParents.ts rename to src/app/state/room/roomToParents.ts index 1e2ef18c..b58190cd 100644 --- a/src/app/state/roomToParents.ts +++ b/src/app/state/room/roomToParents.ts @@ -9,14 +9,14 @@ import { RoomStateEvent, } from 'matrix-js-sdk'; import { useEffect } from 'react'; -import { Membership, RoomToParents, StateEvent } from '../../types/matrix/room'; +import { Membership, RoomToParents, StateEvent } from '../../../types/matrix/room'; import { getRoomToParents, getSpaceChildren, isSpace, isValidChild, mapParentWithChildren, -} from '../utils/room'; +} from '../../utils/room'; export type RoomToParentsAction = | { @@ -83,6 +83,10 @@ export const useBindRoomToParentsAtom = ( }; const handleMembershipChange = (room: Room, membership: string) => { + if (room.getMyMembership() === Membership.Leave) { + setRoomToParents({ type: 'DELETE', roomId: room.roomId }); + return; + } if (isSpace(room) && membership === Membership.Join) { setRoomToParents({ type: 'PUT', parent: room.roomId, children: getSpaceChildren(room) }); } diff --git a/src/app/state/roomToUnread.ts b/src/app/state/room/roomToUnread.ts similarity index 74% rename from src/app/state/roomToUnread.ts rename to src/app/state/room/roomToUnread.ts index ad388763..4ac391fe 100644 --- a/src/app/state/roomToUnread.ts +++ b/src/app/state/room/roomToUnread.ts @@ -1,15 +1,24 @@ import produce from 'immer'; import { atom, useSetAtom, PrimitiveAtom, useAtomValue } from 'jotai'; -import { IRoomTimelineData, MatrixClient, MatrixEvent, Room, RoomEvent } from 'matrix-js-sdk'; +import { + IRoomTimelineData, + MatrixClient, + MatrixEvent, + Room, + RoomEvent, + SyncState, +} from 'matrix-js-sdk'; import { ReceiptContent, ReceiptType } from 'matrix-js-sdk/lib/@types/read_receipts'; -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; import { MuteChanges, Membership, NotificationType, RoomToUnread, UnreadInfo, -} from '../../types/matrix/room'; + Unread, + StateEvent, +} from '../../../types/matrix/room'; import { getAllParents, getNotificationType, @@ -17,8 +26,10 @@ import { getUnreadInfos, isNotificationEvent, roomHaveUnread, -} from '../utils/room'; +} from '../../utils/room'; import { roomToParentsAtom } from './roomToParents'; +import { useStateEventCallback } from '../../hooks/useStateEventCallback'; +import { useSyncState } from '../../hooks/useSyncState'; export type RoomToUnreadAction = | { @@ -34,17 +45,19 @@ export type RoomToUnreadAction = roomId: string; }; +const unreadInfoToUnread = (unreadInfo: UnreadInfo): Unread => ({ + highlight: unreadInfo.highlight, + total: unreadInfo.total, + from: null, +}); + const putUnreadInfo = ( roomToUnread: RoomToUnread, allParents: Set, unreadInfo: UnreadInfo ) => { const oldUnread = roomToUnread.get(unreadInfo.roomId) ?? { highlight: 0, total: 0, from: null }; - roomToUnread.set(unreadInfo.roomId, { - highlight: unreadInfo.highlight, - total: unreadInfo.total, - from: null, - }); + roomToUnread.set(unreadInfo.roomId, unreadInfoToUnread(unreadInfo)); const newH = unreadInfo.highlight - oldUnread.highlight; const newT = unreadInfo.total - oldUnread.total; @@ -81,6 +94,28 @@ const deleteUnreadInfo = (roomToUnread: RoomToUnread, allParents: Set, r }); }; +export const unreadEqual = (u1: Unread, u2: Unread): boolean => { + const countEqual = u1.highlight === u2.highlight && u1.total === u2.total; + + if (!countEqual) return false; + + const f1 = u1.from; + const f2 = u2.from; + if (f1 === null && f2 === null) return true; + if (f1 === null || f2 === null) return false; + + if (f1.size !== f2.size) return false; + + let fromEqual = true; + f1?.forEach((item) => { + if (!f2?.has(item)) { + fromEqual = false; + } + }); + + return fromEqual; +}; + const baseRoomToUnread = atom(new Map()); export const roomToUnreadAtom = atom( (get) => get(baseRoomToUnread), @@ -98,13 +133,20 @@ export const roomToUnreadAtom = atom putUnreadInfo( draftRoomToUnread, - getAllParents(get(roomToParentsAtom), action.unreadInfo.roomId), - action.unreadInfo + getAllParents(get(roomToParentsAtom), unreadInfo.roomId), + unreadInfo ) ) ); @@ -140,6 +182,21 @@ export const useBindRoomToUnreadAtom = ( }); }, [mx, setUnreadAtom]); + useSyncState( + mx, + useCallback( + (state) => { + if (state === SyncState.Prepared) { + setUnreadAtom({ + type: 'RESET', + unreadInfos: getUnreadInfos(mx), + }); + } + }, + [mx, setUnreadAtom] + ) + ); + useEffect(() => { const handleTimelineEvent = ( mEvent: MatrixEvent, @@ -216,4 +273,19 @@ export const useBindRoomToUnreadAtom = ( mx.removeListener(RoomEvent.MyMembership, handleMembershipChange); }; }, [mx, setUnreadAtom]); + + useStateEventCallback( + mx, + useCallback( + (mEvent) => { + if (mEvent.getType() === StateEvent.SpaceChild) { + setUnreadAtom({ + type: 'RESET', + unreadInfos: getUnreadInfos(mx), + }); + } + }, + [mx, setUnreadAtom] + ) + ); }; diff --git a/src/app/state/selectedRoom.ts b/src/app/state/selectedRoom.ts deleted file mode 100644 index 1ef04de3..00000000 --- a/src/app/state/selectedRoom.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { atom } from 'jotai'; - -export const selectedRoomAtom = atom(undefined); diff --git a/src/app/state/selectedTab.ts b/src/app/state/selectedTab.ts deleted file mode 100644 index e680ae60..00000000 --- a/src/app/state/selectedTab.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { atom } from 'jotai'; - -export enum SidebarTab { - Home = 'Home', - People = 'People', -} - -export const selectedTabAtom = atom(SidebarTab.Home); diff --git a/src/app/state/spaceRooms.ts b/src/app/state/spaceRooms.ts new file mode 100644 index 00000000..8480498d --- /dev/null +++ b/src/app/state/spaceRooms.ts @@ -0,0 +1,54 @@ +import { atom } from 'jotai'; +import produce from 'immer'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +const SPACE_ROOMS = 'spaceRooms'; + +const baseSpaceRoomsAtom = atomWithLocalStorage>( + SPACE_ROOMS, + (key) => { + const arrayValue = getLocalStorageItem(key, []); + return new Set(arrayValue); + }, + (key, value) => { + const arrayValue = Array.from(value); + setLocalStorageItem(key, arrayValue); + } +); + +type SpaceRoomsAction = + | { + type: 'PUT'; + roomId: string; + } + | { + type: 'DELETE'; + roomId: string; + }; + +export const spaceRoomsAtom = atom, [SpaceRoomsAction], undefined>( + (get) => get(baseSpaceRoomsAtom), + (get, set, action) => { + if (action.type === 'DELETE') { + set( + baseSpaceRoomsAtom, + produce(get(baseSpaceRoomsAtom), (draft) => { + draft.delete(action.roomId); + }) + ); + return; + } + if (action.type === 'PUT') { + set( + baseSpaceRoomsAtom, + produce(get(baseSpaceRoomsAtom), (draft) => { + draft.add(action.roomId); + }) + ); + } + } +); diff --git a/src/app/state/tabToRoom.ts b/src/app/state/tabToRoom.ts deleted file mode 100644 index b9472d9f..00000000 --- a/src/app/state/tabToRoom.ts +++ /dev/null @@ -1,34 +0,0 @@ -import produce from 'immer'; -import { atom } from 'jotai'; -import { MatrixClient } from 'matrix-js-sdk'; - -type RoomInfo = { - roomId: string; - timestamp: number; -}; -type TabToRoom = Map; - -type TabToRoomAction = { - type: 'PUT'; - tabInfo: { tabId: string; roomInfo: RoomInfo }; -}; - -const baseTabToRoom = atom(new Map()); -export const tabToRoomAtom = atom( - (get) => get(baseTabToRoom), - (get, set, action) => { - if (action.type === 'PUT') { - set( - baseTabToRoom, - produce(get(baseTabToRoom), (draft) => { - draft.set(action.tabInfo.tabId, action.tabInfo.roomInfo); - }) - ); - } - } -); - -export const useBindTabToRoomAtom = (mx: MatrixClient) => { - console.log(mx); - // TODO: -}; diff --git a/src/app/state/typingMembers.ts b/src/app/state/typingMembers.ts index c77c91be..88d4687c 100644 --- a/src/app/state/typingMembers.ts +++ b/src/app/state/typingMembers.ts @@ -1,28 +1,76 @@ +import produce from 'immer'; import { atom, useSetAtom } from 'jotai'; import { selectAtom } from 'jotai/utils'; -import { - MatrixClient, - RoomMember, - RoomMemberEvent, - RoomMemberEventHandlerMap, -} from 'matrix-js-sdk'; +import { MatrixClient, RoomMemberEvent, RoomMemberEventHandlerMap } from 'matrix-js-sdk'; import { useEffect } from 'react'; -export type IRoomIdToTypingMembers = Map; +export const TYPING_TIMEOUT_MS = 5000; // 5 seconds -export type IRoomIdToTypingMembersAction = - | { - type: 'PUT'; - roomId: string; - member: RoomMember; - } - | { - type: 'DELETE'; - roomId: string; - member: RoomMember; - }; +export type TypingReceipt = { + userId: string; + ts: number; +}; +export type IRoomIdToTypingMembers = Map; + +type TypingMemberPutAction = { + type: 'PUT'; + roomId: string; + userId: string; + ts: number; +}; +type TypingMemberDeleteAction = { + type: 'DELETE'; + roomId: string; + userId: string; +}; +export type IRoomIdToTypingMembersAction = TypingMemberPutAction | TypingMemberDeleteAction; const baseRoomIdToTypingMembersAtom = atom(new Map()); + +const putTypingMember = ( + roomToMembers: IRoomIdToTypingMembers, + action: TypingMemberPutAction +): IRoomIdToTypingMembers => { + let typingMembers = roomToMembers.get(action.roomId) ?? []; + + typingMembers = typingMembers.filter((receipt) => receipt.userId !== action.userId); + typingMembers.push({ + userId: action.userId, + ts: action.ts, + }); + roomToMembers.set(action.roomId, typingMembers); + return roomToMembers; +}; + +const deleteTypingMember = ( + roomToMembers: IRoomIdToTypingMembers, + action: TypingMemberDeleteAction +): IRoomIdToTypingMembers => { + let typingMembers = roomToMembers.get(action.roomId) ?? []; + + typingMembers = typingMembers.filter((receipt) => receipt.userId !== action.userId); + if (typingMembers.length === 0) { + roomToMembers.delete(action.roomId); + } else { + roomToMembers.set(action.roomId, typingMembers); + } + return roomToMembers; +}; + +const timeoutReceipt = ( + roomToMembers: IRoomIdToTypingMembers, + roomId: string, + userId: string, + timeout: number +): boolean | undefined => { + const typingMembers = roomToMembers.get(roomId) ?? []; + + const target = typingMembers.find((receipt) => receipt.userId === userId); + if (!target) return undefined; + + return Date.now() - target.ts >= timeout; +}; + export const roomIdToTypingMembersAtom = atom< IRoomIdToTypingMembers, [IRoomIdToTypingMembersAction], @@ -30,16 +78,48 @@ export const roomIdToTypingMembersAtom = atom< >( (get) => get(baseRoomIdToTypingMembersAtom), (get, set, action) => { - const roomIdToTypingMembers = get(baseRoomIdToTypingMembersAtom); - let typingMembers = roomIdToTypingMembers.get(action.roomId) ?? []; - - typingMembers = typingMembers.filter((member) => member.userId !== action.member.userId); + const rToTyping = get(baseRoomIdToTypingMembersAtom); if (action.type === 'PUT') { - typingMembers = [...typingMembers, action.member]; + set( + baseRoomIdToTypingMembersAtom, + produce(rToTyping, (draft) => putTypingMember(draft, action)) + ); + + // remove typing receipt after some timeout + // to prevent stuck typing members + setTimeout(() => { + const { roomId, userId } = action; + const timeout = timeoutReceipt( + get(baseRoomIdToTypingMembersAtom), + roomId, + userId, + TYPING_TIMEOUT_MS + ); + if (timeout) { + set( + baseRoomIdToTypingMembersAtom, + produce(get(baseRoomIdToTypingMembersAtom), (draft) => + deleteTypingMember(draft, { + type: 'DELETE', + roomId, + userId, + }) + ) + ); + } + }, TYPING_TIMEOUT_MS); + } + + if ( + action.type === 'DELETE' && + rToTyping.get(action.roomId)?.find((receipt) => receipt.userId === action.userId) + ) { + set( + baseRoomIdToTypingMembersAtom, + produce(rToTyping, (draft) => deleteTypingMember(draft, action)) + ); } - roomIdToTypingMembers.set(action.roomId, typingMembers); - set(baseRoomIdToTypingMembersAtom, new Map([...roomIdToTypingMembers])); } ); @@ -57,7 +137,8 @@ export const useBindRoomIdToTypingMembersAtom = ( setTypingMembers({ type: member.typing ? 'PUT' : 'DELETE', roomId: member.roomId, - member, + userId: member.userId, + ts: Date.now(), }); }; diff --git a/src/app/styles/ContainerColor.css.ts b/src/app/styles/ContainerColor.css.ts new file mode 100644 index 00000000..cb1f933d --- /dev/null +++ b/src/app/styles/ContainerColor.css.ts @@ -0,0 +1,33 @@ +import { ComplexStyleRule } from '@vanilla-extract/css'; +import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { ContainerColor as TContainerColor, DefaultReset, color } from 'folds'; + +const getVariant = (variant: TContainerColor): ComplexStyleRule => ({ + vars: { + backgroundColor: color[variant].Container, + borderColor: color[variant].ContainerLine, + outlineColor: color[variant].ContainerLine, + color: color[variant].OnContainer, + }, +}); + +export const ContainerColor = recipe({ + base: [DefaultReset], + variants: { + variant: { + Background: getVariant('Background'), + Surface: getVariant('Surface'), + SurfaceVariant: getVariant('SurfaceVariant'), + Primary: getVariant('Primary'), + Secondary: getVariant('Secondary'), + Success: getVariant('Success'), + Warning: getVariant('Warning'), + Critical: getVariant('Critical'), + }, + }, + defaultVariants: { + variant: 'Surface', + }, +}); + +export type ContainerColorVariants = RecipeVariants; diff --git a/src/app/styles/CustomHtml.css.ts b/src/app/styles/CustomHtml.css.ts index 076bbb61..d86a3236 100644 --- a/src/app/styles/CustomHtml.css.ts +++ b/src/app/styles/CustomHtml.css.ts @@ -211,3 +211,11 @@ export const EmoticonImg = style([ cursor: 'default', }, ]); + +export const highlightText = style([ + DefaultReset, + { + backgroundColor: 'yellow', + color: 'black', + }, +]); diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index e9be6b16..f6ef2b9e 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -1,24 +1,13 @@ -import React, { useState, useEffect, useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import './Client.scss'; -import { initHotkeys } from '../../../client/event/hotkeys'; -import { initRoomListListener } from '../../../client/event/roomList'; - -import Text from '../../atoms/text/Text'; -import Spinner from '../../atoms/spinner/Spinner'; -import Navigation from '../../organisms/navigation/Navigation'; -import ContextMenu, { MenuItem } from '../../atoms/context-menu/ContextMenu'; -import IconButton from '../../atoms/button/IconButton'; import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; import Windows from '../../organisms/pw/Windows'; import Dialogs from '../../organisms/pw/Dialogs'; -import initMatrix from '../../../client/initMatrix'; import navigation from '../../../client/state/navigation'; import cons from '../../../client/state/cons'; -import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; -import { MatrixClientProvider } from '../../hooks/useMatrixClient'; import { ClientContent } from './ClientContent'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; @@ -36,8 +25,6 @@ function SystemEmojiFeature() { } function Client() { - const [isLoading, changeLoading] = useState(true); - const [loadingMsg, setLoadingMsg] = useState('Heating up'); const classNameHidden = 'client__item-hidden'; const navWrapperRef = useRef(null); @@ -62,76 +49,19 @@ function Client() { }; }, []); - useEffect(() => { - changeLoading(true); - let counter = 0; - const iId = setInterval(() => { - const msgList = ['Almost there...', 'Looks like you have a lot of stuff to heat up!']; - if (counter === msgList.length - 1) { - setLoadingMsg(msgList[msgList.length - 1]); - clearInterval(iId); - return; - } - setLoadingMsg(msgList[counter]); - counter += 1; - }, 15000); - initMatrix.once('init_loading_finished', () => { - clearInterval(iId); - initHotkeys(); - initRoomListListener(initMatrix.roomList); - changeLoading(false); - }); - initMatrix.init(); - }, []); - - if (isLoading) { - return ( -
    -
    - - initMatrix.clearCacheAndReload()}> - Clear cache & reload - - initMatrix.logout()}>Logout - - } - render={(toggle) => ( - - )} - /> -
    - - - {loadingMsg} - - -
    - - Cinny - -
    -
    - ); - } - return ( - -
    -
    - -
    -
    - -
    - - - - +
    + {/*
    + +
    */} +
    +
    - + + + + +
    ); } diff --git a/src/app/templates/client/Client.scss b/src/app/templates/client/Client.scss index cdb8fcc9..bad5fc93 100644 --- a/src/app/templates/client/Client.scss +++ b/src/app/templates/client/Client.scss @@ -3,11 +3,12 @@ .client-container { display: flex; height: 100%; + flex-grow: 1; } .navigation__wrapper { width: var(--navigation-width); - + @include screen.smallerThan(mobileBreakpoint) { width: 100%; } diff --git a/src/app/templates/client/ClientContent.jsx b/src/app/templates/client/ClientContent.jsx index ada7008e..cebe012c 100644 --- a/src/app/templates/client/ClientContent.jsx +++ b/src/app/templates/client/ClientContent.jsx @@ -6,7 +6,7 @@ import navigation from '../../../client/state/navigation'; import { openNavigation } from '../../../client/action/navigation'; import Welcome from '../../organisms/welcome/Welcome'; -import { RoomBaseView } from '../../organisms/room/Room'; +import { RoomBaseView } from '../../features/room/Room'; export function ClientContent() { const [roomInfo, setRoomInfo] = useState({ diff --git a/src/app/utils/ASCIILexicalTable.ts b/src/app/utils/ASCIILexicalTable.ts new file mode 100644 index 00000000..61b2481a --- /dev/null +++ b/src/app/utils/ASCIILexicalTable.ts @@ -0,0 +1,393 @@ +export class ASCIILexicalTable { + readonly startCode: number; + + readonly endCode: number; + + readonly maxStrWidth: number; + + private readonly widthToSize: number[]; + + private readonly rangeCount: (i: number, j: number) => number; + + constructor(startCode: number, endCode: number, maxStrWidth: number) { + if (startCode > endCode) { + throw new Error('Invalid ASCII code! startCode is greater than endCode.'); + } + if (startCode < 0 || endCode > 128) { + throw new Error('Invalid ASCII code range!'); + } + + if (maxStrWidth <= 0) { + throw new Error('Invalid max string width!'); + } + + this.maxStrWidth = maxStrWidth; + this.startCode = startCode; + this.endCode = endCode; + + /** + * @param i smaller - inclusive + * @param j larger - inclusive + * @returns number + */ + this.rangeCount = (i: number, j: number): number => j - i + 1; + + this.widthToSize = []; + this.populateWidthToSize(); + + if (this.size() > Number.MAX_SAFE_INTEGER) { + console.warn( + `[!] Warning: ASCIILexicalTable size is larger than the Number.MAX_SAFE_INTEGER: ${this.size()} > ${ + Number.MAX_SAFE_INTEGER + }` + ); + } + } + + private populateWidthToSize() { + const chars = this.rangeCount(this.startCode, this.endCode); + for (let i = 0, count = 0; i < this.maxStrWidth; i += 1) { + count = count * chars + chars; + this.widthToSize[i] = count; + } + } + + private getWidthToSize(width: number): number { + return this.widthToSize[width - 1]; + } + + first(): string { + return String.fromCharCode(this.startCode); + } + + last(): string { + let str = ''; + for (let i = 0; i < this.maxStrWidth; i += 1) { + str += String.fromCharCode(this.endCode); + } + return str; + } + + hasIndex(index: number): boolean { + return index >= 0 && index < this.size(); + } + + has(str: string): boolean { + if (str.length === 0 || str.length > this.maxStrWidth) { + return false; + } + + let charCode: number; + for (let i = 0; i < str.length; i += 1) { + charCode = str.charCodeAt(i); + if (charCode < this.startCode || charCode > this.endCode) { + return false; + } + } + return true; + } + + size(): number { + return this.getWidthToSize(this.maxStrWidth); + } + + index(str: string): number { + if (!this.has(str)) { + return -1; + } + + let index = 0; + const chars = this.rangeCount(this.startCode, this.endCode); + + for (let i = 0; i < this.maxStrWidth; i += 1) { + const code = str.charCodeAt(i); + + if (Number.isNaN(code)) { + return index; + } + + const opStrWidth = this.maxStrWidth - i; + const opStrTableSize = this.getWidthToSize(opStrWidth); + + const segmentSize = opStrTableSize / chars; + + const codeIndex = code - this.startCode; + const emptyCount = i === 0 ? 0 : 1; + + index += segmentSize * codeIndex + emptyCount; + } + + return index; + } + + get(index: number): string | undefined { + if (!this.hasIndex(index)) { + return undefined; + } + + let str = ''; + const chars = this.rangeCount(this.startCode, this.endCode); + + for (let toIndex = index, i = 0; i < this.maxStrWidth; i += 1) { + const opStrWidth = this.maxStrWidth - i; + const opStrTableSize = this.getWidthToSize(opStrWidth); + + const segmentSize = opStrTableSize / chars; + + const segmentIndex = Math.floor(toIndex / segmentSize); + str += String.fromCharCode(this.startCode + segmentIndex); + + toIndex -= segmentIndex * segmentSize; + if (toIndex === 0) { + break; + } + toIndex -= 1; + } + + return str; + } + + previous(str: string): string | undefined { + if (!this.has(str)) return undefined; + let prev = str; + const lastCode = prev.charCodeAt(prev.length - 1); + prev = prev.slice(0, prev.length - 1); + + if (lastCode === this.startCode) { + if (prev.length === 0) return undefined; + return prev; + } + + prev += String.fromCharCode(lastCode - 1); + while (prev.length < this.maxStrWidth) { + prev += String.fromCharCode(this.endCode); + } + return prev; + } + + next(str: string): string | undefined { + if (!this.has(str)) return undefined; + let next = str; + + if (next.length < this.maxStrWidth) { + next += String.fromCharCode(this.startCode); + return next; + } + + for (let i = next.length - 1; i >= 0; i -= 1) { + const lastCode = next.charCodeAt(i); + if (lastCode !== this.endCode) { + next = next.slice(0, i) + String.fromCharCode(lastCode + 1); + return next; + } + next = next.slice(0, i); + } + return undefined; + } + + between(a: string, b: string): string | undefined { + if (!this.has(a) || !this.has(b)) { + return undefined; + } + + const centerIndex = Math.floor((this.index(a) + this.index(b)) / 2); + + const str = this.get(centerIndex); + if (str === a || str === b) return undefined; + return str; + } + + nBetween(n: number, a: string, b: string): string[] | undefined { + if (n <= 0 || !this.has(a) || !this.has(b)) { + return undefined; + } + + const indexA = this.index(a); + const indexB = this.index(b); + + const nBetween = Math.max(indexA, indexB) - Math.min(indexA, indexB); + if (nBetween < n) { + return undefined; + } + const segmentSize = Math.floor(nBetween / (n + 1)); + if (segmentSize === 0) return undefined; + + const items: string[] = []; + + for ( + let segmentIndex = indexA + segmentSize; + segmentIndex < indexB; + segmentIndex += segmentSize + ) { + if (items.length === n) break; + + const str = this.get(segmentIndex); + + if (!str) break; + items.push(str); + } + + if (items.length < n) { + return undefined; + } + + return items; + } +} + +// const printLex = (lex: ASCIILexicalTable) => { +// const padRight = (s: string, maxWidth: number, padding: string): string => { +// let ns = s; +// for (let i = s.length; i < maxWidth; i += 1) { +// ns += padding; +// } +// return ns; +// }; + +// const formattedLine = (n: number, item: string): string => +// `|${padRight(n.toString(), lex.size().toString().length, ' ')}|${item}|`; + +// const hr = `|${padRight('-', lex.size().toString().length, '-')}|${padRight( +// '-', +// lex.maxStrWidth, +// '-' +// )}|`; + +// console.log(`All lexicographic string combination in order.`); +// console.log(`Start ASCII code: "${lex.startCode}"`); +// console.log(`End ASCII code: "${lex.endCode}"`); +// console.log(`Max string width: ${lex.maxStrWidth}`); +// console.log(`Total String Combination Count: ${lex.size()}\n`); +// console.log('Table:'); +// console.log(hr); +// for (let i = 0; i < lex.size(); i += 1) { +// const str = lex.get(i); +// if (str) { +// console.log(formattedLine(i, padRight(str, lex.maxStrWidth, '_'))); +// } +// } +// console.log(hr); +// }; + +// console.log('\n'); + +// const lex = new ASCIILexicalTable('a'.charCodeAt(0), 'c'.charCodeAt(0), 3); +// printLex(lex); +// console.log(lex.size()); +// console.log(lex.nBetween(8, ' ', '~~~~~')); +// console.log(lex.between('a', 'ccc')); +// console.log(lex.get(11)); +// console.log(lex.get(11) === 'aaac'); + +// const lex4 = new ASCIILexicalTable(' '.charCodeAt(0), '~'.charCodeAt(0), 5); +// console.log('Size: ', lex4.size()); +// console.log('Between: ', lex4.between('7g7g5', 'caccc')); +// printLex(lex4); + +// console.log('\n'); + +// const perf = () => { +// const loopLength = 99999; +// const lexT = new ASCIILexicalTable('a'.charCodeAt(0), 'z'.charCodeAt(0), 9); +// console.log(lexT.size()); +// const str = 'bcbba'; +// const strI = lexT.index(str); +// console.log('================'); +// console.time('index'); +// console.log(lexT.index(str)); +// for (let i = 0; i < loopLength; i += 1) { +// lexT.index(str); +// } +// console.timeEnd('index'); +// console.log('================'); +// console.time('get'); +// console.log(lexT.get(strI)); +// for (let i = 0; i < loopLength; i += 1) { +// lexT.get(strI); +// } +// console.timeEnd('get'); +// console.log('================'); +// console.time('previous'); +// console.log(lexT.previous(str)); +// for (let i = 0; i < loopLength; i += 1) { +// lexT.previous(str); +// } +// console.timeEnd('previous'); +// console.log('================'); +// console.time('next'); +// console.log(lexT.next(str)); +// for (let i = 0; i < loopLength; i += 1) { +// lexT.next(str); +// } +// console.timeEnd('next'); +// console.log('================'); +// console.time('between'); +// console.log(lexT.between(str, 'cbbca')); +// for (let i = 0; i < loopLength; i += 1) { +// lexT.between(str, 'cbbca'); +// } +// console.timeEnd('between'); +// }; + +// perf(); + +const findNextFilledKey = ( + fromIndex: number, + keys: Array +): [number, string] | [-1, undefined] => { + for (let j = fromIndex; j < keys.length; j += 1) { + const key = keys[j]; + if (typeof key === 'string') { + return [j, key]; + } + } + + return [-1, undefined]; +}; + +export const orderKeys = ( + lex: ASCIILexicalTable, + keys: Array +): Array | undefined => { + const newKeys: string[] = []; + + for (let i = 0; i < keys.length; ) { + const key = keys[i]; + const collectedKeys: string[] = []; + const [nextKeyIndex, nextKey] = findNextFilledKey(i + 1, keys); + const isKey = typeof key === 'string'; + + if (isKey) { + collectedKeys.push(key); + } + + const keyToGenerateCount = + (nextKeyIndex === -1 ? keys.length : nextKeyIndex) - (key ? i + 1 : i + 0); + + if (keyToGenerateCount > 0) { + const generatedKeys = lex.nBetween( + keyToGenerateCount, + key ?? lex.first(), + nextKey ?? lex.last() + ); + if (generatedKeys) { + collectedKeys.push(...generatedKeys); + } else { + return lex.nBetween(keys?.length, lex.first(), lex.last()); + } + } + + newKeys.push(...collectedKeys); + i += collectedKeys.length; + } + + if (newKeys.length !== keys.length) { + return undefined; + } + + return newKeys; +}; + +// const lex = new ASCIILexicalTable('a'.charCodeAt(0), 'b'.charCodeAt(0), 2); +// const keys = [undefined, undefined]; +// console.log(orderKeys(lex, keys)); diff --git a/src/app/utils/common.ts b/src/app/utils/common.ts index 5cbe3806..6d7b69c1 100644 --- a/src/app/utils/common.ts +++ b/src/app/utils/common.ts @@ -95,3 +95,20 @@ export const trimLeadingSlash = (str: string): string => str.replace(START_SLASH export const trimTrailingSlash = (str: string): string => str.replace(END_SLASHES_REG, ''); export const trimSlash = (str: string): string => trimLeadingSlash(trimTrailingSlash(str)); + +export const nameInitials = (str: string | undefined | null, len = 1): string => { + if (!str) return '�'; + return [...str].slice(0, len).join('') || '�'; +}; + +export const randomStr = (len = 12): string => { + let str = ''; + const minCode = 'A'.charCodeAt(0); + const maxCode = 'Z'.charCodeAt(0); + + for (let i = 0; i < len; i += 1) { + const code = Math.floor(Math.random() * (maxCode - minCode + 1) + minCode); + str += String.fromCharCode(code); + } + return str; +}; diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts index 78aa2521..8ec435d3 100644 --- a/src/app/utils/keyboard.ts +++ b/src/app/utils/keyboard.ts @@ -23,3 +23,10 @@ export const preventScrollWithArrowKey: KeyboardEventHandler = (evt) => { evt.preventDefault(); } }; + +export const onEnterOrSpace = (callback: () => void) => (evt: KeyboardEventLike) => { + if (isKeyHotkey('enter', evt) || isKeyHotkey('space', evt)) { + evt.preventDefault(); + callback(); + } +}; diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 9303c9ac..55e16a95 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -8,10 +8,12 @@ import { MatrixError, MatrixEvent, Room, + RoomMember, UploadProgress, UploadResponse, } from 'matrix-js-sdk'; import { IImageInfo, IThumbnailContent, IVideoInfo } from '../../types/matrix/common'; +import { AccountDataEvent } from '../../types/matrix/accountData'; export const matchMxId = (id: string): RegExpMatchArray | null => id.match(/^([@!$+#])(\S+):(\S+)$/); @@ -37,8 +39,11 @@ export const parseMatrixToUrl = (url: string): [string | undefined, string | und return [g1AsMxId, g3AsVia]; }; -export const getRoomWithCanonicalAlias = (mx: MatrixClient, alias: string): Room | undefined => - mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias); +export const getCanonicalAliasRoomId = (mx: MatrixClient, alias: string): string | undefined => + mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias)?.roomId; + +export const getCanonicalAliasOrRoomId = (mx: MatrixClient, roomId: string): string => + mx.getRoom(roomId)?.getCanonicalAlias() || roomId; export const getImageInfo = (img: HTMLImageElement, fileOrBlob: File | Blob): IImageInfo => { const info: IImageInfo = {}; @@ -162,10 +167,86 @@ export const factoryEventSentBy = (senderId: string) => (ev: MatrixEvent) => export const eventWithShortcode = (ev: MatrixEvent) => typeof ev.getContent().shortcode === 'string'; -export function hasDMWith(mx: MatrixClient, userId: string) { +export const getDMRoomFor = (mx: MatrixClient, userId: string): Room | undefined => { const dmLikeRooms = mx .getRooms() .filter((room) => mx.isRoomEncrypted(room.roomId) && room.getMembers().length <= 2); return dmLikeRooms.find((room) => room.getMember(userId)); -} +}; + +export const guessDmRoomUserId = (room: Room, myUserId: string): string => { + const getOldestMember = (members: RoomMember[]): RoomMember | undefined => { + let oldestMemberTs: number | undefined; + let oldestMember: RoomMember | undefined; + + const pickOldestMember = (member: RoomMember) => { + if (member.userId === myUserId) return; + + if ( + oldestMemberTs === undefined || + (member.events.member && member.events.member.getTs() < oldestMemberTs) + ) { + oldestMember = member; + oldestMemberTs = member.events.member?.getTs(); + } + }; + + members.forEach(pickOldestMember); + + return oldestMember; + }; + + // Pick the joined user who's been here longest (and isn't us), + const member = getOldestMember(room.getJoinedMembers()); + if (member) return member.userId; + + // if there are no joined members other than us, use the oldest member + const member1 = getOldestMember(room.currentState.getMembers()); + return member1?.userId ?? myUserId; +}; + +export const addRoomIdToMDirect = async ( + mx: MatrixClient, + roomId: string, + userId: string +): Promise => { + const mDirectsEvent = mx.getAccountData(AccountDataEvent.Direct); + const userIdToRoomIds: Record = mDirectsEvent?.getContent() ?? {}; + + // remove it from the lists of any others users + // (it can only be a DM room for one person) + Object.keys(userIdToRoomIds).forEach((targetUserId) => { + const roomIds = userIdToRoomIds[targetUserId]; + + if (targetUserId !== userId) { + const indexOfRoomId = roomIds.indexOf(roomId); + if (indexOfRoomId > -1) { + roomIds.splice(indexOfRoomId, 1); + } + } + }); + + const roomIds = userIdToRoomIds[userId] || []; + if (roomIds.indexOf(roomId) === -1) { + roomIds.push(roomId); + } + userIdToRoomIds[userId] = roomIds; + + await mx.setAccountData(AccountDataEvent.Direct, userIdToRoomIds); +}; + +export const removeRoomIdFromMDirect = async (mx: MatrixClient, roomId: string): Promise => { + const mDirectsEvent = mx.getAccountData(AccountDataEvent.Direct); + const userIdToRoomIds: Record = mDirectsEvent?.getContent() ?? {}; + + Object.keys(userIdToRoomIds).forEach((targetUserId) => { + const roomIds = userIdToRoomIds[targetUserId]; + const indexOfRoomId = roomIds.indexOf(roomId); + if (indexOfRoomId > -1) { + roomIds.splice(indexOfRoomId, 1); + } + }); + + await mx.setAccountData(AccountDataEvent.Direct, userIdToRoomIds); +}; diff --git a/src/app/utils/regex.ts b/src/app/utils/regex.ts index 281f1200..d7169062 100644 --- a/src/app/utils/regex.ts +++ b/src/app/utils/regex.ts @@ -1,5 +1,7 @@ export const HTTP_URL_PATTERN = `https?:\\/\\/(?:www\\.)?(?:[^\\s)]*)(?()[\]\\.,;:\s@\\"]+(\.[^<>()[\]\\.,;:\s@\\"]+)*)|(\\".+\\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; @@ -10,3 +12,9 @@ export const VARIATION_SELECTOR_PATTERN = '[\uFE00-\uFE0F]'; // https://github.com/mathiasbynens/emoji-regex export const EMOJI_PATTERN = `[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)`; + +// Thumbs up emoji found to have Variation Selector 16 at the end +// so included variation selector pattern in regex +export const JUMBO_EMOJI_REG = new RegExp( + `^(((${EMOJI_PATTERN})|(:.+?:))(${VARIATION_SELECTOR_PATTERN}|\\s)*){1,10}$` +); diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index a2cb3a9f..750dd6ca 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -76,8 +76,8 @@ export const isSpace = (room: Room | null): boolean => { export const isRoom = (room: Room | null): boolean => { if (!room) return false; const event = getStateEvent(room, StateEvent.RoomCreate); - if (!event) return false; - return event.getContent().type === undefined; + if (!event) return true; + return event.getContent().type !== RoomType.Space; }; export const isUnsupportedRoom = (room: Room | null): boolean => { @@ -88,7 +88,10 @@ export const isUnsupportedRoom = (room: Room | null): boolean => { }; export function isValidChild(mEvent: MatrixEvent): boolean { - return mEvent.getType() === StateEvent.SpaceChild && Object.keys(mEvent.getContent()).length > 0; + return ( + mEvent.getType() === StateEvent.SpaceChild && + Array.isArray(mEvent.getContent<{ via: string[] }>().via) + ); } export const getAllParents = (roomToParents: RoomToParents, roomId: string): Set => { @@ -141,6 +144,15 @@ export const getRoomToParents = (mx: MatrixClient): RoomToParents => { return map; }; +export const getOrphanParents = (roomToParents: RoomToParents, roomId: string): string[] => { + const parents = getAllParents(roomToParents, roomId); + const orphanParents = Array.from(parents).filter( + (parentRoomId) => !roomToParents.has(parentRoomId) + ); + + return orphanParents; +}; + export const isMutedRule = (rule: IPushRule) => rule.actions[0] === 'dont_notify' && rule.conditions?.[0]?.kind === 'event_match'; @@ -167,14 +179,18 @@ export const getNotificationType = (mx: MatrixClient, roomId: string): Notificat return NotificationType.MentionsAndKeywords; }; +const NOTIFICATION_EVENT_TYPES = [ + 'm.room.create', + 'm.room.message', + 'm.room.encrypted', + 'm.room.member', + 'm.sticker', +]; export const isNotificationEvent = (mEvent: MatrixEvent) => { const eType = mEvent.getType(); - if ( - ['m.room.create', 'm.room.message', 'm.room.encrypted', 'm.room.member', 'm.sticker'].find( - (type) => type === eType - ) - ) + if (!NOTIFICATION_EVENT_TYPES.includes(eType)) { return false; + } if (eType === 'm.room.member') return false; if (mEvent.isRedacted()) return false; @@ -183,6 +199,13 @@ export const isNotificationEvent = (mEvent: MatrixEvent) => { return true; }; +export const roomHaveNotification = (room: Room): boolean => { + const total = room.getUnreadNotificationCount(NotificationCountType.Total); + const highlight = room.getUnreadNotificationCount(NotificationCountType.Highlight); + + return total > 0 || highlight > 0; +}; + export const roomHaveUnread = (mx: MatrixClient, room: Room) => { const userId = mx.getUserId(); if (!userId) return false; @@ -218,7 +241,7 @@ export const getUnreadInfos = (mx: MatrixClient): UnreadInfo[] => { if (room.getMyMembership() !== 'join') return unread; if (getNotificationType(mx, room.roomId) === NotificationType.Mute) return unread; - if (roomHaveUnread(mx, room)) { + if (roomHaveNotification(room) || roomHaveUnread(mx, room)) { unread.push(getUnreadInfo(room)); } @@ -247,13 +270,19 @@ export const joinRuleToIconSrc = ( return undefined; }; -export const getRoomAvatarUrl = (mx: MatrixClient, room: Room): string | undefined => { - const url = - room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 32, 32, 'crop', undefined, false) ?? - undefined; - if (url) return url; - return room.getAvatarUrl(mx.baseUrl, 32, 32, 'crop') ?? undefined; -}; +export const getRoomAvatarUrl = ( + mx: MatrixClient, + room: Room, + size: 32 | 96 = 32 +): string | undefined => room.getAvatarUrl(mx.baseUrl, size, size, 'crop') ?? undefined; + +export const getDirectRoomAvatarUrl = ( + mx: MatrixClient, + room: Room, + size: 32 | 96 = 32 +): string | undefined => + room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, size, size, 'crop', undefined, false) ?? + undefined; export const trimReplyFromBody = (body: string): string => { const match = body.match(/^> <.+?> .+\n(>.*\n)*?\n/m); diff --git a/src/app/utils/sort.ts b/src/app/utils/sort.ts new file mode 100644 index 00000000..512c1998 --- /dev/null +++ b/src/app/utils/sort.ts @@ -0,0 +1,59 @@ +import { MatrixClient } from 'matrix-js-sdk'; + +export type SortFunc = (a: T, b: T) => number; + +export const factoryRoomIdByActivity = + (mx: MatrixClient): SortFunc => + (a, b) => { + const room1 = mx.getRoom(a); + const room2 = mx.getRoom(b); + + return ( + (room2?.getLastActiveTimestamp() ?? Number.MIN_SAFE_INTEGER) - + (room1?.getLastActiveTimestamp() ?? Number.MIN_SAFE_INTEGER) + ); + }; + +export const factoryRoomIdByAtoZ = + (mx: MatrixClient): SortFunc => + (a, b) => { + let aName = mx.getRoom(a)?.name ?? ''; + let bName = mx.getRoom(b)?.name ?? ''; + + // remove "#" from the room name + // To ignore it in sorting + aName = aName.replace(/#/g, ''); + bName = bName.replace(/#/g, ''); + + if (aName.toLowerCase() < bName.toLowerCase()) { + return -1; + } + if (aName.toLowerCase() > bName.toLowerCase()) { + return 1; + } + return 0; + }; + +export const factoryRoomIdByUnreadCount = + (getUnreadCount: (roomId: string) => number): SortFunc => + (a, b) => { + const aT = getUnreadCount(a) ?? 0; + const bT = getUnreadCount(b) ?? 0; + return bT - aT; + }; + +export const byTsOldToNew: SortFunc = (a, b) => a - b; + +export const byOrderKey: SortFunc = (a, b) => { + if (!a && !b) { + return 0; + } + + if (!b) return -1; + if (!a) return 1; + + if (a < b) { + return -1; + } + return 1; +}; diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index 4ee78a63..e48e839b 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -45,17 +45,19 @@ export function openSpaceManage(roomId) { }); } -export function openSpaceAddExisting(roomId) { +export function openSpaceAddExisting(roomId, spaces = false) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SPACE_ADDEXISTING, roomId, + spaces, }); } -export function toggleRoomSettings(tabText) { +export function toggleRoomSettings(roomId, tabText) { appDispatcher.dispatch({ type: cons.actions.navigation.TOGGLE_ROOM_SETTINGS, - tabText, + roomId, + tabText }); } diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index e59ce3d7..076d3794 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -1,4 +1,4 @@ -import { openSearch, toggleRoomSettings } from '../action/navigation'; +import { openSearch } from '../action/navigation'; import navigation from '../state/navigation'; import { markAsRead } from '../action/notifications'; @@ -53,10 +53,6 @@ function listenKeyboard(event) { if (navigation.isRawModalVisible) return; if (event.key === 'Escape') { - if (navigation.isRoomSettings) { - toggleRoomSettings(); - return; - } if (navigation.selectedRoomId) { markAsRead(navigation.selectedRoomId); return; diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index 211cf114..835982f8 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -1,7 +1,7 @@ import EventEmitter from 'events'; import * as sdk from 'matrix-js-sdk'; import Olm from '@matrix-org/olm'; -// import { logger } from 'matrix-js-sdk/lib/logger'; +import { logger } from 'matrix-js-sdk/lib/logger'; import { getSecret } from './state/auth'; import RoomList from './state/RoomList'; @@ -13,7 +13,9 @@ import navigation from './state/navigation'; global.Olm = Olm; -// logger.disableAll(); +if (import.meta.env.PROD) { + logger.disableAll(); +} class InitMatrix extends EventEmitter { constructor() { @@ -23,14 +25,20 @@ class InitMatrix extends EventEmitter { } async init() { - if (this.matrixClient) { + if (this.matrixClient || this.initializing) { console.warn('Client is already initialized!') return; } + this.initializing = true; - await this.startClient(); - this.setupSync(); - this.listenEvents(); + try { + await this.startClient(); + this.setupSync(); + this.listenEvents(); + this.initializing = false; + } catch { + this.initializing = false; + } } async startClient() { @@ -62,6 +70,7 @@ class InitMatrix extends EventEmitter { lazyLoadMembers: true, }); this.matrixClient.setGlobalErrorOnUnknownDevices(false); + this.matrixClient.setMaxListeners(50); } setupSync() { diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index 07231cd4..ddac4dda 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -13,7 +13,6 @@ class Navigation extends EventEmitter { this.selectedSpacePath = [cons.tabs.HOME]; this.selectedRoomId = null; - this.isRoomSettings = false; this.recentRooms = []; this.spaceToRoom = new Map(); @@ -85,10 +84,6 @@ class Navigation extends EventEmitter { this.removeRecentRoom(prevSelectedRoomId); this.addRecentRoom(prevSelectedRoomId); this.removeRecentRoom(this.selectedRoomId); - if (this.isRoomSettings && typeof this.selectedRoomId === 'string') { - this.isRoomSettings = !this.isRoomSettings; - this.emit(cons.events.navigation.ROOM_SETTINGS_TOGGLED, this.isRoomSettings); - } this.emit( cons.events.navigation.ROOM_SELECTED, this.selectedRoomId, @@ -305,14 +300,13 @@ class Navigation extends EventEmitter { this.emit(cons.events.navigation.SPACE_MANAGE_OPENED, action.roomId); }, [cons.actions.navigation.OPEN_SPACE_ADDEXISTING]: () => { - this.emit(cons.events.navigation.SPACE_ADDEXISTING_OPENED, action.roomId); + this.emit(cons.events.navigation.SPACE_ADDEXISTING_OPENED, action.roomId, action.spaces); }, [cons.actions.navigation.TOGGLE_ROOM_SETTINGS]: () => { - this.isRoomSettings = !this.isRoomSettings; this.emit( cons.events.navigation.ROOM_SETTINGS_TOGGLED, - this.isRoomSettings, - action.tabText, + action.roomId, + action.tabText ); }, [cons.actions.navigation.OPEN_SHORTCUT_SPACES]: () => { diff --git a/src/index.scss b/src/index.scss index 9dc5b4c3..5290035b 100644 --- a/src/index.scss +++ b/src/index.scss @@ -68,7 +68,7 @@ --tc-danger-low: rgba(240, 71, 71, 60%); --tc-code: #e62498; - --tc-link: hsl(213deg 76% 56%); + --tc-link: hsl(213deg 100% 45%); --tc-tooltip: white; --tc-badge: white; @@ -86,14 +86,14 @@ --ic-danger-normal: rgba(240, 71, 71, 0.7); /* user mxid colors */ - --mx-uc-1: hsl(208, 66%, 53%); - --mx-uc-2: hsl(302, 49%, 45%); - --mx-uc-3: hsl(163, 97%, 36%); - --mx-uc-4: hsl(343, 75%, 61%); - --mx-uc-5: hsl(24, 100%, 59%); - --mx-uc-6: hsl(181, 63%, 47%); - --mx-uc-7: hsl(242, 89%, 65%); - --mx-uc-8: hsl(94, 65%, 50%); + --mx-uc-1: hsl(208, 100%, 45%); + --mx-uc-2: hsl(302, 100%, 30%); + --mx-uc-3: hsl(163, 100%, 30%); + --mx-uc-4: hsl(343, 100%, 45%); + --mx-uc-5: hsl(24, 100%, 45%); + --mx-uc-6: hsl(181, 100%, 30%); + --mx-uc-7: hsl(242, 100%, 45%); + --mx-uc-8: hsl(94, 100%, 35%); /* system icon size | -ic-[size]: value */ --ic-large: 38px; @@ -242,7 +242,7 @@ --tc-primary-low: rgba(255, 255, 255, 0.4); --tc-code: #e565b1; - --tc-link: hsl(213deg 94% 73%); + --tc-link: hsl(213deg 100% 80%); --tc-badge: black; /* system icons | --ic-[background type]-[priority]: value */ @@ -251,17 +251,14 @@ --ic-surface-low: rgba(255, 255, 255, 64%); --ic-primary-normal: #ffffff; - & .text { - /* override user mxid colors for texts */ - --mx-uc-1: hsl(208, 100%, 58%); - --mx-uc-2: hsl(301, 80%, 70%); - --mx-uc-3: hsl(163, 93%, 41%); - --mx-uc-4: hsl(343, 91%, 66%); - --mx-uc-5: hsl(24, 90%, 67%); - --mx-uc-6: hsl(181, 90%, 50%); - --mx-uc-7: hsl(243, 100%, 74%); - --mx-uc-8: hsl(94, 66%, 50%); - } + --mx-uc-1: hsl(208, 100%, 75%); + --mx-uc-2: hsl(301, 100%, 80%); + --mx-uc-3: hsl(163, 100%, 70%); + --mx-uc-4: hsl(343, 100%, 75%); + --mx-uc-5: hsl(24, 100%, 70%); + --mx-uc-6: hsl(181, 100%, 60%); + --mx-uc-7: hsl(243, 100%, 80%); + --mx-uc-8: hsl(94, 100%, 80%); /* shadow and overlay */ --bg-overlay: rgba(0, 0, 0, 60%); @@ -402,6 +399,7 @@ textarea { margin: 0; padding: 0; background-color: transparent; + color: inherit; font-family: inherit; font-size: inherit; font-weight: inherit; diff --git a/src/types/matrix/room.ts b/src/types/matrix/room.ts index 33419ce5..c468309d 100644 --- a/src/types/matrix/room.ts +++ b/src/types/matrix/room.ts @@ -49,6 +49,12 @@ export enum RoomType { Space = 'm.space', } +export type MSpaceChildContent = { + via: string[]; + suggested?: boolean; + order?: string; +}; + export enum NotificationType { Default = 'default', AllMessages = 'all_messages', @@ -67,15 +73,15 @@ export type IRoomCreateContent = { }; }; +export type GetContentCallback = () => T; + export type RoomToParents = Map>; -export type RoomToUnread = Map< - string, - { - total: number; - highlight: number; - from: Set | null; - } ->; +export type Unread = { + total: number; + highlight: number; + from: Set | null; +}; +export type RoomToUnread = Map; export type UnreadInfo = { roomId: string; total: number; diff --git a/vite.config.js b/vite.config.js index 97f40500..1255f81c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -45,6 +45,12 @@ export default defineConfig({ server: { port: 8080, host: true, + proxy: { + "^\\/.*?\\/olm\\.wasm$": { + target: 'http://localhost:8080', + rewrite: () => '/olm.wasm' + } + } }, plugins: [ topLevelAwait({ From 6987332ba8142f6b9d25a5017fd7b3c3f0b55af4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:25:07 +1000 Subject: [PATCH 567/824] Bump nginx from 1.26.0-alpine to 1.27.0-alpine (#1759) Bumps nginx from 1.26.0-alpine to 1.27.0-alpine. --- updated-dependencies: - dependency-name: nginx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f843fbf1..d6fffeed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm run build ## App -FROM nginx:1.26.0-alpine +FROM nginx:1.27.0-alpine COPY --from=builder /src/dist /app From 9db4b3a9c2f05138612172b7c8a1d5536f67b15e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:26:21 +1000 Subject: [PATCH 568/824] Bump docker/login-action from 3.1.0 to 3.2.0 (#1758) Bumps [docker/login-action](https://github.com/docker/login-action) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index a203ea34..76ccb7e9 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -72,12 +72,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.3.0 - name: Login to Docker Hub - uses: docker/login-action@v3.1.0 + uses: docker/login-action@v3.2.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to the Container registry - uses: docker/login-action@v3.1.0 + uses: docker/login-action@v3.2.0 with: registry: ghcr.io username: ${{ github.actor }} From 09a0a2d7daa12d1e68f04042fbdeb2c5aa279f25 Mon Sep 17 00:00:00 2001 From: Kimiblock Moe Date: Wed, 5 Jun 2024 20:43:19 +0800 Subject: [PATCH 569/824] Prevent Safari iOS from auto zooming (#1756) Thanks @pixlxip:beeper.com --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 48f8e69e..af2952d3 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - + Cinny From b6157707dbb5064f114bb41e6373cdb1c21189e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 23:28:03 +1000 Subject: [PATCH 570/824] Bump docker/build-push-action from 5.3.0 to 5.4.0 (#1766) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.3.0 to 5.4.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5.3.0...v5.4.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index de29ff35..aa5d1a2b 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.6 - name: Build Docker image - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 76ccb7e9..5afac942 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . platforms: linux/amd64,linux/arm64 From c4615bd2560e247947a977c14b05e59502d0fe55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:55:34 +1000 Subject: [PATCH 571/824] Bump dawidd6/action-download-artifact from 3.1.4 to 6 (#1776) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.1.4 to 6. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/09f2f74827fd3a8607589e5ad7f9398816f540fe...bf251b5aa9c2f7eeb574a96ee720e24f801b7c11) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 66e648b0..72ffed87 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -15,7 +15,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download pr number - uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} @@ -24,7 +24,7 @@ jobs: id: pr run: echo "id=$(> $GITHUB_OUTPUT - name: Download artifact - uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 with: workflow: ${{ github.event.workflow.id }} run_id: ${{ github.event.workflow_run.id }} From 7a3e8dba924d122b5fbd4c375bf4ba1d039dbb95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:00:11 +1000 Subject: [PATCH 572/824] Bump docker/build-push-action from 5.4.0 to 6.0.0 (#1777) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.4.0 to 6.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5.4.0...v6.0.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index aa5d1a2b..3dda9f7b 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.6 - name: Build Docker image - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 5afac942..61451f79 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . platforms: linux/amd64,linux/arm64 From 60e022035f3bbfc09b2b5aee52f83e2aadf054e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:02:12 +1000 Subject: [PATCH 573/824] Bump actions/checkout from 4.1.6 to 4.1.7 (#1775) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.6 to 4.1.7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.6...v4.1.7) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 133729f7..95a9e8ef 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -12,7 +12,7 @@ jobs: PR_NUMBER: ${{github.event.number}} steps: - name: Checkout repository - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 3dda9f7b..a45917ba 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Build Docker image uses: docker/build-push-action@v6.0.0 with: diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index af91698e..410d2f59 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: NPM Lockfile Changes uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 with: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 9252e3e4..5a0ecbca 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Setup node uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 61451f79..227b96c7 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Setup node uses: actions/setup-node@v4.0.2 with: @@ -66,7 +66,7 @@ jobs: packages: write steps: - name: Checkout repository - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx From 4f09e6bbb5a633715937a3b89307dd685229606c Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:57:10 +0530 Subject: [PATCH 574/824] (chore) remove outdated code (#1765) * optimize room typing members hook * remove unused code - WIP * remove old code from initMatrix * remove twemojify function * remove old sanitize util * delete old markdown util * delete Math atom component * uninstall unused dependencies * remove old notification system * decrypt message in inbox notification center and fix refresh in background * improve notification --------- Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com> --- index.html | 6 - package-lock.json | 188 +--- package.json | 6 - src/app/atoms/avatar/Avatar.jsx | 62 +- src/app/atoms/math/Math.jsx | 33 - src/app/atoms/math/Math.scss | 3 - src/app/features/room/RoomInput.tsx | 10 +- src/app/features/room/RoomTimeline.tsx | 30 +- src/app/hooks/useCategorizedSpaces.js | 25 - src/app/hooks/useCommands.ts | 4 +- src/app/hooks/usePreviousValue.ts | 11 + src/app/hooks/useRoomTypingMembers.ts | 24 +- src/app/hooks/useSelectedSpace.js | 21 - src/app/hooks/useSelectedTab.js | 21 - src/app/hooks/useSpaceShortcut.js | 25 - src/app/molecules/dialog/Dialog.jsx | 29 +- .../following-members/FollowingMembers.jsx | 61 -- .../following-members/FollowingMembers.scss | 31 - .../image-lightbox/ImageLightbox.jsx | 47 - .../image-lightbox/ImageLightbox.scss | 50 - src/app/molecules/media/Media.jsx | 366 -------- src/app/molecules/media/Media.scss | 90 -- src/app/molecules/message/Message.jsx | 853 ------------------ src/app/molecules/message/Message.scss | 479 ---------- src/app/molecules/message/TimelineChange.jsx | 78 -- src/app/molecules/message/TimelineChange.scss | 37 - .../people-selector/PeopleSelector.jsx | 16 +- .../molecules/popup-window/PopupWindow.jsx | 66 +- .../room-notification/RoomNotification.jsx | 146 +-- .../molecules/room-options/RoomOptions.jsx | 73 -- .../molecules/room-profile/RoomProfile.jsx | 93 +- src/app/molecules/room-search/RoomSearch.jsx | 201 ----- src/app/molecules/room-search/RoomSearch.scss | 62 -- .../molecules/room-selector/RoomSelector.jsx | 41 +- src/app/molecules/room-tile/RoomTile.jsx | 48 +- .../sidebar-avatar/SidebarAvatar.jsx | 55 -- .../sidebar-avatar/SidebarAvatar.scss | 64 -- .../space-add-existing/SpaceAddExisting.jsx | 15 +- .../molecules/space-options/SpaceOptions.jsx | 128 --- src/app/molecules/sso-buttons/SSOButtons.jsx | 41 - src/app/molecules/sso-buttons/SSOButtons.scss | 25 - src/app/organisms/create-room/CreateRoom.jsx | 154 ++-- src/app/organisms/emoji-board/EmojiBoard.jsx | 356 -------- src/app/organisms/emoji-board/EmojiBoard.scss | 137 --- .../emoji-board/EmojiBoardOpener.jsx | 78 -- src/app/organisms/emoji-board/custom-emoji.js | 127 +-- src/app/organisms/emoji-board/emoji.js | 69 -- src/app/organisms/emoji-board/recent.js | 36 - .../emoji-verification/EmojiVerification.jsx | 48 +- src/app/organisms/invite-list/InviteList.jsx | 145 --- src/app/organisms/invite-list/InviteList.scss | 26 - src/app/organisms/invite-user/InviteUser.jsx | 128 +-- src/app/organisms/join-alias/JoinAlias.jsx | 69 +- src/app/organisms/navigation/Directs.jsx | 71 -- src/app/organisms/navigation/Drawer.jsx | 93 -- src/app/organisms/navigation/Drawer.scss | 56 -- .../organisms/navigation/DrawerBreadcrumb.jsx | 142 --- .../navigation/DrawerBreadcrumb.scss | 66 -- src/app/organisms/navigation/DrawerHeader.jsx | 159 ---- .../organisms/navigation/DrawerHeader.scss | 28 - src/app/organisms/navigation/Home.jsx | 112 --- src/app/organisms/navigation/Navigation.jsx | 16 - src/app/organisms/navigation/Navigation.scss | 7 - .../organisms/navigation/RoomsCategory.jsx | 92 -- .../organisms/navigation/RoomsCategory.scss | 54 -- src/app/organisms/navigation/Selector.jsx | 93 -- src/app/organisms/navigation/SideBar.jsx | 390 -------- src/app/organisms/navigation/SideBar.scss | 75 -- .../profile-editor/ProfileEditor.jsx | 24 +- .../profile-viewer/ProfileViewer.jsx | 165 ++-- .../organisms/public-rooms/PublicRooms.jsx | 295 ------ .../organisms/public-rooms/PublicRooms.scss | 85 -- src/app/organisms/pw/Dialogs.jsx | 6 - src/app/organisms/pw/Windows.jsx | 28 - .../organisms/read-receipts/ReadReceipts.jsx | 76 -- src/app/organisms/room/EventLimit.js | 35 - src/app/organisms/room/PeopleDrawer.jsx | 215 ----- src/app/organisms/room/PeopleDrawer.scss | 93 -- src/app/organisms/room/Room.scss | 20 - src/app/organisms/room/RoomSettings.jsx | 3 +- src/app/organisms/room/RoomView.scss | 46 - src/app/organisms/room/RoomViewCmdBar.jsx | 297 ------ src/app/organisms/room/RoomViewCmdBar.scss | 57 -- src/app/organisms/room/RoomViewContent.jsx | 644 ------------- src/app/organisms/room/RoomViewContent.scss | 30 - src/app/organisms/room/RoomViewFloating.jsx | 125 --- src/app/organisms/room/RoomViewFloating.scss | 125 --- src/app/organisms/room/RoomViewHeader.jsx | 132 --- src/app/organisms/room/RoomViewHeader.scss | 47 - src/app/organisms/room/RoomViewInput.jsx | 491 ---------- src/app/organisms/room/RoomViewInput.scss | 108 --- src/app/organisms/room/TimelineScroll.js | 136 --- src/app/organisms/room/commands.jsx | 220 ----- src/app/organisms/room/commands.scss | 10 - src/app/organisms/room/common.jsx | 222 ----- src/app/organisms/search/Search.jsx | 31 +- src/app/organisms/settings/CrossSigning.jsx | 109 ++- src/app/organisms/settings/KeyBackup.jsx | 93 +- .../shortcut-spaces/ShortcutSpaces.jsx | 169 ---- .../shortcut-spaces/ShortcutSpaces.scss | 52 -- .../organisms/space-manage/SpaceManage.jsx | 433 --------- .../organisms/space-manage/SpaceManage.scss | 168 ---- .../space-settings/SpaceSettings.jsx | 9 +- .../organisms/sticker-board/StickerBoard.jsx | 115 --- .../organisms/sticker-board/StickerBoard.scss | 74 -- src/app/organisms/view-source/ViewSource.jsx | 73 -- src/app/organisms/view-source/ViewSource.scss | 19 - src/app/organisms/welcome/Welcome.jsx | 20 - src/app/organisms/welcome/Welcome.scss | 23 - src/app/pages/Router.tsx | 21 +- src/app/pages/client/ClientNonUIFeatures.tsx | 231 +++++ src/app/pages/client/ClientRoot.tsx | 2 - src/app/pages/client/inbox/Notifications.tsx | 88 +- src/app/state/room/roomToUnread.ts | 2 +- src/app/state/typingMembers.ts | 6 - src/app/templates/auth/Auth.jsx | 684 -------------- src/app/templates/auth/Auth.scss | 173 ---- src/app/templates/client/Client.jsx | 68 -- src/app/templates/client/Client.scss | 57 -- src/app/templates/client/ClientContent.jsx | 49 - src/app/utils/disposable.ts | 20 +- src/app/utils/dom.ts | 6 + src/client/action/accountData.js | 41 - src/client/action/auth.js | 104 --- src/client/action/auth.ts | 13 + src/client/action/navigation.js | 87 -- src/client/action/notifications.js | 1 - src/client/action/room.js | 32 +- src/client/action/roomTimeline.js | 34 - src/client/event/hotkeys.js | 59 -- src/client/event/roomList.js | 38 - src/client/initMatrix.js | 19 - src/client/state/AccountData.js | 144 --- src/client/state/Notifications.js | 412 --------- src/client/state/RoomList.js | 383 -------- src/client/state/RoomTimeline.js | 407 --------- src/client/state/RoomsHierarchy.js | 49 - src/client/state/RoomsInput.js | 423 --------- src/client/state/cons.js | 71 -- src/client/state/navigation.js | 318 ------- src/util/Postie.js | 97 -- src/util/colorMXID.js | 2 +- src/util/markdown.js | 515 ----------- src/util/matrixUtil.js | 14 - src/util/mimetypes.js | 39 - src/util/sanitize.js | 140 --- src/util/twemojify.jsx | 31 - 147 files changed, 1164 insertions(+), 15330 deletions(-) delete mode 100644 src/app/atoms/math/Math.jsx delete mode 100644 src/app/atoms/math/Math.scss delete mode 100644 src/app/hooks/useCategorizedSpaces.js create mode 100644 src/app/hooks/usePreviousValue.ts delete mode 100644 src/app/hooks/useSelectedSpace.js delete mode 100644 src/app/hooks/useSelectedTab.js delete mode 100644 src/app/hooks/useSpaceShortcut.js delete mode 100644 src/app/molecules/following-members/FollowingMembers.jsx delete mode 100644 src/app/molecules/following-members/FollowingMembers.scss delete mode 100644 src/app/molecules/image-lightbox/ImageLightbox.jsx delete mode 100644 src/app/molecules/image-lightbox/ImageLightbox.scss delete mode 100644 src/app/molecules/media/Media.jsx delete mode 100644 src/app/molecules/media/Media.scss delete mode 100644 src/app/molecules/message/Message.jsx delete mode 100644 src/app/molecules/message/Message.scss delete mode 100644 src/app/molecules/message/TimelineChange.jsx delete mode 100644 src/app/molecules/message/TimelineChange.scss delete mode 100644 src/app/molecules/room-options/RoomOptions.jsx delete mode 100644 src/app/molecules/room-search/RoomSearch.jsx delete mode 100644 src/app/molecules/room-search/RoomSearch.scss delete mode 100644 src/app/molecules/sidebar-avatar/SidebarAvatar.jsx delete mode 100644 src/app/molecules/sidebar-avatar/SidebarAvatar.scss delete mode 100644 src/app/molecules/space-options/SpaceOptions.jsx delete mode 100644 src/app/molecules/sso-buttons/SSOButtons.jsx delete mode 100644 src/app/molecules/sso-buttons/SSOButtons.scss delete mode 100644 src/app/organisms/emoji-board/EmojiBoard.jsx delete mode 100644 src/app/organisms/emoji-board/EmojiBoard.scss delete mode 100644 src/app/organisms/emoji-board/EmojiBoardOpener.jsx delete mode 100644 src/app/organisms/emoji-board/emoji.js delete mode 100644 src/app/organisms/emoji-board/recent.js delete mode 100644 src/app/organisms/invite-list/InviteList.jsx delete mode 100644 src/app/organisms/invite-list/InviteList.scss delete mode 100644 src/app/organisms/navigation/Directs.jsx delete mode 100644 src/app/organisms/navigation/Drawer.jsx delete mode 100644 src/app/organisms/navigation/Drawer.scss delete mode 100644 src/app/organisms/navigation/DrawerBreadcrumb.jsx delete mode 100644 src/app/organisms/navigation/DrawerBreadcrumb.scss delete mode 100644 src/app/organisms/navigation/DrawerHeader.jsx delete mode 100644 src/app/organisms/navigation/DrawerHeader.scss delete mode 100644 src/app/organisms/navigation/Home.jsx delete mode 100644 src/app/organisms/navigation/Navigation.jsx delete mode 100644 src/app/organisms/navigation/Navigation.scss delete mode 100644 src/app/organisms/navigation/RoomsCategory.jsx delete mode 100644 src/app/organisms/navigation/RoomsCategory.scss delete mode 100644 src/app/organisms/navigation/Selector.jsx delete mode 100644 src/app/organisms/navigation/SideBar.jsx delete mode 100644 src/app/organisms/navigation/SideBar.scss delete mode 100644 src/app/organisms/public-rooms/PublicRooms.jsx delete mode 100644 src/app/organisms/public-rooms/PublicRooms.scss delete mode 100644 src/app/organisms/read-receipts/ReadReceipts.jsx delete mode 100644 src/app/organisms/room/EventLimit.js delete mode 100644 src/app/organisms/room/PeopleDrawer.jsx delete mode 100644 src/app/organisms/room/PeopleDrawer.scss delete mode 100644 src/app/organisms/room/Room.scss delete mode 100644 src/app/organisms/room/RoomView.scss delete mode 100644 src/app/organisms/room/RoomViewCmdBar.jsx delete mode 100644 src/app/organisms/room/RoomViewCmdBar.scss delete mode 100644 src/app/organisms/room/RoomViewContent.jsx delete mode 100644 src/app/organisms/room/RoomViewContent.scss delete mode 100644 src/app/organisms/room/RoomViewFloating.jsx delete mode 100644 src/app/organisms/room/RoomViewFloating.scss delete mode 100644 src/app/organisms/room/RoomViewHeader.jsx delete mode 100644 src/app/organisms/room/RoomViewHeader.scss delete mode 100644 src/app/organisms/room/RoomViewInput.jsx delete mode 100644 src/app/organisms/room/RoomViewInput.scss delete mode 100644 src/app/organisms/room/TimelineScroll.js delete mode 100644 src/app/organisms/room/commands.jsx delete mode 100644 src/app/organisms/room/commands.scss delete mode 100644 src/app/organisms/room/common.jsx delete mode 100644 src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx delete mode 100644 src/app/organisms/shortcut-spaces/ShortcutSpaces.scss delete mode 100644 src/app/organisms/space-manage/SpaceManage.jsx delete mode 100644 src/app/organisms/space-manage/SpaceManage.scss delete mode 100644 src/app/organisms/sticker-board/StickerBoard.jsx delete mode 100644 src/app/organisms/sticker-board/StickerBoard.scss delete mode 100644 src/app/organisms/view-source/ViewSource.jsx delete mode 100644 src/app/organisms/view-source/ViewSource.scss delete mode 100644 src/app/organisms/welcome/Welcome.jsx delete mode 100644 src/app/organisms/welcome/Welcome.scss create mode 100644 src/app/pages/client/ClientNonUIFeatures.tsx delete mode 100644 src/app/templates/auth/Auth.jsx delete mode 100644 src/app/templates/auth/Auth.scss delete mode 100644 src/app/templates/client/Client.jsx delete mode 100644 src/app/templates/client/Client.scss delete mode 100644 src/app/templates/client/ClientContent.jsx delete mode 100644 src/client/action/accountData.js delete mode 100644 src/client/action/auth.js create mode 100644 src/client/action/auth.ts delete mode 100644 src/client/action/roomTimeline.js delete mode 100644 src/client/event/roomList.js delete mode 100644 src/client/state/AccountData.js delete mode 100644 src/client/state/Notifications.js delete mode 100644 src/client/state/RoomList.js delete mode 100644 src/client/state/RoomTimeline.js delete mode 100644 src/client/state/RoomsHierarchy.js delete mode 100644 src/client/state/RoomsInput.js delete mode 100644 src/util/Postie.js delete mode 100644 src/util/markdown.js delete mode 100644 src/util/mimetypes.js delete mode 100644 src/util/sanitize.js delete mode 100644 src/util/twemojify.jsx diff --git a/index.html b/index.html index af2952d3..9196cf3d 100644 --- a/index.html +++ b/index.html @@ -90,12 +90,6 @@ window.global ||= window;
    - - diff --git a/package-lock.json b/package-lock.json index 17e4dd50..ab70f0fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", - "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", @@ -41,8 +40,6 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "katex": "0.16.10", - "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", "matrix-js-sdk": "29.1.0", @@ -54,8 +51,6 @@ "react-aria": "3.29.1", "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", "react-dom": "18.2.0", "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", @@ -67,7 +62,6 @@ "slate-history": "0.93.0", "slate-react": "0.98.4", "tippy.js": "6.3.7", - "twemoji": "14.0.2", "ua-parser-js": "1.0.35" }, "devDependencies": { @@ -1109,18 +1103,6 @@ "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" }, - "node_modules/@khanacademy/simple-markdown": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", - "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", - "dependencies": { - "@types/react": ">=16.0.0" - }, - "peerDependencies": { - "react": "16.14.0", - "react-dom": "16.14.0" - } - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -1942,21 +1924,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" - }, "node_modules/@react-stately/calendar": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.1.tgz", @@ -3307,12 +3274,14 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true }, "node_modules/@types/react": { "version": "18.2.39", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3354,7 +3323,8 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true }, "node_modules/@types/semver": { "version": "7.3.13", @@ -4419,14 +4389,6 @@ "color-support": "bin.js" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -4723,16 +4685,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5559,7 +5511,8 @@ "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==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.2.12", @@ -5796,27 +5749,6 @@ "react": ">=16.8.0" } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -6060,7 +5992,8 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -6749,17 +6682,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", - "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", - "dependencies": { - "universalify": "^0.1.2" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -6778,21 +6700,6 @@ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" }, - "node_modules/katex": { - "version": "0.16.10", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", - "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -6854,14 +6761,6 @@ "node": ">= 4.0.0" } }, - "node_modules/linkify-html": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.0.2.tgz", - "integrity": "sha512-YcN3tsyutK2Y/uSuoG0zne8FQdoqzrAgNU5ko0DWE7M2oQ3ms4z/202f2W4TvRm9uxKdrsWAullfynANLaVMqw==", - "peerDependencies": { - "linkifyjs": "^4.0.0" - } - }, "node_modules/linkify-react": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.1.tgz", @@ -7766,43 +7665,6 @@ "react": ">=15" } }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -7950,14 +7812,6 @@ "node": ">=8.10.0" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -8711,22 +8565,6 @@ "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/twemoji": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", - "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==", - "dependencies": { - "fs-extra": "^8.0.1", - "jsonfile": "^5.0.0", - "twemoji-parser": "14.0.0", - "universalify": "^0.1.2" - } - }, - "node_modules/twemoji-parser": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz", - "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8875,14 +8713,6 @@ "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" }, - "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==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", diff --git a/package.json b/package.json index e626e837..a4bf6f34 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", - "@khanacademy/simple-markdown": "0.8.6", "@matrix-org/olm": "3.2.14", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", @@ -52,8 +51,6 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "katex": "0.16.10", - "linkify-html": "4.0.2", "linkify-react": "4.1.1", "linkifyjs": "4.0.2", "matrix-js-sdk": "29.1.0", @@ -65,8 +62,6 @@ "react-aria": "3.29.1", "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", "react-dom": "18.2.0", "react-error-boundary": "4.0.10", "react-google-recaptcha": "2.1.0", @@ -78,7 +73,6 @@ "slate-history": "0.93.0", "slate-react": "0.98.4", "tippy.js": "6.3.7", - "twemoji": "14.0.2", "ua-parser-js": "1.0.35" }, "devDependencies": { diff --git a/src/app/atoms/avatar/Avatar.jsx b/src/app/atoms/avatar/Avatar.jsx index fc46c250..27bf7c90 100644 --- a/src/app/atoms/avatar/Avatar.jsx +++ b/src/app/atoms/avatar/Avatar.jsx @@ -2,17 +2,13 @@ import React from 'react'; import PropTypes from 'prop-types'; import './Avatar.scss'; -import { twemojify } from '../../../util/twemojify'; - import Text from '../text/Text'; import RawIcon from '../system-icons/RawIcon'; import ImageBrokenSVG from '../../../../public/res/svg/image-broken.svg'; import { avatarInitials } from '../../../util/common'; -const Avatar = React.forwardRef(({ - text, bgColor, iconSrc, iconColor, imageSrc, size, -}, ref) => { +const Avatar = React.forwardRef(({ text, bgColor, iconSrc, iconColor, imageSrc, size }, ref) => { let textSize = 's1'; if (size === 'large') textSize = 'h1'; if (size === 'small') textSize = 'b1'; @@ -20,34 +16,34 @@ const Avatar = React.forwardRef(({ return (
    - { - imageSrc !== null - ? ( - { e.target.style.backgroundColor = 'transparent'; }} - onError={(e) => { e.target.src = ImageBrokenSVG; }} - alt="" - /> - ) - : ( - - { - iconSrc !== null - ? - : text !== null && ( - - {twemojify(avatarInitials(text))} - - ) - } - - ) - } + {imageSrc !== null ? ( + { + e.target.style.backgroundColor = 'transparent'; + }} + onError={(e) => { + e.target.src = ImageBrokenSVG; + }} + alt="" + /> + ) : ( + + {iconSrc !== null ? ( + + ) : ( + text !== null && ( + + {avatarInitials(text)} + + ) + )} + + )}
    ); }); diff --git a/src/app/atoms/math/Math.jsx b/src/app/atoms/math/Math.jsx deleted file mode 100644 index ab52a478..00000000 --- a/src/app/atoms/math/Math.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './Math.scss'; - -import katex from 'katex'; -import 'katex/dist/katex.min.css'; - -import 'katex/dist/contrib/copy-tex'; - -const Math = React.memo(({ - content, throwOnError, errorColor, displayMode, -}) => { - const ref = useRef(null); - - useEffect(() => { - katex.render(content, ref.current, { throwOnError, errorColor, displayMode }); - }, [content, throwOnError, errorColor, displayMode]); - - return ; -}); -Math.defaultProps = { - throwOnError: null, - errorColor: null, - displayMode: null, -}; -Math.propTypes = { - content: PropTypes.string.isRequired, - throwOnError: PropTypes.bool, - errorColor: PropTypes.string, - displayMode: PropTypes.bool, -}; - -export default Math; diff --git a/src/app/atoms/math/Math.scss b/src/app/atoms/math/Math.scss deleted file mode 100644 index 306b147c..00000000 --- a/src/app/atoms/math/Math.scss +++ /dev/null @@ -1,3 +0,0 @@ -.katex-display { - margin: 0 !important; -} diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 6f9a2495..2728a54c 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -8,7 +8,7 @@ import React, { useRef, useState, } from 'react'; -import { useAtom } from 'jotai'; +import { useAtom, useAtomValue } from 'jotai'; import { isKeyHotkey } from 'is-hotkey'; import { EventType, IContent, MsgType, Room } from 'matrix-js-sdk'; import { ReactEditor } from 'slate-react'; @@ -56,7 +56,6 @@ import { } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; -import initMatrix from '../../../client/initMatrix'; import { TUploadContent, encryptFile, getImageInfo, getMxIdLocalPart } from '../../utils/matrix'; import { useTypingStatusUpdater } from '../../hooks/useTypingStatusUpdater'; import { useFilePicker } from '../../hooks/useFilePicker'; @@ -95,6 +94,7 @@ import { } from './msgContent'; import colorMXID from '../../../util/colorMXID'; import { + getAllParents, getMemberDisplayName, parseReplyBody, parseReplyFormattedBody, @@ -107,6 +107,7 @@ import { Command, SHRUG, useCommands } from '../../hooks/useCommands'; import { mobileOrTablet } from '../../utils/user-agent'; import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; import { ReplyLayout } from '../../components/message'; +import { roomToParentsAtom } from '../../state/room/roomToParents'; interface RoomInputProps { editor: Editor; @@ -121,6 +122,7 @@ export const RoomInput = forwardRef( const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const commands = useCommands(mx, room); const emojiBtnRef = useRef(null); + const roomToParents = useAtomValue(roomToParentsAtom); const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(roomId)); const [replyDraft, setReplyDraft] = useAtom(roomIdToReplyDraftAtomFamily(roomId)); @@ -133,13 +135,13 @@ export const RoomInput = forwardRef( const uploadBoardHandlers = useRef(); const imagePackRooms: Room[] = useMemo(() => { - const allParentSpaces = [roomId, ...(initMatrix.roomList?.getAllParentSpaces(roomId) ?? [])]; + const allParentSpaces = [roomId].concat(Array.from(getAllParents(roomToParents, roomId))); return allParentSpaces.reduce((list, rId) => { const r = mx.getRoom(rId); if (r) list.push(r); return list; }, []); - }, [mx, roomId]); + }, [mx, roomId, roomToParents]); const [toolbar, setToolbar] = useSetting(settingsAtom, 'editorToolbar'); const [autocompleteQuery, setAutocompleteQuery] = diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 29b874fc..14cdb56e 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -28,7 +28,7 @@ import classNames from 'classnames'; import { ReactEditor } from 'slate-react'; import { Editor } from 'slate'; import to from 'await-to-js'; -import { useSetAtom } from 'jotai'; +import { useAtomValue, useSetAtom } from 'jotai'; import { Badge, Box, @@ -74,6 +74,7 @@ import { getReactCustomHtmlParser } from '../../plugins/react-custom-html-parser import { canEditEvent, decryptAllTimelineEvent, + getAllParents, getEditedEvent, getEventReactions, getLatestEditableEvt, @@ -103,14 +104,15 @@ import { createMentionElement, isEmptyEditor, moveCursor } from '../../component import { roomIdToReplyDraftAtomFamily } from '../../state/room/roomInputDrafts'; import { usePowerLevelsAPI, usePowerLevelsContext } from '../../hooks/usePowerLevels'; import { GetContentCallback, MessageEvent, StateEvent } from '../../../types/matrix/room'; -import initMatrix from '../../../client/initMatrix'; import { useKeyDown } from '../../hooks/useKeyDown'; -import cons from '../../../client/state/cons'; import { useDocumentFocusChange } from '../../hooks/useDocumentFocusChange'; import { RenderMessageContent } from '../../components/RenderMessageContent'; import { Image } from '../../components/media'; import { ImageViewer } from '../../components/image-viewer'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { roomToParentsAtom } from '../../state/room/roomToParents'; +import { useRoomUnread } from '../../state/hooks/unread'; +import { roomToUnreadAtom } from '../../state/room/roomToUnread'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -444,18 +446,19 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const canSendReaction = canSendEvent(MessageEvent.Reaction, myPowerLevel); const [editId, setEditId] = useState(); const { navigateRoom, navigateSpace } = useRoomNavigate(); + const roomToParents = useAtomValue(roomToParentsAtom); + const unread = useRoomUnread(room.roomId, roomToUnreadAtom); const imagePackRooms: Room[] = useMemo(() => { - const allParentSpaces = [ - room.roomId, - ...(initMatrix.roomList?.getAllParentSpaces(room.roomId) ?? []), - ]; + const allParentSpaces = [room.roomId].concat( + Array.from(getAllParents(roomToParents, room.roomId)) + ); return allParentSpaces.reduce((list, rId) => { const r = mx.getRoom(rId); if (r) list.push(r); return list; }, []); - }, [mx, room]); + }, [mx, room, roomToParents]); const [unreadInfo, setUnreadInfo] = useState(() => getRoomUnreadInfo(room, true)); const readUptoEventIdRef = useRef(); @@ -794,15 +797,10 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli // Remove unreadInfo on mark as read useEffect(() => { - const handleFullRead = (rId: string) => { - if (rId !== room.roomId) return; + if (!unread) { setUnreadInfo(undefined); - }; - initMatrix.notifications?.on(cons.events.notifications.FULL_READ, handleFullRead); - return () => { - initMatrix.notifications?.removeListener(cons.events.notifications.FULL_READ, handleFullRead); - }; - }, [room]); + } + }, [unread]); // scroll out of view msg editor in view. useEffect(() => { diff --git a/src/app/hooks/useCategorizedSpaces.js b/src/app/hooks/useCategorizedSpaces.js deleted file mode 100644 index 6d3c02af..00000000 --- a/src/app/hooks/useCategorizedSpaces.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import { useState, useEffect } from 'react'; - -import initMatrix from '../../client/initMatrix'; -import cons from '../../client/state/cons'; - -export function useCategorizedSpaces() { - const { accountData } = initMatrix; - const [categorizedSpaces, setCategorizedSpaces] = useState([...accountData.categorizedSpaces]); - - useEffect(() => { - const handleCategorizedSpaces = () => { - setCategorizedSpaces([...accountData.categorizedSpaces]); - }; - accountData.on(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, handleCategorizedSpaces); - return () => { - accountData.removeListener( - cons.events.accountData.CATEGORIZE_SPACE_UPDATED, - handleCategorizedSpaces, - ); - }; - }, []); - - return [categorizedSpaces]; -} diff --git a/src/app/hooks/useCommands.ts b/src/app/hooks/useCommands.ts index aadbf534..3c829514 100644 --- a/src/app/hooks/useCommands.ts +++ b/src/app/hooks/useCommands.ts @@ -114,12 +114,12 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Leave current room.', exe: async (payload) => { if (payload.trim() === '') { - roomActions.leave(room.roomId); + mx.leave(room.roomId); return; } const rawIds = payload.split(' '); const roomIds = rawIds.filter((id) => isRoomId(id)); - roomIds.map((id) => roomActions.leave(id)); + roomIds.map((id) => mx.leave(id)); }, }, [Command.Invite]: { diff --git a/src/app/hooks/usePreviousValue.ts b/src/app/hooks/usePreviousValue.ts new file mode 100644 index 00000000..01b4850d --- /dev/null +++ b/src/app/hooks/usePreviousValue.ts @@ -0,0 +1,11 @@ +import { useEffect, useRef } from 'react'; + +export const usePreviousValue = (currentValue: T, initialValue: T) => { + const valueRef = useRef(initialValue); + + useEffect(() => { + valueRef.current = currentValue; + }, [currentValue]); + + return valueRef.current; +}; diff --git a/src/app/hooks/useRoomTypingMembers.ts b/src/app/hooks/useRoomTypingMembers.ts index 5f24fb5d..f526cbf1 100644 --- a/src/app/hooks/useRoomTypingMembers.ts +++ b/src/app/hooks/useRoomTypingMembers.ts @@ -1,10 +1,26 @@ import { useAtomValue } from 'jotai'; -import { useMemo } from 'react'; -import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../state/typingMembers'; +import { selectAtom } from 'jotai/utils'; +import { useCallback } from 'react'; +import { + IRoomIdToTypingMembers, + TypingReceipt, + roomIdToTypingMembersAtom, +} from '../state/typingMembers'; + +const typingReceiptEqual = (a: TypingReceipt, b: TypingReceipt): boolean => + a.userId === b.userId && a.ts === b.ts; + +const equalTypingMembers = (x: TypingReceipt[], y: TypingReceipt[]): boolean => { + if (x.length !== y.length) return false; + return x.every((a, i) => typingReceiptEqual(a, y[i])); +}; export const useRoomTypingMember = (roomId: string) => { - const typing = useAtomValue( - useMemo(() => selectRoomTypingMembersAtom(roomId, roomIdToTypingMembersAtom), [roomId]) + const selector = useCallback( + (roomToTyping: IRoomIdToTypingMembers) => roomToTyping.get(roomId) ?? [], + [roomId] ); + + const typing = useAtomValue(selectAtom(roomIdToTypingMembersAtom, selector, equalTypingMembers)); return typing; }; diff --git a/src/app/hooks/useSelectedSpace.js b/src/app/hooks/useSelectedSpace.js deleted file mode 100644 index 535c5dcd..00000000 --- a/src/app/hooks/useSelectedSpace.js +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import { useState, useEffect } from 'react'; - -import cons from '../../client/state/cons'; -import navigation from '../../client/state/navigation'; - -export function useSelectedSpace() { - const [spaceId, setSpaceId] = useState(navigation.selectedSpaceId); - - useEffect(() => { - const onSpaceSelected = (roomId) => { - setSpaceId(roomId); - }; - navigation.on(cons.events.navigation.SPACE_SELECTED, onSpaceSelected); - return () => { - navigation.removeListener(cons.events.navigation.SPACE_SELECTED, onSpaceSelected); - }; - }, []); - - return [spaceId]; -} diff --git a/src/app/hooks/useSelectedTab.js b/src/app/hooks/useSelectedTab.js deleted file mode 100644 index 33b76a81..00000000 --- a/src/app/hooks/useSelectedTab.js +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import { useState, useEffect } from 'react'; - -import cons from '../../client/state/cons'; -import navigation from '../../client/state/navigation'; - -export function useSelectedTab() { - const [selectedTab, setSelectedTab] = useState(navigation.selectedTab); - - useEffect(() => { - const onTabSelected = (tabId) => { - setSelectedTab(tabId); - }; - navigation.on(cons.events.navigation.TAB_SELECTED, onTabSelected); - return () => { - navigation.removeListener(cons.events.navigation.TAB_SELECTED, onTabSelected); - }; - }, []); - - return [selectedTab]; -} diff --git a/src/app/hooks/useSpaceShortcut.js b/src/app/hooks/useSpaceShortcut.js deleted file mode 100644 index a1710c60..00000000 --- a/src/app/hooks/useSpaceShortcut.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import { useState, useEffect } from 'react'; - -import initMatrix from '../../client/initMatrix'; -import cons from '../../client/state/cons'; - -export function useSpaceShortcut() { - const { accountData } = initMatrix; - const [spaceShortcut, setSpaceShortcut] = useState([...accountData.spaceShortcut]); - - useEffect(() => { - const onSpaceShortcutUpdated = () => { - setSpaceShortcut([...accountData.spaceShortcut]); - }; - accountData.on(cons.events.accountData.SPACE_SHORTCUT_UPDATED, onSpaceShortcutUpdated); - return () => { - accountData.removeListener( - cons.events.accountData.SPACE_SHORTCUT_UPDATED, - onSpaceShortcutUpdated, - ); - }; - }, []); - - return [spaceShortcut]; -} diff --git a/src/app/molecules/dialog/Dialog.jsx b/src/app/molecules/dialog/Dialog.jsx index 2f29971d..478a0855 100644 --- a/src/app/molecules/dialog/Dialog.jsx +++ b/src/app/molecules/dialog/Dialog.jsx @@ -2,16 +2,21 @@ import React from 'react'; import PropTypes from 'prop-types'; import './Dialog.scss'; -import { twemojify } from '../../../util/twemojify'; - import Text from '../../atoms/text/Text'; import Header, { TitleWrapper } from '../../atoms/header/Header'; import ScrollView from '../../atoms/scroll/ScrollView'; import RawModal from '../../atoms/modal/RawModal'; function Dialog({ - className, isOpen, title, onAfterOpen, onAfterClose, - contentOptions, onRequestClose, closeFromOutside, children, + className, + isOpen, + title, + onAfterOpen, + onAfterClose, + contentOptions, + onRequestClose, + closeFromOutside, + children, invisibleScroll, }) { return ( @@ -28,19 +33,19 @@ function Dialog({
    - { - typeof title === 'string' - ? {twemojify(title)} - : title - } + {typeof title === 'string' ? ( + + {title} + + ) : ( + title + )} {contentOptions}
    -
    - {children} -
    +
    {children}
    diff --git a/src/app/molecules/following-members/FollowingMembers.jsx b/src/app/molecules/following-members/FollowingMembers.jsx deleted file mode 100644 index 949dac76..00000000 --- a/src/app/molecules/following-members/FollowingMembers.jsx +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './FollowingMembers.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import { openReadReceipts } from '../../../client/action/navigation'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; - -import { getUsersActionJsx } from '../../organisms/room/common'; - -function FollowingMembers({ roomTimeline }) { - const [followingMembers, setFollowingMembers] = useState([]); - const { roomId } = roomTimeline; - const mx = initMatrix.matrixClient; - const myUserId = mx.getUserId(); - - useEffect(() => { - const updateFollowingMembers = () => { - setFollowingMembers(roomTimeline.getLiveReaders()); - }; - const updateOnEvent = (event, room) => { - if (room.roomId !== roomId) return; - setFollowingMembers(roomTimeline.getLiveReaders()); - }; - updateFollowingMembers(); - roomTimeline.on(cons.events.roomTimeline.LIVE_RECEIPT, updateFollowingMembers); - mx.on('Room.timeline', updateOnEvent); - return () => { - roomTimeline.removeListener(cons.events.roomTimeline.LIVE_RECEIPT, updateFollowingMembers); - mx.removeListener('Room.timeline', updateOnEvent); - }; - }, [roomTimeline, roomId]); - - const filteredM = followingMembers.filter((userId) => userId !== myUserId); - - return ( - filteredM.length !== 0 && ( - - ) - ); -} - -FollowingMembers.propTypes = { - roomTimeline: PropTypes.shape({}).isRequired, -}; - -export default FollowingMembers; diff --git a/src/app/molecules/following-members/FollowingMembers.scss b/src/app/molecules/following-members/FollowingMembers.scss deleted file mode 100644 index a0daf5ad..00000000 --- a/src/app/molecules/following-members/FollowingMembers.scss +++ /dev/null @@ -1,31 +0,0 @@ -@use '../../partials/text'; - -.following-members { - width: 100%; - padding: 0 var(--sp-normal); - display: flex; - justify-content: flex-end; - align-items: center; - cursor: pointer; - - & .ic-raw { - min-width: var(--ic-extra-small); - opacity: 0.4; - margin: 0 var(--sp-extra-tight); - } - & .text { - @extend .cp-txt__ellipsis; - color: var(--tc-surface-low); - b { - color: var(--tc-surface-normal); - } - } - - &:hover, - &:focus { - background-color: var(--bg-surface-hover); - } - &:active { - background-color: var(--bg-surface-active); - } -} \ No newline at end of file diff --git a/src/app/molecules/image-lightbox/ImageLightbox.jsx b/src/app/molecules/image-lightbox/ImageLightbox.jsx deleted file mode 100644 index c1c45db8..00000000 --- a/src/app/molecules/image-lightbox/ImageLightbox.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './ImageLightbox.scss'; -import FileSaver from 'file-saver'; - -import Text from '../../atoms/text/Text'; -import RawModal from '../../atoms/modal/RawModal'; -import IconButton from '../../atoms/button/IconButton'; - -import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; -import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; - -function ImageLightbox({ - url, alt, isOpen, onRequestClose, -}) { - const handleDownload = () => { - FileSaver.saveAs(url, alt); - }; - - return ( - -
    - {alt} - window.open(url)} size="small" src={ExternalSVG} /> - -
    -
    - {alt} -
    -
    - ); -} - -ImageLightbox.propTypes = { - url: PropTypes.string.isRequired, - alt: PropTypes.string.isRequired, - isOpen: PropTypes.bool.isRequired, - onRequestClose: PropTypes.func.isRequired, -}; - -export default ImageLightbox; diff --git a/src/app/molecules/image-lightbox/ImageLightbox.scss b/src/app/molecules/image-lightbox/ImageLightbox.scss deleted file mode 100644 index 201fc91c..00000000 --- a/src/app/molecules/image-lightbox/ImageLightbox.scss +++ /dev/null @@ -1,50 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/text'; - -.image-lightbox__modal { - box-shadow: none; - width: unset; - gap: var(--sp-normal); - - border-radius: 0; - pointer-events: none; - - & .text { - color: white; - } - & .ic-raw { - background-color: white; - } -} - -.image-lightbox__overlay { - background-color: var(--bg-overlay-low); -} - - -.image-lightbox__header > *, -.image-lightbox__content > * { - pointer-events: all; -} -.image-lightbox__header { - display: flex; - align-items: center; - - & > .text { - @extend .cp-fx__item-one; - @extend .cp-txt__ellipsis; - } -} -.image-lightbox__content { - display: flex; - justify-content: center; - max-height: 80vh; - - & img { - background-color: var(--bg-surface-low); - object-fit: contain; - max-width: 100%; - max-height: 100%; - border-radius: var(--bo-radius); - } -} \ No newline at end of file diff --git a/src/app/molecules/media/Media.jsx b/src/app/molecules/media/Media.jsx deleted file mode 100644 index e2b61775..00000000 --- a/src/app/molecules/media/Media.jsx +++ /dev/null @@ -1,366 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './Media.scss'; - -import encrypt from 'browser-encrypt-attachment'; - -import { BlurhashCanvas } from 'react-blurhash'; -import Text from '../../atoms/text/Text'; -import IconButton from '../../atoms/button/IconButton'; -import Spinner from '../../atoms/spinner/Spinner'; -import ImageLightbox from '../image-lightbox/ImageLightbox'; - -import DownloadSVG from '../../../../public/res/ic/outlined/download.svg'; -import ExternalSVG from '../../../../public/res/ic/outlined/external.svg'; -import PlaySVG from '../../../../public/res/ic/outlined/play.svg'; - -import { getBlobSafeMimeType } from '../../../util/mimetypes'; - -async function getDecryptedBlob(response, type, decryptData) { - const arrayBuffer = await response.arrayBuffer(); - const dataArray = await encrypt.decryptAttachment(arrayBuffer, decryptData); - const blob = new Blob([dataArray], { type: getBlobSafeMimeType(type) }); - return blob; -} - -async function getUrl(link, type, decryptData) { - try { - const response = await fetch(link, { method: 'GET' }); - if (decryptData !== null) { - return URL.createObjectURL(await getDecryptedBlob(response, type, decryptData)); - } - const blob = await response.blob(); - return URL.createObjectURL(blob); - } catch (e) { - return link; - } -} - -function getNativeHeight(width, height, maxWidth = 296) { - const scale = maxWidth / width; - return scale * height; -} - -function FileHeader({ - name, link, external, - file, type, -}) { - const [url, setUrl] = useState(null); - - async function getFile() { - const myUrl = await getUrl(link, type, file); - setUrl(myUrl); - } - - async function handleDownload(e) { - if (file !== null && url === null) { - e.preventDefault(); - await getFile(); - e.target.click(); - } - } - return ( -
    - {name} - { link !== null && ( - <> - { - external && ( - window.open(url || link)} - /> - ) - } - - - - - )} -
    - ); -} -FileHeader.defaultProps = { - external: false, - file: null, - link: null, -}; -FileHeader.propTypes = { - name: PropTypes.string.isRequired, - link: PropTypes.string, - external: PropTypes.bool, - file: PropTypes.shape({}), - type: PropTypes.string.isRequired, -}; - -function File({ - name, link, file, type, -}) { - return ( -
    - -
    - ); -} -File.defaultProps = { - file: null, - type: '', -}; -File.propTypes = { - name: PropTypes.string.isRequired, - link: PropTypes.string.isRequired, - type: PropTypes.string, - file: PropTypes.shape({}), -}; - -function Image({ - name, width, height, link, file, type, blurhash, -}) { - const [url, setUrl] = useState(null); - const [blur, setBlur] = useState(true); - const [lightbox, setLightbox] = useState(false); - - useEffect(() => { - let unmounted = false; - async function fetchUrl() { - const myUrl = await getUrl(link, type, file); - if (unmounted) return; - setUrl(myUrl); - } - fetchUrl(); - return () => { - unmounted = true; - }; - }, []); - - const toggleLightbox = () => { - if (!url) return; - setLightbox(!lightbox); - }; - - return ( - <> -
    -
    - { blurhash && blur && } - { url !== null && ( - setBlur(false)} - src={url || link} - alt={name} - /> - )} -
    -
    - {url && ( - - )} - - ); -} -Image.defaultProps = { - file: null, - width: null, - height: null, - type: '', - blurhash: '', -}; -Image.propTypes = { - name: PropTypes.string.isRequired, - width: PropTypes.number, - height: PropTypes.number, - link: PropTypes.string.isRequired, - file: PropTypes.shape({}), - type: PropTypes.string, - blurhash: PropTypes.string, -}; - -function Sticker({ - name, height, width, link, file, type, -}) { - const [url, setUrl] = useState(null); - - useEffect(() => { - let unmounted = false; - async function fetchUrl() { - const myUrl = await getUrl(link, type, file); - if (unmounted) return; - setUrl(myUrl); - } - fetchUrl(); - return () => { - unmounted = true; - }; - }, []); - - return ( -
    - { url !== null && {name}} -
    - ); -} -Sticker.defaultProps = { - file: null, - type: '', - width: null, - height: null, -}; -Sticker.propTypes = { - name: PropTypes.string.isRequired, - width: PropTypes.number, - height: PropTypes.number, - link: PropTypes.string.isRequired, - file: PropTypes.shape({}), - type: PropTypes.string, -}; - -function Audio({ - name, link, type, file, -}) { - const [isLoading, setIsLoading] = useState(false); - const [url, setUrl] = useState(null); - - async function loadAudio() { - const myUrl = await getUrl(link, type, file); - setUrl(myUrl); - setIsLoading(false); - } - function handlePlayAudio() { - setIsLoading(true); - loadAudio(); - } - - return ( -
    - -
    - { url === null && isLoading && } - { url === null && !isLoading && } - { url !== null && ( - /* eslint-disable-next-line jsx-a11y/media-has-caption */ - - )} -
    -
    - ); -} -Audio.defaultProps = { - file: null, - type: '', -}; -Audio.propTypes = { - name: PropTypes.string.isRequired, - link: PropTypes.string.isRequired, - type: PropTypes.string, - file: PropTypes.shape({}), -}; - -function Video({ - name, link, thumbnail, thumbnailFile, thumbnailType, - width, height, file, type, blurhash, -}) { - const [isLoading, setIsLoading] = useState(false); - const [url, setUrl] = useState(null); - const [thumbUrl, setThumbUrl] = useState(null); - const [blur, setBlur] = useState(true); - - useEffect(() => { - let unmounted = false; - async function fetchUrl() { - const myThumbUrl = await getUrl(thumbnail, thumbnailType, thumbnailFile); - if (unmounted) return; - setThumbUrl(myThumbUrl); - } - if (thumbnail !== null) fetchUrl(); - return () => { - unmounted = true; - }; - }, []); - - const loadVideo = async () => { - const myUrl = await getUrl(link, type, file); - setUrl(myUrl); - setIsLoading(false); - }; - - const handlePlayVideo = () => { - setIsLoading(true); - loadVideo(); - }; - - return ( -
    - -
    - { url === null ? ( - <> - { blurhash && blur && } - { thumbUrl !== null && ( - setBlur(false)} alt={name} /> - )} - {isLoading && } - {!isLoading && } - - ) : ( - /* eslint-disable-next-line jsx-a11y/media-has-caption */ - - )} -
    -
    - ); -} -Video.defaultProps = { - width: null, - height: null, - file: null, - thumbnail: null, - thumbnailType: null, - thumbnailFile: null, - type: '', - blurhash: null, -}; -Video.propTypes = { - name: PropTypes.string.isRequired, - link: PropTypes.string.isRequired, - thumbnail: PropTypes.string, - thumbnailFile: PropTypes.shape({}), - thumbnailType: PropTypes.string, - width: PropTypes.number, - height: PropTypes.number, - file: PropTypes.shape({}), - type: PropTypes.string, - blurhash: PropTypes.string, -}; - -export { - File, Image, Sticker, Audio, Video, -}; diff --git a/src/app/molecules/media/Media.scss b/src/app/molecules/media/Media.scss deleted file mode 100644 index 8d98c428..00000000 --- a/src/app/molecules/media/Media.scss +++ /dev/null @@ -1,90 +0,0 @@ -@use '../../partials/text'; - -.file-header { - display: flex; - align-items: center; - padding: var(--sp-ultra-tight) var(--sp-tight); - min-height: 42px; - - & .file-name { - @extend .cp-txt__ellipsis; - flex: 1; - color: var(--tc-surface-low); - } - - & a { - line-height: 0; - } -} - -.file-container { - --media-max-width: 296px; - - background-color: var(--bg-surface-hover); - border-radius: calc(var(--bo-radius) / 2); - overflow: hidden; - max-width: var(--media-max-width); - white-space: initial; -} - -.sticker-container { - display: inline-flex; - max-width: 128px; - width: 100%; - & img { - width: 100% !important; - } -} - -.image-container, -.video-container, -.audio-container { - font-size: 0; - line-height: 0; - - display: flex; - justify-content: center; - align-items: center; - - background-position: center; - background-repeat: no-repeat; - background-size: cover; -} - -.image-container, -.video-container { - & img, - & canvas { - max-width: unset !important; - width: 100% !important; - height: 100%; - border-radius: 0 !important; - margin: 0 !important; - } -} -.image-container { - max-height: 460px; - img { - cursor: pointer; - object-fit: cover; - } -} - -.video-container { - position: relative; - & .ic-btn-surface { - background-color: var(--bg-surface-low); - } - & .ic-btn-surface, - & .donut-spinner { - position: absolute; - } - video { - width: 100%; - } -} -.audio-container { - audio { - width: 100%; - } -} diff --git a/src/app/molecules/message/Message.jsx b/src/app/molecules/message/Message.jsx deleted file mode 100644 index 26a5b29d..00000000 --- a/src/app/molecules/message/Message.jsx +++ /dev/null @@ -1,853 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { - useState, useEffect, useCallback, useRef, -} from 'react'; -import PropTypes from 'prop-types'; -import './Message.scss'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import { - getUsername, getUsernameOfRoomMember, parseReply, trimHTMLReply, -} from '../../../util/matrixUtil'; -import colorMXID from '../../../util/colorMXID'; -import { getEventCords } from '../../../util/common'; -import { redactEvent, sendReaction } from '../../../client/action/roomTimeline'; -import { - openEmojiBoard, openProfileViewer, openReadReceipts, openViewSource, replyTo, -} from '../../../client/action/navigation'; -import { sanitizeCustomHtml } from '../../../util/sanitize'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Button from '../../atoms/button/Button'; -import Tooltip from '../../atoms/tooltip/Tooltip'; -import Input from '../../atoms/input/Input'; -import Avatar from '../../atoms/avatar/Avatar'; -import IconButton from '../../atoms/button/IconButton'; -import Time from '../../atoms/time/Time'; -import ContextMenu, { MenuHeader, MenuItem, MenuBorder } from '../../atoms/context-menu/ContextMenu'; -import * as Media from '../media/Media'; - -import ReplyArrowIC from '../../../../public/res/ic/outlined/reply-arrow.svg'; -import EmojiAddIC from '../../../../public/res/ic/outlined/emoji-add.svg'; -import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; -import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; -import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; -import CmdIC from '../../../../public/res/ic/outlined/cmd.svg'; -import BinIC from '../../../../public/res/ic/outlined/bin.svg'; - -import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; -import { getBlobSafeMimeType } from '../../../util/mimetypes'; -import { html, plain } from '../../../util/markdown'; - -function PlaceholderMessage() { - return ( -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - ); -} - -const MessageAvatar = React.memo(({ - roomId, avatarSrc, userId, username, -}) => ( -
    - -
    -)); - -const MessageHeader = React.memo(({ - userId, username, timestamp, fullTime, -}) => ( -
    - - {twemojify(username)} - {twemojify(userId)} - -
    - - -
    -
    -)); -MessageHeader.defaultProps = { - fullTime: false, -}; -MessageHeader.propTypes = { - userId: PropTypes.string.isRequired, - username: PropTypes.string.isRequired, - timestamp: PropTypes.number.isRequired, - fullTime: PropTypes.bool, -}; - -function MessageReply({ name, color, body }) { - return ( -
    - - - {twemojify(name)} - {' '} - {twemojify(body)} - -
    - ); -} - -MessageReply.propTypes = { - name: PropTypes.string.isRequired, - color: PropTypes.string.isRequired, - body: PropTypes.string.isRequired, -}; - -const MessageReplyWrapper = React.memo(({ roomTimeline, eventId }) => { - const [reply, setReply] = useState(null); - const isMountedRef = useRef(true); - - useEffect(() => { - const mx = initMatrix.matrixClient; - const timelineSet = roomTimeline.getUnfilteredTimelineSet(); - const loadReply = async () => { - try { - const eTimeline = await mx.getEventTimeline(timelineSet, eventId); - await roomTimeline.decryptAllEventsOfTimeline(eTimeline); - - let mEvent = eTimeline.getTimelineSet().findEventById(eventId); - const editedList = roomTimeline.editedTimeline.get(mEvent.getId()); - if (editedList) { - mEvent = editedList[editedList.length - 1]; - } - - const rawBody = mEvent.getContent().body; - const username = getUsernameOfRoomMember(mEvent.sender); - - if (isMountedRef.current === false) return; - const fallbackBody = mEvent.isRedacted() ? '*** This message has been deleted ***' : '*** Unable to load reply ***'; - let parsedBody = parseReply(rawBody)?.body ?? rawBody ?? fallbackBody; - if (editedList && parsedBody.startsWith(' * ')) { - parsedBody = parsedBody.slice(3); - } - - setReply({ - to: username, - color: colorMXID(mEvent.getSender()), - body: parsedBody, - event: mEvent, - }); - } catch { - setReply({ - to: '** Unknown user **', - color: 'var(--tc-danger-normal)', - body: '*** Unable to load reply ***', - event: null, - }); - } - }; - loadReply(); - - return () => { - isMountedRef.current = false; - }; - }, []); - - const focusReply = (ev) => { - if (!ev.key || ev.key === ' ' || ev.key === 'Enter') { - if (ev.key) ev.preventDefault(); - if (reply?.event === null) return; - if (reply?.event.isRedacted()) return; - roomTimeline.loadEventTimeline(eventId); - } - }; - - return ( -
    - {reply !== null && } -
    - ); -}); -MessageReplyWrapper.propTypes = { - roomTimeline: PropTypes.shape({}).isRequired, - eventId: PropTypes.string.isRequired, -}; - -const MessageBody = React.memo(({ - senderName, - body, - isCustomHTML, - isEdited, - msgType, -}) => { - // if body is not string it is a React element. - if (typeof body !== 'string') return
    {body}
    ; - - let content = null; - if (isCustomHTML) { - try { - content = twemojify( - sanitizeCustomHtml(initMatrix.matrixClient, body), - undefined, - true, - false, - true, - ); - } catch { - console.error('Malformed custom html: ', body); - content = twemojify(body, undefined); - } - } else { - content = twemojify(body, undefined, true); - } - - // Determine if this message should render with large emojis - // Criteria: - // - Contains only emoji - // - Contains no more than 10 emoji - let emojiOnly = false; - if (content.type === 'img') { - // If this messages contains only a single (inline) image - emojiOnly = true; - } else if (content.constructor.name === 'Array') { - // Otherwise, it might be an array of images / texb - - // Count the number of emojis - const nEmojis = content.filter((e) => e.type === 'img').length; - - // Make sure there's no text besides whitespace and variation selector U+FE0F - if (nEmojis <= 10 && content.every((element) => ( - (typeof element === 'object' && element.type === 'img') - || (typeof element === 'string' && /^[\s\ufe0f]*$/g.test(element)) - ))) { - emojiOnly = true; - } - } - - if (!isCustomHTML) { - // If this is a plaintext message, wrap it in a

    element (automatically applying - // white-space: pre-wrap) in order to preserve newlines - content = (

    {content}

    ); - } - - return ( -
    -
    - { msgType === 'm.emote' && ( - <> - {'* '} - {twemojify(senderName)} - {' '} - - )} - { content } -
    - { isEdited && (edited)} -
    - ); -}); -MessageBody.defaultProps = { - isCustomHTML: false, - isEdited: false, - msgType: null, -}; -MessageBody.propTypes = { - senderName: PropTypes.string.isRequired, - body: PropTypes.node.isRequired, - isCustomHTML: PropTypes.bool, - isEdited: PropTypes.bool, - msgType: PropTypes.string, -}; - -function MessageEdit({ body, onSave, onCancel }) { - const editInputRef = useRef(null); - - useEffect(() => { - // makes the cursor end up at the end of the line instead of the beginning - editInputRef.current.value = ''; - editInputRef.current.value = body; - }, []); - - const handleKeyDown = (e) => { - if (e.key === 'Escape') { - e.preventDefault(); - onCancel(); - } - - if (e.key === 'Enter' && e.shiftKey === false) { - e.preventDefault(); - onSave(editInputRef.current.value, body); - } - }; - - return ( -
    { e.preventDefault(); onSave(editInputRef.current.value, body); }}> - -
    - - -
    -
    - ); -} -MessageEdit.propTypes = { - body: PropTypes.string.isRequired, - onSave: PropTypes.func.isRequired, - onCancel: PropTypes.func.isRequired, -}; - -function getMyEmojiEvent(emojiKey, eventId, roomTimeline) { - const mx = initMatrix.matrixClient; - const rEvents = roomTimeline.reactionTimeline.get(eventId); - let rEvent = null; - rEvents?.find((rE) => { - if (rE.getRelation() === null) return false; - if (rE.getRelation().key === emojiKey && rE.getSender() === mx.getUserId()) { - rEvent = rE; - return true; - } - return false; - }); - return rEvent; -} - -function toggleEmoji(roomId, eventId, emojiKey, shortcode, roomTimeline) { - const myAlreadyReactEvent = getMyEmojiEvent(emojiKey, eventId, roomTimeline); - if (myAlreadyReactEvent) { - const rId = myAlreadyReactEvent.getId(); - if (rId.startsWith('~')) return; - redactEvent(roomId, rId); - return; - } - sendReaction(roomId, eventId, emojiKey, shortcode); -} - -function pickEmoji(e, roomId, eventId, roomTimeline) { - openEmojiBoard(getEventCords(e), (emoji) => { - toggleEmoji(roomId, eventId, emoji.mxc ?? emoji.unicode, emoji.shortcodes[0], roomTimeline); - e.target.click(); - }); -} - -function genReactionMsg(userIds, reaction, shortcode) { - return ( - <> - {userIds.map((userId, index) => ( - - {twemojify(getUsername(userId))} - {index < userIds.length - 1 && ( - - {index === userIds.length - 2 ? ' and ' : ', '} - - )} - - ))} - {' reacted with '} - {twemojify(shortcode ? `:${shortcode}:` : reaction, { className: 'react-emoji' })} - - ); -} - -function MessageReaction({ - reaction, shortcode, count, users, isActive, onClick, -}) { - let customEmojiUrl = null; - if (reaction.match(/^mxc:\/\/\S+$/)) { - customEmojiUrl = initMatrix.matrixClient.mxcUrlToHttp(reaction); - } - return ( - {users.length > 0 ? genReactionMsg(users, reaction, shortcode) : 'Unable to load who has reacted'}} - > - - - ); -} -MessageReaction.defaultProps = { - shortcode: undefined, -}; -MessageReaction.propTypes = { - reaction: PropTypes.node.isRequired, - shortcode: PropTypes.string, - count: PropTypes.number.isRequired, - users: PropTypes.arrayOf(PropTypes.string).isRequired, - isActive: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, -}; - -function MessageReactionGroup({ roomTimeline, mEvent }) { - const { roomId, room, reactionTimeline } = roomTimeline; - const mx = initMatrix.matrixClient; - const reactions = {}; - const canSendReaction = room.currentState.maySendEvent('m.reaction', mx.getUserId()); - - const eventReactions = reactionTimeline.get(mEvent.getId()); - const addReaction = (key, shortcode, count, senderId, isActive) => { - let reaction = reactions[key]; - if (reaction === undefined) { - reaction = { - count: 0, - users: [], - isActive: false, - }; - } - if (shortcode) reaction.shortcode = shortcode; - if (count) { - reaction.count = count; - } else { - reaction.users.push(senderId); - reaction.count = reaction.users.length; - if (isActive) reaction.isActive = isActive; - } - - reactions[key] = reaction; - }; - if (eventReactions) { - eventReactions.forEach((rEvent) => { - if (rEvent.getRelation() === null) return; - const reaction = rEvent.getRelation(); - const senderId = rEvent.getSender(); - const { shortcode } = rEvent.getContent(); - const isActive = senderId === mx.getUserId(); - - addReaction(reaction.key, shortcode, undefined, senderId, isActive); - }); - } else { - // Use aggregated reactions - const aggregatedReaction = mEvent.getServerAggregatedRelation('m.annotation')?.chunk; - if (!aggregatedReaction) return null; - aggregatedReaction.forEach((reaction) => { - if (reaction.type !== 'm.reaction') return; - addReaction(reaction.key, undefined, reaction.count, undefined, false); - }); - } - - return ( -
    - { - Object.keys(reactions).map((key) => ( - { - toggleEmoji(roomId, mEvent.getId(), key, reactions[key].shortcode, roomTimeline); - }} - /> - )) - } - {canSendReaction && ( - { - pickEmoji(e, roomId, mEvent.getId(), roomTimeline); - }} - src={EmojiAddIC} - size="extra-small" - tooltip="Add reaction" - /> - )} -
    - ); -} -MessageReactionGroup.propTypes = { - roomTimeline: PropTypes.shape({}).isRequired, - mEvent: PropTypes.shape({}).isRequired, -}; - -function isMedia(mE) { - return ( - mE.getContent()?.msgtype === 'm.file' - || mE.getContent()?.msgtype === 'm.image' - || mE.getContent()?.msgtype === 'm.audio' - || mE.getContent()?.msgtype === 'm.video' - || mE.getType() === 'm.sticker' - ); -} - -// if editedTimeline has mEventId then pass editedMEvent else pass mEvent to openViewSource -function handleOpenViewSource(mEvent, roomTimeline) { - const eventId = mEvent.getId(); - const { editedTimeline } = roomTimeline ?? {}; - let editedMEvent; - if (editedTimeline?.has(eventId)) { - const editedList = editedTimeline.get(eventId); - editedMEvent = editedList[editedList.length - 1]; - } - openViewSource(editedMEvent !== undefined ? editedMEvent : mEvent); -} - -const MessageOptions = React.memo(({ - roomTimeline, mEvent, edit, reply, -}) => { - const { roomId, room } = roomTimeline; - const mx = initMatrix.matrixClient; - const senderId = mEvent.getSender(); - - const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel; - const canIRedact = room.currentState.hasSufficientPowerLevelFor('redact', myPowerlevel); - const canSendReaction = room.currentState.maySendEvent('m.reaction', mx.getUserId()); - - return ( -
    - {canSendReaction && ( - pickEmoji(e, roomId, mEvent.getId(), roomTimeline)} - src={EmojiAddIC} - size="extra-small" - tooltip="Add reaction" - /> - )} - reply()} - src={ReplyArrowIC} - size="extra-small" - tooltip="Reply" - /> - {(senderId === mx.getUserId() && !isMedia(mEvent)) && ( - edit(true)} - src={PencilIC} - size="extra-small" - tooltip="Edit" - /> - )} - ( - <> - Options - openReadReceipts(roomId, roomTimeline.getEventReaders(mEvent))} - > - Read receipts - - handleOpenViewSource(mEvent, roomTimeline)} - > - View source - - {(canIRedact || senderId === mx.getUserId()) && ( - <> - - { - const isConfirmed = await confirmDialog( - 'Delete message', - 'Are you sure that you want to delete this message?', - 'Delete', - 'danger', - ); - if (!isConfirmed) return; - redactEvent(roomId, mEvent.getId()); - }} - > - Delete - - - )} - - )} - render={(toggleMenu) => ( - - )} - /> -
    - ); -}); -MessageOptions.propTypes = { - roomTimeline: PropTypes.shape({}).isRequired, - mEvent: PropTypes.shape({}).isRequired, - edit: PropTypes.func.isRequired, - reply: PropTypes.func.isRequired, -}; - -function genMediaContent(mE) { - const mx = initMatrix.matrixClient; - const mContent = mE.getContent(); - if (!mContent || !mContent.body) return Malformed event; - - let mediaMXC = mContent?.url; - const isEncryptedFile = typeof mediaMXC === 'undefined'; - if (isEncryptedFile) mediaMXC = mContent?.file?.url; - - let thumbnailMXC = mContent?.info?.thumbnail_url; - - if (typeof mediaMXC === 'undefined' || mediaMXC === '') return Malformed event; - - let msgType = mE.getContent()?.msgtype; - const safeMimetype = getBlobSafeMimeType(mContent.info?.mimetype); - if (mE.getType() === 'm.sticker') { - msgType = 'm.sticker'; - } else if (safeMimetype === 'application/octet-stream') { - msgType = 'm.file'; - } - - const blurhash = mContent?.info?.['xyz.amorgan.blurhash']; - - switch (msgType) { - case 'm.file': - return ( - - ); - case 'm.image': - return ( - - ); - case 'm.sticker': - return ( - - ); - case 'm.audio': - return ( - - ); - case 'm.video': - if (typeof thumbnailMXC === 'undefined') { - thumbnailMXC = mContent.info?.thumbnail_file?.url || null; - } - return ( - - ); - default: - return Malformed event; - } -} - -function getEditedBody(editedMEvent) { - const newContent = editedMEvent.getContent()['m.new_content']; - if (typeof newContent === 'undefined') return [null, false, null]; - - const isCustomHTML = newContent.format === 'org.matrix.custom.html'; - const parsedContent = parseReply(newContent.body); - if (parsedContent === null) { - return [newContent.body, isCustomHTML, newContent.formatted_body ?? null]; - } - return [parsedContent.body, isCustomHTML, newContent.formatted_body ?? null]; -} - -function Message({ - mEvent, isBodyOnly, roomTimeline, - focus, fullTime, isEdit, setEdit, cancelEdit, -}) { - const roomId = mEvent.getRoomId(); - const { editedTimeline, reactionTimeline } = roomTimeline ?? {}; - - const className = ['message', (isBodyOnly ? 'message--body-only' : 'message--full')]; - if (focus) className.push('message--focus'); - const content = mEvent.getContent(); - const eventId = mEvent.getId(); - const msgType = content?.msgtype; - const senderId = mEvent.getSender(); - let { body } = content; - const username = mEvent.sender ? getUsernameOfRoomMember(mEvent.sender) : getUsername(senderId); - const avatarSrc = mEvent.sender?.getAvatarUrl(initMatrix.matrixClient.baseUrl, 36, 36, 'crop') ?? null; - let isCustomHTML = content.format === 'org.matrix.custom.html'; - let customHTML = isCustomHTML ? content.formatted_body : null; - - const edit = useCallback(() => { - setEdit(eventId); - }, []); - const reply = useCallback(() => { - replyTo(senderId, mEvent.getId(), body, customHTML); - }, [body, customHTML]); - - if (msgType === 'm.emote') className.push('message--type-emote'); - - const isEdited = roomTimeline ? editedTimeline.has(eventId) : false; - const haveReactions = roomTimeline - ? reactionTimeline.has(eventId) || !!mEvent.getServerAggregatedRelation('m.annotation') - : false; - const isReply = !!mEvent.replyEventId; - - if (isEdited) { - const editedList = editedTimeline.get(eventId); - const editedMEvent = editedList[editedList.length - 1]; - [body, isCustomHTML, customHTML] = getEditedBody(editedMEvent); - } - - if (isReply) { - body = parseReply(body)?.body ?? body; - customHTML = trimHTMLReply(customHTML); - } - - if (typeof body !== 'string') body = ''; - - return ( -
    - { - isBodyOnly - ?
    - : ( - - ) - } -
    - {!isBodyOnly && ( - - )} - {roomTimeline && isReply && ( - - )} - {!isEdit && ( - - )} - {isEdit && ( - { - if (newBody !== oldBody) { - initMatrix.roomsInput.sendEditedMessage(roomId, mEvent, newBody); - } - cancelEdit(); - }} - onCancel={cancelEdit} - /> - )} - {haveReactions && ( - - )} - {roomTimeline && !isEdit && ( - - )} -
    -
    - ); -} -Message.defaultProps = { - isBodyOnly: false, - focus: false, - roomTimeline: null, - fullTime: false, - isEdit: false, - setEdit: null, - cancelEdit: null, -}; -Message.propTypes = { - mEvent: PropTypes.shape({}).isRequired, - isBodyOnly: PropTypes.bool, - roomTimeline: PropTypes.shape({}), - focus: PropTypes.bool, - fullTime: PropTypes.bool, - isEdit: PropTypes.bool, - setEdit: PropTypes.func, - cancelEdit: PropTypes.func, -}; - -export { Message, MessageReply, PlaceholderMessage }; diff --git a/src/app/molecules/message/Message.scss b/src/app/molecules/message/Message.scss deleted file mode 100644 index 5dda9c98..00000000 --- a/src/app/molecules/message/Message.scss +++ /dev/null @@ -1,479 +0,0 @@ -@use '../../atoms/scroll/scrollbar'; -@use '../../partials/text'; -@use '../../partials/dir'; -@use '../../partials/screen'; - -.message, -.ph-msg { - padding: var(--sp-ultra-tight); - @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); - display: flex; - - &:hover { - background-color: var(--bg-surface-hover); - & .message__options { - display: flex; - } - } - - &__avatar-container { - padding-top: 6px; - @include dir.side(margin, 0, var(--sp-tight)); - - & .avatar-container { - transition: transform 200ms var(--fluid-push); - &:hover { - transform: translateY(-4px); - } - } - - & button { - cursor: pointer; - display: flex; - } - } - - &__main-container { - flex: 1; - min-width: 0; - - position: relative; - } -} - -.message { - &--full + &--full, - &--body-only + &--full, - & + .timeline-change, - .timeline-change + & { - margin-top: var(--sp-normal); - } - &__avatar-container { - width: var(--av-small); - } - &--focus { - --ltr: inset 2px 0 0 var(--bg-caution); - --rtl: inset -2px 0 0 var(--bg-caution); - @include dir.prop(box-shadow, var(--ltr), var(--rtl)); - background-color: var(--bg-caution-hover); - } -} - -.ph-msg { - &__avatar { - width: var(--av-small); - height: var(--av-small); - background-color: var(--bg-surface-hover); - border-radius: var(--bo-radius); - } - - &__header, - &__body > div { - margin: var(--sp-ultra-tight); - @include dir.side(margin, 0, var(--sp-extra-tight)); - height: var(--fs-b1); - width: 100%; - max-width: 100px; - background-color: var(--bg-surface-hover); - border-radius: calc(var(--bo-radius) / 2); - } - &__body { - display: flex; - flex-wrap: wrap; - } - &__body > div:nth-child(1n) { - max-width: 10%; - } - &__body > div:nth-child(2n) { - max-width: 50%; - } -} - -.message__reply, -.message__body, -.message__body__wrapper, -.message__edit, -.message__reactions { - max-width: calc(100% - 88px); - min-width: 0; - @include screen.smallerThan(tabletBreakpoint) { - max-width: 100%; - } -} - -.message__header { - display: flex; - align-items: baseline; - - & .message__profile { - min-width: 0; - color: var(--tc-surface-high); - @include dir.side(margin, 0, var(--sp-tight)); - - & > span { - @extend .cp-txt__ellipsis; - color: inherit; - } - & > span:last-child { - display: none; - } - &:hover { - & > span:first-child { - display: none; - } - & > span:last-child { - display: block; - } - } - } - - & .message__time { - flex: 1; - display: flex; - justify-content: flex-end; - & > .text { - white-space: nowrap; - color: var(--tc-surface-low); - } - } -} -.message__reply { - &-wrapper { - min-height: 20px; - cursor: pointer; - &:empty { - border-radius: calc(var(--bo-radius) / 2); - background-color: var(--bg-surface-hover); - max-width: 200px; - cursor: auto; - } - &:hover .text { - color: var(--tc-surface-high); - } - } - .text { - @extend .cp-txt__ellipsis; - color: var(--tc-surface-low); - } - .ic-raw { - width: 16px; - height: 14px; - } -} -.message__body { - word-break: break-word; - - & > .text > .message__body-plain { - white-space: pre-wrap; - } - - & a { - word-break: break-word; - } - & > .text > a { - white-space: initial !important; - } - - & > .text > p + p { - margin-top: var(--sp-normal); - } - - & span[data-mx-pill] { - background-color: hsla(0, 0%, 64%, 0.15); - padding: 0 2px; - border-radius: 4px; - cursor: pointer; - font-weight: var(--fw-medium); - &:hover { - background-color: hsla(0, 0%, 64%, 0.3); - color: var(--tc-surface-high); - } - - &[data-mx-ping] { - background-color: var(--bg-ping); - &:hover { - background-color: var(--bg-ping-hover); - } - } - } - - & span[data-mx-spoiler] { - border-radius: 4px; - background-color: rgba(124, 124, 124, 0.5); - color: transparent; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - & > * { - opacity: 0; - } - } - - .data-mx-spoiler--visible { - background-color: var(--bg-surface-active) !important; - color: inherit !important; - user-select: initial !important; - & > * { - opacity: inherit !important; - } - } - &-edited { - color: var(--tc-surface-low); - } -} -.message__edit { - padding: var(--sp-extra-tight) 0; - &-btns button { - margin: var(--sp-tight) 0 0 0; - padding: var(--sp-ultra-tight) var(--sp-tight); - min-width: 0; - @include dir.side(margin, 0, var(--sp-tight)); - } -} -.message__reactions { - display: flex; - flex-wrap: wrap; - - & .ic-btn-surface { - display: none; - padding: var(--sp-ultra-tight); - margin-top: var(--sp-extra-tight); - } - &:hover .ic-btn-surface { - display: block; - } -} -.msg__reaction { - margin: var(--sp-extra-tight) 0 0 0; - @include dir.side(margin, 0, var(--sp-extra-tight)); - padding: 0 var(--sp-ultra-tight); - min-height: 26px; - display: inline-flex; - align-items: center; - color: var(--tc-surface-normal); - background-color: var(--bg-surface-low); - border: 1px solid var(--bg-surface-border); - border-radius: 4px; - cursor: pointer; - - & .react-emoji { - height: 16px; - margin: 2px; - } - &-count { - margin: 0 var(--sp-ultra-tight); - color: var(--tc-surface-normal); - } - &-tooltip .react-emoji { - width: 16px; - height: 16px; - margin: 0 var(--sp-ultra-tight); - margin-bottom: -2px; - } - - @media (hover: hover) { - &:hover { - background-color: var(--bg-surface-hover); - } - } - &:active { - background-color: var(--bg-surface-active); - } - - &--active { - background-color: var(--bg-caution-active); - - @media (hover: hover) { - &:hover { - background-color: var(--bg-caution-hover); - } - } - &:active { - background-color: var(--bg-caution-active); - } - } -} -.message__options { - position: absolute; - top: 0; - @include dir.prop(right, 60px, unset); - @include dir.prop(left, unset, 60px); - - z-index: 99; - transform: translateY(-100%); - - border-radius: var(--bo-radius); - box-shadow: var(--bs-surface-border); - background-color: var(--bg-surface-low); - display: none; -} - -// markdown formating -.message__body { - & h1, - h2, - h3, - h4, - h5, - h6 { - margin: 0; - margin-bottom: var(--sp-ultra-tight); - font-weight: var(--fw-medium); - &:first-child { - margin-top: 0; - } - &:last-child { - margin-bottom: 0; - } - } - & h1, - & h2 { - color: var(--tc-surface-high); - margin-top: var(--sp-normal); - font-size: var(--fs-h2); - line-height: var(--lh-h2); - letter-spacing: var(--ls-h2); - } - & h3, - & h4 { - color: var(--tc-surface-high); - margin-top: var(--sp-tight); - font-size: var(--fs-s1); - line-height: var(--lh-s1); - letter-spacing: var(--ls-s1); - } - & h5, - & h6 { - color: var(--tc-surface-high); - margin-top: var(--sp-extra-tight); - font-size: var(--fs-b1); - line-height: var(--lh-b1); - letter-spacing: var(--ls-b1); - } - & hr { - border-color: var(--bg-divider); - } - - .text img { - margin: var(--sp-ultra-tight) 0; - max-width: 296px; - border-radius: calc(var(--bo-radius) / 2); - } - - & p, - & pre, - & blockquote { - margin: 0; - padding: 0; - } - & pre, - & blockquote { - margin: var(--sp-ultra-tight) 0; - padding: var(--sp-extra-tight); - background-color: var(--bg-surface-hover) !important; - border-radius: calc(var(--bo-radius) / 2); - } - & pre { - div { - background: none !important; - margin: 0 !important; - } - span { - background: none !important; - } - .linenumber { - min-width: 2.25em !important; - } - } - & code { - padding: 0 !important; - color: var(--tc-code) !important; - white-space: pre-wrap; - @include scrollbar.scroll; - @include scrollbar.scroll__h; - @include scrollbar.scroll--auto-hide; - } - & pre { - width: fit-content; - max-width: 100%; - @include scrollbar.scroll; - @include scrollbar.scroll__h; - @include scrollbar.scroll--auto-hide; - & code { - color: var(--tc-surface-normal) !important; - white-space: pre; - } - } - & blockquote { - width: fit-content; - max-width: 100%; - @include dir.side(border, 4px solid var(--bg-surface-active), 0); - white-space: initial !important; - - & > * { - white-space: pre-wrap; - } - } - & ul, - & ol { - margin: var(--sp-ultra-tight) 0; - @include dir.side(padding, 24px, 0); - white-space: initial !important; - } - & ul.contains-task-list { - padding: 0; - list-style: none; - } - & table { - display: inline-block; - max-width: 100%; - white-space: normal !important; - background-color: var(--bg-surface-hover); - border-radius: calc(var(--bo-radius) / 2); - border-spacing: 0; - border: 1px solid var(--bg-surface-border); - @include scrollbar.scroll; - @include scrollbar.scroll__h; - @include scrollbar.scroll--auto-hide; - - & td, - & th { - padding: var(--sp-extra-tight); - border: 1px solid var(--bg-surface-border); - border-width: 0 1px 1px 0; - white-space: pre; - &:last-child { - border-width: 0; - border-bottom-width: 1px; - [dir='rtl'] & { - border-width: 0 1px 1px 0; - } - } - [dir='rtl'] &:first-child { - border-width: 0; - border-bottom-width: 1px; - } - } - & tbody tr:nth-child(2n + 1) { - background-color: var(--bg-surface-hover); - } - & tr:last-child td { - border-bottom-width: 0px !important; - } - } -} - -.message.message--type-emote { - .message__body { - font-style: italic; - - // Remove blockness of first `

    ` so that markdown emotes stay on one line. - p:first-of-type { - display: inline; - } - } -} diff --git a/src/app/molecules/message/TimelineChange.jsx b/src/app/molecules/message/TimelineChange.jsx deleted file mode 100644 index bc6e913f..00000000 --- a/src/app/molecules/message/TimelineChange.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './TimelineChange.scss'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Time from '../../atoms/time/Time'; - -import JoinArraowIC from '../../../../public/res/ic/outlined/join-arrow.svg'; -import LeaveArraowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; -import InviteArraowIC from '../../../../public/res/ic/outlined/invite-arrow.svg'; -import InviteCancelArraowIC from '../../../../public/res/ic/outlined/invite-cancel-arrow.svg'; -import UserIC from '../../../../public/res/ic/outlined/user.svg'; - -function TimelineChange({ - variant, content, timestamp, onClick, -}) { - let iconSrc; - - switch (variant) { - case 'join': - iconSrc = JoinArraowIC; - break; - case 'leave': - iconSrc = LeaveArraowIC; - break; - case 'invite': - iconSrc = InviteArraowIC; - break; - case 'invite-cancel': - iconSrc = InviteCancelArraowIC; - break; - case 'avatar': - iconSrc = UserIC; - break; - default: - iconSrc = JoinArraowIC; - break; - } - - return ( - - ); -} - -TimelineChange.defaultProps = { - variant: 'other', - onClick: null, -}; - -TimelineChange.propTypes = { - variant: PropTypes.oneOf([ - 'join', 'leave', 'invite', - 'invite-cancel', 'avatar', 'other', - ]), - content: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.node, - ]).isRequired, - timestamp: PropTypes.number.isRequired, - onClick: PropTypes.func, -}; - -export default TimelineChange; diff --git a/src/app/molecules/message/TimelineChange.scss b/src/app/molecules/message/TimelineChange.scss deleted file mode 100644 index c066a9ae..00000000 --- a/src/app/molecules/message/TimelineChange.scss +++ /dev/null @@ -1,37 +0,0 @@ -@use '../../partials/dir'; - -.timeline-change { - padding: var(--sp-ultra-tight); - @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); - - display: flex; - align-items: center; - width: 100%; - - &:hover { - background-color: var(--bg-surface-hover); - } - - &__avatar-container { - width: var(--av-small); - display: inline-flex; - justify-content: center; - align-items: center; - opacity: 0.38; - .ic-raw { - background-color: var(--tc-surface-low); - } - } - - & .text { - color: var(--tc-surface-low); - } - - &__content { - flex: 1; - min-width: 0; - - margin: 0 var(--sp-tight); - word-break: break-word; - } -} \ No newline at end of file diff --git a/src/app/molecules/people-selector/PeopleSelector.jsx b/src/app/molecules/people-selector/PeopleSelector.jsx index 8ea0587f..7025aa7c 100644 --- a/src/app/molecules/people-selector/PeopleSelector.jsx +++ b/src/app/molecules/people-selector/PeopleSelector.jsx @@ -2,16 +2,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import './PeopleSelector.scss'; -import { twemojify } from '../../../util/twemojify'; - import { blurOnBubbling } from '../../atoms/button/script'; import Text from '../../atoms/text/Text'; import Avatar from '../../atoms/avatar/Avatar'; -function PeopleSelector({ - avatarSrc, name, color, peopleRole, onClick, -}) { +function PeopleSelector({ avatarSrc, name, color, peopleRole, onClick }) { return (

    ); diff --git a/src/app/molecules/popup-window/PopupWindow.jsx b/src/app/molecules/popup-window/PopupWindow.jsx index 4179f49a..55872d6a 100644 --- a/src/app/molecules/popup-window/PopupWindow.jsx +++ b/src/app/molecules/popup-window/PopupWindow.jsx @@ -2,8 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import './PopupWindow.scss'; -import { twemojify } from '../../../util/twemojify'; - import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; import { MenuItem } from '../../atoms/context-menu/ContextMenu'; @@ -13,19 +11,11 @@ import RawModal from '../../atoms/modal/RawModal'; import ChevronLeftIC from '../../../../public/res/ic/outlined/chevron-left.svg'; -function PWContentSelector({ - selected, variant, iconSrc, - type, onClick, children, -}) { +function PWContentSelector({ selected, variant, iconSrc, type, onClick, children }) { const pwcsClass = selected ? ' pw-content-selector--selected' : ''; return (
    - + {children}
    @@ -49,9 +39,16 @@ PWContentSelector.propTypes = { }; function PopupWindow({ - className, isOpen, title, contentTitle, - drawer, drawerOptions, contentOptions, - onAfterClose, onRequestClose, children, + className, + isOpen, + title, + contentTitle, + drawer, + drawerOptions, + contentOptions, + onAfterClose, + onRequestClose, + children, }) { const haveDrawer = drawer !== null; const cTitle = contentTitle !== null ? contentTitle : title; @@ -69,21 +66,26 @@ function PopupWindow({ {haveDrawer && (
    - + - { - typeof title === 'string' - ? {twemojify(title)} - : title - } + {typeof title === 'string' ? ( + + {title} + + ) : ( + title + )} {drawerOptions}
    -
    - {drawer} -
    +
    {drawer}
    @@ -91,19 +93,19 @@ function PopupWindow({
    - { - typeof cTitle === 'string' - ? {twemojify(cTitle)} - : cTitle - } + {typeof cTitle === 'string' ? ( + + {cTitle} + + ) : ( + cTitle + )} {contentOptions}
    -
    - {children} -
    +
    {children}
    diff --git a/src/app/molecules/room-notification/RoomNotification.jsx b/src/app/molecules/room-notification/RoomNotification.jsx index 4adb1169..821ea508 100644 --- a/src/app/molecules/room-notification/RoomNotification.jsx +++ b/src/app/molecules/room-notification/RoomNotification.jsx @@ -13,28 +13,33 @@ import BellIC from '../../../../public/res/ic/outlined/bell.svg'; import BellRingIC from '../../../../public/res/ic/outlined/bell-ring.svg'; import BellPingIC from '../../../../public/res/ic/outlined/bell-ping.svg'; import BellOffIC from '../../../../public/res/ic/outlined/bell-off.svg'; +import { getNotificationType } from '../../utils/room'; -const items = [{ - iconSrc: BellIC, - text: 'Global', - type: cons.notifs.DEFAULT, -}, { - iconSrc: BellRingIC, - text: 'All messages', - type: cons.notifs.ALL_MESSAGES, -}, { - iconSrc: BellPingIC, - text: 'Mentions & Keywords', - type: cons.notifs.MENTIONS_AND_KEYWORDS, -}, { - iconSrc: BellOffIC, - text: 'Mute', - type: cons.notifs.MUTE, -}]; +const items = [ + { + iconSrc: BellIC, + text: 'Global', + type: cons.notifs.DEFAULT, + }, + { + iconSrc: BellRingIC, + text: 'All messages', + type: cons.notifs.ALL_MESSAGES, + }, + { + iconSrc: BellPingIC, + text: 'Mentions & Keywords', + type: cons.notifs.MENTIONS_AND_KEYWORDS, + }, + { + iconSrc: BellOffIC, + text: 'Mute', + type: cons.notifs.MUTE, + }, +]; function setRoomNotifType(roomId, newType) { const mx = initMatrix.matrixClient; - const { notifications } = initMatrix; let roomPushRule; try { roomPushRule = mx.getRoomPushRule('global', roomId); @@ -47,22 +52,22 @@ function setRoomNotifType(roomId, newType) { if (roomPushRule) { promises.push(mx.deletePushRule('global', 'room', roomPushRule.rule_id)); } - promises.push(mx.addPushRule('global', 'override', roomId, { - conditions: [ - { - kind: 'event_match', - key: 'room_id', - pattern: roomId, - }, - ], - actions: [ - 'dont_notify', - ], - })); + promises.push( + mx.addPushRule('global', 'override', roomId, { + conditions: [ + { + kind: 'event_match', + key: 'room_id', + pattern: roomId, + }, + ], + actions: ['dont_notify'], + }) + ); return promises; } - const oldState = notifications.getNotiType(roomId); + const oldState = getNotificationType(mx, roomId); if (oldState === cons.notifs.MUTE) { promises.push(mx.deletePushRule('global', 'override', roomId)); } @@ -75,25 +80,27 @@ function setRoomNotifType(roomId, newType) { } if (newType === cons.notifs.MENTIONS_AND_KEYWORDS) { - promises.push(mx.addPushRule('global', 'room', roomId, { - actions: [ - 'dont_notify', - ], - })); + promises.push( + mx.addPushRule('global', 'room', roomId, { + actions: ['dont_notify'], + }) + ); promises.push(mx.setPushRuleEnabled('global', 'room', roomId, true)); return Promise.all(promises); } // cons.notifs.ALL_MESSAGES - promises.push(mx.addPushRule('global', 'room', roomId, { - actions: [ - 'notify', - { - set_tweak: 'sound', - value: 'default', - }, - ], - })); + promises.push( + mx.addPushRule('global', 'room', roomId, { + actions: [ + 'notify', + { + set_tweak: 'sound', + value: 'default', + }, + ], + }) + ); promises.push(mx.setPushRuleEnabled('global', 'room', roomId, true)); @@ -101,17 +108,20 @@ function setRoomNotifType(roomId, newType) { } function useNotifications(roomId) { - const { notifications } = initMatrix; - const [activeType, setActiveType] = useState(notifications.getNotiType(roomId)); + const mx = initMatrix.matrixClient; + const [activeType, setActiveType] = useState(getNotificationType(mx, roomId)); useEffect(() => { - setActiveType(notifications.getNotiType(roomId)); - }, [roomId]); + setActiveType(getNotificationType(mx, roomId)); + }, [mx, roomId]); - const setNotification = useCallback((item) => { - if (item.type === activeType.type) return; - setActiveType(item.type); - setRoomNotifType(roomId, item.type); - }, [activeType, roomId]); + const setNotification = useCallback( + (item) => { + if (item.type === activeType.type) return; + setActiveType(item.type); + setRoomNotifType(roomId, item.type); + }, + [activeType, roomId] + ); return [activeType, setNotification]; } @@ -120,21 +130,19 @@ function RoomNotification({ roomId }) { return (
    - { - items.map((item) => ( - setNotification(item)} - > - - {item.text} - - - - )) - } + {items.map((item) => ( + setNotification(item)} + > + + {item.text} + + + + ))}
    ); } diff --git a/src/app/molecules/room-options/RoomOptions.jsx b/src/app/molecules/room-options/RoomOptions.jsx deleted file mode 100644 index af18d712..00000000 --- a/src/app/molecules/room-options/RoomOptions.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import { openInviteUser } from '../../../client/action/navigation'; -import * as roomActions from '../../../client/action/room'; -import { markAsRead } from '../../../client/action/notifications'; - -import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; -import RoomNotification from '../room-notification/RoomNotification'; - -import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; -import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; -import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; - -import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; - -function RoomOptions({ roomId, afterOptionSelect }) { - const mx = initMatrix.matrixClient; - const room = mx.getRoom(roomId); - const canInvite = room?.canInvite(mx.getUserId()); - - const handleMarkAsRead = () => { - markAsRead(roomId); - afterOptionSelect(); - }; - - const handleInviteClick = () => { - openInviteUser(roomId); - afterOptionSelect(); - }; - const handleLeaveClick = async () => { - afterOptionSelect(); - const isConfirmed = await confirmDialog( - 'Leave room', - `Are you sure that you want to leave "${room.name}" room?`, - 'Leave', - 'danger', - ); - if (!isConfirmed) return; - roomActions.leave(roomId); - }; - - return ( -
    - {twemojify(`Options for ${initMatrix.matrixClient.getRoom(roomId)?.name}`)} - Mark as read - - Invite - - Leave - Notification - -
    - ); -} - -RoomOptions.defaultProps = { - afterOptionSelect: null, -}; - -RoomOptions.propTypes = { - roomId: PropTypes.string.isRequired, - afterOptionSelect: PropTypes.func, -}; - -export default RoomOptions; diff --git a/src/app/molecules/room-profile/RoomProfile.jsx b/src/app/molecules/room-profile/RoomProfile.jsx index 21811984..15273ebf 100644 --- a/src/app/molecules/room-profile/RoomProfile.jsx +++ b/src/app/molecules/room-profile/RoomProfile.jsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { useAtomValue } from 'jotai'; +import Linkify from 'linkify-react'; import './RoomProfile.scss'; -import { twemojify } from '../../../util/twemojify'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import colorMXID from '../../../util/colorMXID'; @@ -20,6 +20,8 @@ import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; import { useStore } from '../../hooks/useStore'; import { useForceUpdate } from '../../hooks/useForceUpdate'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; +import { mDirectAtom } from '../../state/mDirectList'; +import { LINKIFY_OPTS } from '../../plugins/react-custom-html-parser'; function RoomProfile({ roomId }) { const isMountStore = useStore(); @@ -31,9 +33,12 @@ function RoomProfile({ roomId }) { }); const mx = initMatrix.matrixClient; - const isDM = initMatrix.roomList.directs.has(roomId); + const mDirects = useAtomValue(mDirectAtom); + const isDM = mDirects.has(roomId); let avatarSrc = mx.getRoom(roomId).getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); - avatarSrc = isDM ? mx.getRoom(roomId).getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') : avatarSrc; + avatarSrc = isDM + ? mx.getRoom(roomId).getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') + : avatarSrc; const room = mx.getRoom(roomId); const { currentState } = room; const roomName = room.name; @@ -47,15 +52,14 @@ function RoomProfile({ roomId }) { useEffect(() => { isMountStore.setItem(true); - const { roomList } = initMatrix; - const handleProfileUpdate = (rId) => { - if (roomId !== rId) return; + const handleStateEvent = (mEvent) => { + if (mEvent.event.room_id !== roomId) return; forceUpdate(); }; - roomList.on(cons.events.roomList.ROOM_PROFILE_UPDATED, handleProfileUpdate); + mx.on('RoomState.events', handleStateEvent); return () => { - roomList.removeListener(cons.events.roomList.ROOM_PROFILE_UPDATED, handleProfileUpdate); + mx.removeListener('RoomState.events', handleStateEvent); isMountStore.setItem(false); setStatus({ msg: null, @@ -122,7 +126,7 @@ function RoomProfile({ roomId }) { 'Remove avatar', 'Are you sure that you want to remove room avatar?', 'Remove', - 'caution', + 'caution' ); if (isConfirmed) { await mx.sendStateEvent(roomId, 'm.room.avatar', { url }, ''); @@ -132,15 +136,45 @@ function RoomProfile({ roomId }) { const renderEditNameAndTopic = () => (
    - {canChangeName && } - {canChangeTopic && } - {(!canChangeName || !canChangeTopic) && {`You have permission to change ${room.isSpaceRoom() ? 'space' : 'room'} ${canChangeName ? 'name' : 'topic'} only.`}} - { status.type === cons.status.IN_FLIGHT && {status.msg}} - { status.type === cons.status.SUCCESS && {status.msg}} - { status.type === cons.status.ERROR && {status.msg}} - { status.type !== cons.status.IN_FLIGHT && ( + {canChangeName && ( + + )} + {canChangeTopic && ( + + )} + {(!canChangeName || !canChangeTopic) && ( + {`You have permission to change ${ + room.isSpaceRoom() ? 'space' : 'room' + } ${canChangeName ? 'name' : 'topic'} only.`} + )} + {status.type === cons.status.IN_FLIGHT && {status.msg}} + {status.type === cons.status.SUCCESS && ( + + {status.msg} + + )} + {status.type === cons.status.ERROR && ( + + {status.msg} + + )} + {status.type !== cons.status.IN_FLIGHT && (
    - +
    )} @@ -148,10 +182,15 @@ function RoomProfile({ roomId }) { ); const renderNameAndTopic = () => ( -
    +
    - {twemojify(roomName)} - { (canChangeName || canChangeTopic) && ( + + {roomName} + + {(canChangeName || canChangeTopic) && ( {room.getCanonicalAlias() || room.roomId} - {roomTopic && {twemojify(roomTopic, undefined, true)}} + {roomTopic && ( + + {roomTopic} + + )}
    ); return (
    - { !canChangeAvatar && } - { canChangeAvatar && ( + {!canChangeAvatar && ( + + )} + {canChangeAvatar && ( { - mountStore.setItem(true) - }, [roomId]); - - useEffect(() => { - if (searchData?.results?.length > 0) { - roomIdToBackup.set(roomId, searchData); - } else { - roomIdToBackup.delete(roomId); - } - }, [searchData]); - - const search = async (term) => { - setSearchData(null); - if (term === '') { - setStatus({ type: cons.status.PRE_FLIGHT, term: null }); - return; - } - setStatus({ type: cons.status.IN_FLIGHT, term }); - const body = { - search_categories: { - room_events: { - search_term: term, - filter: { - limit: 10, - rooms: [roomId], - }, - order_by: 'recent', - event_context: { - before_limit: 0, - after_limit: 0, - include_profile: true, - }, - }, - }, - }; - try { - const res = await mx.search({ body }); - const data = mx.processRoomEventsSearch({ - _query: body, - results: [], - highlights: [], - }, res); - if (!mountStore.getItem()) return; - setStatus({ type: cons.status.SUCCESS, term }); - setSearchData(data); - if (!mountStore.getItem()) return; - } catch (error) { - setSearchData(null); - setStatus({ type: cons.status.ERROR, term }); - } - }; - - const paginate = async () => { - if (searchData === null) return; - const term = searchData._query.search_categories.room_events.search_term; - - setStatus({ type: cons.status.IN_FLIGHT, term }); - try { - const data = await mx.backPaginateRoomEventsSearch(searchData); - if (!mountStore.getItem()) return; - setStatus({ type: cons.status.SUCCESS, term }); - setSearchData(data); - } catch (error) { - if (!mountStore.getItem()) return; - setSearchData(null); - setStatus({ type: cons.status.ERROR, term }); - } - }; - - return [searchData, search, paginate, status]; -} - -function RoomSearch({ roomId }) { - const [searchData, search, paginate, status] = useRoomSearch(roomId); - const mx = initMatrix.matrixClient; - const isRoomEncrypted = mx.isRoomEncrypted(roomId); - const searchTerm = searchData?._query.search_categories.room_events.search_term ?? ''; - - const handleSearch = (e) => { - e.preventDefault(); - if (isRoomEncrypted) return; - const searchTermInput = e.target.elements['room-search-input']; - const term = searchTermInput.value.trim(); - - search(term); - }; - - const renderTimeline = (timeline) => ( -
    - { timeline.map((mEvent) => { - const id = mEvent.getId(); - return ( - - - - - ); - })} -
    - ); - - return ( -
    - - Room search -
    - - -
    - {searchData?.results.length > 0 && ( - {`${searchData.count} results for "${searchTerm}"`} - )} - {!isRoomEncrypted && searchData === null && ( -
    - {status.type === cons.status.IN_FLIGHT && } - {status.type === cons.status.IN_FLIGHT && Searching room messages...} - {status.type === cons.status.PRE_FLIGHT && } - {status.type === cons.status.PRE_FLIGHT && Search room messages} - {status.type === cons.status.ERROR && Failed to search messages} -
    - )} - - {!isRoomEncrypted && searchData?.results.length === 0 && ( -
    - No results found -
    - )} - {isRoomEncrypted && ( -
    - Search does not work in encrypted room -
    - )} - - {searchData?.results.length > 0 && ( - <> -
    - {searchData.results.map((searchResult) => { - const { timeline } = searchResult.context; - return renderTimeline(timeline); - })} -
    - {searchData?.next_batch && ( -
    - {status.type !== cons.status.IN_FLIGHT && ( - - )} - {status.type === cons.status.IN_FLIGHT && } -
    - )} - - )} -
    - ); -} - -RoomSearch.propTypes = { - roomId: PropTypes.string.isRequired, -}; - -export default RoomSearch; diff --git a/src/app/molecules/room-search/RoomSearch.scss b/src/app/molecules/room-search/RoomSearch.scss deleted file mode 100644 index a40945ef..00000000 --- a/src/app/molecules/room-search/RoomSearch.scss +++ /dev/null @@ -1,62 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.room-search { - &__form { - & div:nth-child(2) { - display: flex; - align-items: flex-end; - padding: var(--sp-normal);; - - & .input-container { - @extend .cp-fx__item-one; - @include dir.side(margin, 0, var(--sp-normal)); - } - & button { - height: 46px; - } - } - & .context-menu__header { - margin-bottom: 0; - } - & > .text { - padding: 0 var(--sp-normal) var(--sp-tight); - } - } - - &__help { - height: 248px; - @extend .cp-fx__column--c-c; - - & .ic-raw { - opacity: .5; - } - .text { - margin-top: var(--sp-normal); - } - } - &__more { - margin-bottom: var(--sp-normal); - @extend .cp-fx__row--c-c; - button { - width: 100%; - } - } - &__result-item { - padding: var(--sp-tight) var(--sp-normal); - display: flex; - align-items: flex-start; - - .message { - @include dir.side(margin, 0, var(--sp-normal)); - @extend .cp-fx__item-one; - padding: 0; - &:hover { - background-color: transparent; - } - & .message__time { - flex: 0; - } - } - } -} \ No newline at end of file diff --git a/src/app/molecules/room-selector/RoomSelector.jsx b/src/app/molecules/room-selector/RoomSelector.jsx index fa6daa9e..f865c95d 100644 --- a/src/app/molecules/room-selector/RoomSelector.jsx +++ b/src/app/molecules/room-selector/RoomSelector.jsx @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import './RoomSelector.scss'; -import { twemojify } from '../../../util/twemojify'; import colorMXID from '../../../util/colorMXID'; import Text from '../../atoms/text/Text'; @@ -11,8 +10,13 @@ import NotificationBadge from '../../atoms/badge/NotificationBadge'; import { blurOnBubbling } from '../../atoms/button/script'; function RoomSelectorWrapper({ - isSelected, isMuted, isUnread, onClick, - content, options, onContextMenu, + isSelected, + isMuted, + isUnread, + onClick, + content, + options, + onContextMenu, }) { const classes = ['room-selector']; if (isMuted) classes.push('room-selector--muted'); @@ -50,16 +54,26 @@ RoomSelectorWrapper.propTypes = { }; function RoomSelector({ - name, parentName, roomId, imageSrc, iconSrc, - isSelected, isMuted, isUnread, notificationCount, isAlert, - options, onClick, onContextMenu, + name, + parentName, + roomId, + imageSrc, + iconSrc, + isSelected, + isMuted, + isUnread, + notificationCount, + isAlert, + options, + onClick, + onContextMenu, }) { return ( - {twemojify(name)} + {name} {parentName && ( {' — '} - {twemojify(parentName)} + {parentName} )} - { isUnread && ( + {isUnread && ( )} - )} + } options={options} onClick={onClick} onContextMenu={onContextMenu} @@ -110,10 +124,7 @@ RoomSelector.propTypes = { isSelected: PropTypes.bool, isMuted: PropTypes.bool, isUnread: PropTypes.bool.isRequired, - notificationCount: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.number, - ]).isRequired, + notificationCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, isAlert: PropTypes.bool.isRequired, options: PropTypes.node, onClick: PropTypes.func.isRequired, diff --git a/src/app/molecules/room-tile/RoomTile.jsx b/src/app/molecules/room-tile/RoomTile.jsx index 95481ece..2e0a63f6 100644 --- a/src/app/molecules/room-tile/RoomTile.jsx +++ b/src/app/molecules/room-tile/RoomTile.jsx @@ -2,46 +2,35 @@ import React from 'react'; import PropTypes from 'prop-types'; import './RoomTile.scss'; -import { twemojify } from '../../../util/twemojify'; - import colorMXID from '../../../util/colorMXID'; import Text from '../../atoms/text/Text'; import Avatar from '../../atoms/avatar/Avatar'; -function RoomTile({ - avatarSrc, name, id, - inviterName, memberCount, desc, options, -}) { +function RoomTile({ avatarSrc, name, id, inviterName, memberCount, desc, options }) { return (
    - +
    - {twemojify(name)} + {name} - { - inviterName !== null - ? `Invited by ${inviterName} to ${id}${memberCount === null ? '' : ` • ${memberCount} members`}` - : id + (memberCount === null ? '' : ` • ${memberCount} members`) - } + {inviterName !== null + ? `Invited by ${inviterName} to ${id}${ + memberCount === null ? '' : ` • ${memberCount} members` + }` + : id + (memberCount === null ? '' : ` • ${memberCount} members`)} - { - desc !== null && (typeof desc === 'string') - ? {twemojify(desc, undefined, true)} - : desc - } + {desc !== null && typeof desc === 'string' ? ( + + {desc} + + ) : ( + desc + )}
    - { options !== null && ( -
    - {options} -
    - )} + {options !== null &&
    {options}
    }
    ); } @@ -58,10 +47,7 @@ RoomTile.propTypes = { name: PropTypes.string.isRequired, id: PropTypes.string.isRequired, inviterName: PropTypes.string, - memberCount: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.number, - ]), + memberCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), desc: PropTypes.node, options: PropTypes.node, }; diff --git a/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx b/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx deleted file mode 100644 index bc8b7c8f..00000000 --- a/src/app/molecules/sidebar-avatar/SidebarAvatar.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './SidebarAvatar.scss'; - -import { twemojify } from '../../../util/twemojify'; - -import Text from '../../atoms/text/Text'; -import Tooltip from '../../atoms/tooltip/Tooltip'; -import { blurOnBubbling } from '../../atoms/button/script'; - -const SidebarAvatar = React.forwardRef(({ - className, tooltip, active, onClick, - onContextMenu, avatar, notificationBadge, -}, ref) => { - const classes = ['sidebar-avatar']; - if (active) classes.push('sidebar-avatar--active'); - if (className) classes.push(className); - return ( - {twemojify(tooltip)}} - placement="right" - > - - - ); -}); -SidebarAvatar.defaultProps = { - className: null, - active: false, - onClick: null, - onContextMenu: null, - notificationBadge: null, -}; - -SidebarAvatar.propTypes = { - className: PropTypes.string, - tooltip: PropTypes.string.isRequired, - active: PropTypes.bool, - onClick: PropTypes.func, - onContextMenu: PropTypes.func, - avatar: PropTypes.node.isRequired, - notificationBadge: PropTypes.node, -}; - -export default SidebarAvatar; diff --git a/src/app/molecules/sidebar-avatar/SidebarAvatar.scss b/src/app/molecules/sidebar-avatar/SidebarAvatar.scss deleted file mode 100644 index d76dbc86..00000000 --- a/src/app/molecules/sidebar-avatar/SidebarAvatar.scss +++ /dev/null @@ -1,64 +0,0 @@ -@use '../../partials/dir'; - -.sidebar-avatar { - position: relative; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - - & .notification-badge { - position: absolute; - @include dir.prop(left, unset, 0); - @include dir.prop(right, 0, unset); - top: 0; - box-shadow: 0 0 0 2px var(--bg-surface-low); - @include dir.prop(transform, translate(20%, -20%), translate(-20%, -20%)); - - margin: 0 !important; - } - & .avatar-container, - & .notification-badge { - transition: transform 200ms var(--fluid-push); - } - &:hover .avatar-container { - @include dir.prop(transform, translateX(4px), translateX(-4px)); - } - &:hover .notification-badge { - --ltr: translate(calc(20% + 4px), -20%); - --rtl: translate(calc(-20% - 4px), -20%); - @include dir.prop(transform, var(--ltr), var(--rtl)); - } - &:focus { - outline: none; - } - &:active .avatar-container { - box-shadow: var(--bs-surface-outline); - } - - &:hover::before, - &:focus::before, - &--active::before { - content: ""; - display: block; - position: absolute; - @include dir.prop(left, -11px, unset); - @include dir.prop(right, unset, -11px); - top: 50%; - transform: translateY(-50%); - - width: 3px; - height: 12px; - background-color: var(--tc-surface-high); - @include dir.prop(border-radius, 0 4px 4px 0, 4px 0 0 4px); - transition: height 200ms linear; - } - &--active:hover::before, - &--active:focus::before, - &--active::before { - height: 28px; - } - &--active .avatar-container { - background-color: var(--bg-surface); - } -} \ No newline at end of file diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index 547c0af5..3895ac75 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -1,9 +1,8 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { useAtomValue } from 'jotai'; import './SpaceAddExisting.scss'; -import { twemojify } from '../../../util/twemojify'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; @@ -24,6 +23,9 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import { useStore } from '../../hooks/useStore'; +import { roomToParentsAtom } from '../../state/room/roomToParents'; +import { useDirects, useRooms, useSpaces } from '../../state/hooks/roomList'; +import { allRoomsAtom } from '../../state/room-list/roomList'; function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const mountStore = useStore(roomId); @@ -33,7 +35,10 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const [selected, setSelected] = useState([]); const [searchIds, setSearchIds] = useState(null); const mx = initMatrix.matrixClient; - const { spaces, rooms, directs, roomIdToParents } = initMatrix.roomList; + const roomIdToParents = useAtomValue(roomToParentsAtom); + const spaces = useSpaces(mx, allRoomsAtom); + const rooms = useRooms(mx, allRoomsAtom); + const directs = useDirects(mx, allRoomsAtom); useEffect(() => { const roomIds = onlySpaces ? [...spaces] : [...rooms, ...directs]; @@ -217,7 +222,7 @@ function SpaceAddExisting() { className="space-add-existing" title={ - {room && twemojify(room.name)} + {room && room.name} {' '} — add existing {data?.spaces ? 'spaces' : 'rooms'} diff --git a/src/app/molecules/space-options/SpaceOptions.jsx b/src/app/molecules/space-options/SpaceOptions.jsx deleted file mode 100644 index 0c166c6a..00000000 --- a/src/app/molecules/space-options/SpaceOptions.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import { openSpaceSettings, openSpaceManage, openInviteUser } from '../../../client/action/navigation'; -import { markAsRead } from '../../../client/action/notifications'; -import { leave } from '../../../client/action/room'; -import { - createSpaceShortcut, - deleteSpaceShortcut, - categorizeSpace, - unCategorizeSpace, -} from '../../../client/action/accountData'; - -import { MenuHeader, MenuItem } from '../../atoms/context-menu/ContextMenu'; - -import CategoryIC from '../../../../public/res/ic/outlined/category.svg'; -import CategoryFilledIC from '../../../../public/res/ic/filled/category.svg'; -import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; -import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; -import SettingsIC from '../../../../public/res/ic/outlined/settings.svg'; -import HashSearchIC from '../../../../public/res/ic/outlined/hash-search.svg'; -import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; -import PinIC from '../../../../public/res/ic/outlined/pin.svg'; -import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; - -import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; - -function SpaceOptions({ roomId, afterOptionSelect }) { - const mx = initMatrix.matrixClient; - const { roomList } = initMatrix; - const room = mx.getRoom(roomId); - const canInvite = room?.canInvite(mx.getUserId()); - const isPinned = initMatrix.accountData.spaceShortcut.has(roomId); - const isCategorized = initMatrix.accountData.categorizedSpaces.has(roomId); - - const handleMarkAsRead = () => { - const spaceChildren = roomList.getCategorizedSpaces([roomId]); - spaceChildren?.forEach((childIds) => { - childIds?.forEach((childId) => { - markAsRead(childId); - }); - }); - afterOptionSelect(); - }; - const handleInviteClick = () => { - openInviteUser(roomId); - afterOptionSelect(); - }; - const handlePinClick = () => { - if (isPinned) deleteSpaceShortcut(roomId); - else createSpaceShortcut(roomId); - afterOptionSelect(); - }; - const handleCategorizeClick = () => { - if (isCategorized) unCategorizeSpace(roomId); - else categorizeSpace(roomId); - afterOptionSelect(); - }; - const handleSettingsClick = () => { - openSpaceSettings(roomId); - afterOptionSelect(); - }; - const handleManageRoom = () => { - openSpaceManage(roomId); - afterOptionSelect(); - }; - - const handleLeaveClick = async () => { - afterOptionSelect(); - const isConfirmed = await confirmDialog( - 'Leave space', - `Are you sure that you want to leave "${room.name}" space?`, - 'Leave', - 'danger', - ); - if (!isConfirmed) return; - leave(roomId); - }; - - return ( -
    - {twemojify(`Options for ${initMatrix.matrixClient.getRoom(roomId)?.name}`)} - Mark as read - - {isCategorized ? 'Uncategorize subspaces' : 'Categorize subspaces'} - - - {isPinned ? 'Unpin from sidebar' : 'Pin to sidebar'} - - - Invite - - Manage rooms - Settings - - Leave - -
    - ); -} - -SpaceOptions.defaultProps = { - afterOptionSelect: null, -}; - -SpaceOptions.propTypes = { - roomId: PropTypes.string.isRequired, - afterOptionSelect: PropTypes.func, -}; - -export default SpaceOptions; diff --git a/src/app/molecules/sso-buttons/SSOButtons.jsx b/src/app/molecules/sso-buttons/SSOButtons.jsx deleted file mode 100644 index 0a653be9..00000000 --- a/src/app/molecules/sso-buttons/SSOButtons.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './SSOButtons.scss'; - -import { createTemporaryClient, startSsoLogin } from '../../../client/action/auth'; - -import Button from '../../atoms/button/Button'; - -function SSOButtons({ type, identityProviders, baseUrl }) { - const tempClient = createTemporaryClient(baseUrl); - function handleClick(id) { - startSsoLogin(baseUrl, type, id); - } - return ( -
    - {identityProviders - .sort((idp, idp2) => { - if (typeof idp.icon !== 'string') return -1; - return idp.name.toLowerCase() > idp2.name.toLowerCase() ? 1 : -1; - }) - .map((idp) => ( - idp.icon - ? ( - - ) : - ))} -
    - ); -} - -SSOButtons.propTypes = { - identityProviders: PropTypes.arrayOf( - PropTypes.shape({}), - ).isRequired, - baseUrl: PropTypes.string.isRequired, - type: PropTypes.oneOf(['sso', 'cas']).isRequired, -}; - -export default SSOButtons; diff --git a/src/app/molecules/sso-buttons/SSOButtons.scss b/src/app/molecules/sso-buttons/SSOButtons.scss deleted file mode 100644 index 06506704..00000000 --- a/src/app/molecules/sso-buttons/SSOButtons.scss +++ /dev/null @@ -1,25 +0,0 @@ -.sso-buttons { - display: flex; - justify-content: center; - flex-wrap: wrap; -} - -.sso-btn { - margin: var(--sp-tight); - display: inline-flex; - justify-content: center; - - cursor: pointer; - - &__img { - height: var(--av-small); - width: var(--av-small); - } - &__text-only { - margin-top: var(--sp-normal); - flex-basis: 100%; - & .text { - color: var(--tc-link); - } - } -} \ No newline at end of file diff --git a/src/app/organisms/create-room/CreateRoom.jsx b/src/app/organisms/create-room/CreateRoom.jsx index 15be02d2..ff00cca1 100644 --- a/src/app/organisms/create-room/CreateRoom.jsx +++ b/src/app/organisms/create-room/CreateRoom.jsx @@ -2,11 +2,10 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './CreateRoom.scss'; -import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { selectRoom, openReusableContextMenu } from '../../../client/action/navigation'; +import { openReusableContextMenu } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import { isRoomAliasAvailable, getIdServer } from '../../../util/matrixUtil'; import { getEventCords } from '../../../util/common'; @@ -32,12 +31,14 @@ import SpaceLockIC from '../../../../public/res/ic/outlined/space-lock.svg'; import SpaceGlobeIC from '../../../../public/res/ic/outlined/space-globe.svg'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const [joinRule, setJoinRule] = useState(parentId ? 'restricted' : 'invite'); const [isEncrypted, setIsEncrypted] = useState(true); const [isCreatingRoom, setIsCreatingRoom] = useState(false); const [creatingError, setCreatingError] = useState(null); + const { navigateRoom, navigateSpace } = useRoomNavigate(); const [isValidAddress, setIsValidAddress] = useState(null); const [addressValue, setAddressValue] = useState(undefined); @@ -48,25 +49,6 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const mx = initMatrix.matrixClient; const userHs = getIdServer(mx.getUserId()); - useEffect(() => { - const { roomList } = initMatrix; - const onCreated = (roomId) => { - setIsCreatingRoom(false); - setCreatingError(null); - setIsValidAddress(null); - setAddressValue(undefined); - - if (!mx.getRoom(roomId)?.isSpaceRoom()) { - selectRoom(roomId); - } - onRequestClose(); - }; - roomList.on(cons.events.roomList.ROOM_CREATED, onCreated); - return () => { - roomList.removeListener(cons.events.roomList.ROOM_CREATED, onCreated); - }; - }, []); - const handleSubmit = async (evt) => { evt.preventDefault(); const { target } = evt; @@ -87,16 +69,26 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const powerLevel = roleIndex === 1 ? 101 : undefined; try { - await roomActions.createRoom({ + const data = await roomActions.createRoom({ name, topic, joinRule, alias: roomAlias, - isEncrypted: (isSpace || joinRule === 'public') ? false : isEncrypted, + isEncrypted: isSpace || joinRule === 'public' ? false : isEncrypted, powerLevel, isSpace, parentId, }); + setIsCreatingRoom(false); + setCreatingError(null); + setIsValidAddress(null); + setAddressValue(undefined); + onRequestClose(); + if (isSpace) { + navigateSpace(data.room_id); + } else { + navigateRoom(data.room_id); + } } catch (e) { if (e.message === 'M_UNKNOWN: Invalid characters in room alias') { setCreatingError('ERROR: Invalid characters in address'); @@ -131,36 +123,35 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const joinRules = ['invite', 'restricted', 'public']; const joinRuleShortText = ['Private', 'Restricted', 'Public']; - const joinRuleText = ['Private (invite only)', 'Restricted (space member can join)', 'Public (anyone can join)']; + const joinRuleText = [ + 'Private (invite only)', + 'Restricted (space member can join)', + 'Public (anyone can join)', + ]; const jrRoomIC = [HashLockIC, HashIC, HashGlobeIC]; const jrSpaceIC = [SpaceLockIC, SpaceIC, SpaceGlobeIC]; const handleJoinRule = (evt) => { - openReusableContextMenu( - 'bottom', - getEventCords(evt, '.btn-surface'), - (closeMenu) => ( - <> - Visibility (who can join) - { - joinRules.map((rule) => ( - { closeMenu(); setJoinRule(rule); }} - disabled={!parentId && rule === 'restricted'} - > - { joinRuleText[joinRules.indexOf(rule)] } - - )) - } - - ), - ); + openReusableContextMenu('bottom', getEventCords(evt, '.btn-surface'), (closeMenu) => ( + <> + Visibility (who can join) + {joinRules.map((rule) => ( + { + closeMenu(); + setJoinRule(rule); + }} + disabled={!parentId && rule === 'restricted'} + > + {joinRuleText[joinRules.indexOf(rule)]} + + ))} + + )); }; return ( @@ -168,50 +159,64 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
    {joinRuleShortText[joinRules.indexOf(joinRule)]} - )} - content={{`Select who can join this ${isSpace ? 'space' : 'room'}.`}} + } + content={ + {`Select who can join this ${isSpace ? 'space' : 'room'}.`} + } /> {joinRule === 'public' && (
    - {isSpace ? 'Space address' : 'Room address'} + + {isSpace ? 'Space address' : 'Room address'} +
    # {`:${userHs}`}
    - {isValidAddress === false && {`#${addressValue}:${userHs} is already in use`}} + {isValidAddress === false && ( + + {`#${addressValue}:${userHs} is already in use`} + + )}
    )} {!isSpace && joinRule !== 'public' && ( } - content={You can’t disable this later. Bridges & most bots won’t work yet.} + content={ + + You can’t disable this later. Bridges & most bots won’t work yet. + + } /> )} - )} - content={( + } + content={ Selecting Admin sets 100 power level whereas Founder sets 101. - )} + } />
    @@ -231,7 +236,11 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { {`Creating ${isSpace ? 'space' : 'room'}...`}
    )} - {typeof creatingError === 'string' && {creatingError}} + {typeof creatingError === 'string' && ( + + {creatingError} + + )}
    ); @@ -275,27 +284,22 @@ function CreateRoom() { return ( - {parentId ? twemojify(room.name) : 'Home'} + {parentId ? room.name : 'Home'} {` — create ${isSpace ? 'space' : 'room'}`} - )} + } contentOptions={} onRequestClose={onRequestClose} > - { - create - ? ( - - ) :
    - } + {create ? ( + + ) : ( +
    + )}
    ); } diff --git a/src/app/organisms/emoji-board/EmojiBoard.jsx b/src/app/organisms/emoji-board/EmojiBoard.jsx deleted file mode 100644 index 84c41306..00000000 --- a/src/app/organisms/emoji-board/EmojiBoard.jsx +++ /dev/null @@ -1,356 +0,0 @@ -/* eslint-disable jsx-a11y/no-static-element-interactions */ -/* eslint-disable jsx-a11y/click-events-have-key-events */ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './EmojiBoard.scss'; - -import parse from 'html-react-parser'; -import twemoji from 'twemoji'; -import { emojiGroups, emojis } from './emoji'; -import { getRelevantPacks } from './custom-emoji'; -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import AsyncSearch from '../../../util/AsyncSearch'; -import { addRecentEmoji, getRecentEmojis } from './recent'; -import { TWEMOJI_BASE_URL } from '../../../util/twemojify'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import IconButton from '../../atoms/button/IconButton'; -import Input from '../../atoms/input/Input'; -import ScrollView from '../../atoms/scroll/ScrollView'; - -import SearchIC from '../../../../public/res/ic/outlined/search.svg'; -import RecentClockIC from '../../../../public/res/ic/outlined/recent-clock.svg'; -import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; -import DogIC from '../../../../public/res/ic/outlined/dog.svg'; -import CupIC from '../../../../public/res/ic/outlined/cup.svg'; -import BallIC from '../../../../public/res/ic/outlined/ball.svg'; -import PhotoIC from '../../../../public/res/ic/outlined/photo.svg'; -import BulbIC from '../../../../public/res/ic/outlined/bulb.svg'; -import PeaceIC from '../../../../public/res/ic/outlined/peace.svg'; -import FlagIC from '../../../../public/res/ic/outlined/flag.svg'; - -const ROW_EMOJIS_COUNT = 7; - -const EmojiGroup = React.memo(({ name, groupEmojis }) => { - function getEmojiBoard() { - const emojiBoard = []; - const totalEmojis = groupEmojis.length; - - for (let r = 0; r < totalEmojis; r += ROW_EMOJIS_COUNT) { - const emojiRow = []; - for (let c = r; c < r + ROW_EMOJIS_COUNT; c += 1) { - const emojiIndex = c; - if (emojiIndex >= totalEmojis) break; - const emoji = groupEmojis[emojiIndex]; - emojiRow.push( - - {emoji.hexcode ? ( - // This is a unicode emoji, and should be rendered with twemoji - parse( - twemoji.parse(emoji.unicode, { - attributes: () => ({ - unicode: emoji.unicode, - shortcodes: emoji.shortcodes?.toString(), - hexcode: emoji.hexcode, - loading: 'lazy', - }), - base: TWEMOJI_BASE_URL, - }) - ) - ) : ( - // This is a custom emoji, and should be render as an mxc - {emoji.shortcode} - )} - - ); - } - emojiBoard.push( -
    - {emojiRow} -
    - ); - } - return emojiBoard; - } - - return ( -
    - - {name} - - {groupEmojis.length !== 0 &&
    {getEmojiBoard()}
    } -
    - ); -}); - -EmojiGroup.propTypes = { - name: PropTypes.string.isRequired, - groupEmojis: PropTypes.arrayOf( - PropTypes.shape({ - length: PropTypes.number, - unicode: PropTypes.string, - hexcode: PropTypes.string, - mxc: PropTypes.string, - shortcode: PropTypes.string, - shortcodes: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]), - }) - ).isRequired, -}; - -const asyncSearch = new AsyncSearch(); -asyncSearch.setup(emojis, { keys: ['shortcode'], isContain: true, limit: 40 }); -function SearchedEmoji() { - const [searchedEmojis, setSearchedEmojis] = useState(null); - - function handleSearchEmoji(resultEmojis, term) { - if (term === '' || resultEmojis.length === 0) { - if (term === '') setSearchedEmojis(null); - else setSearchedEmojis({ emojis: [] }); - return; - } - setSearchedEmojis({ emojis: resultEmojis }); - } - - useEffect(() => { - asyncSearch.on(asyncSearch.RESULT_SENT, handleSearchEmoji); - return () => { - asyncSearch.removeListener(asyncSearch.RESULT_SENT, handleSearchEmoji); - }; - }, []); - - if (searchedEmojis === null) return false; - - return ( - - ); -} - -function EmojiBoard({ onSelect, searchRef }) { - const scrollEmojisRef = useRef(null); - const emojiInfo = useRef(null); - - function isTargetNotEmoji(target) { - return target.classList.contains('emoji') === false; - } - function getEmojiDataFromTarget(target) { - const unicode = target.getAttribute('unicode'); - const hexcode = target.getAttribute('hexcode'); - const mxc = target.getAttribute('data-mx-emoticon'); - let shortcodes = target.getAttribute('shortcodes'); - if (typeof shortcodes === 'undefined') shortcodes = undefined; - else shortcodes = shortcodes.split(','); - return { - unicode, - hexcode, - shortcodes, - mxc, - }; - } - - function selectEmoji(e) { - if (isTargetNotEmoji(e.target)) return; - - const emoji = getEmojiDataFromTarget(e.target); - onSelect(emoji); - if (emoji.hexcode) addRecentEmoji(emoji.unicode); - } - - function setEmojiInfo(emoji) { - const infoEmoji = emojiInfo.current.firstElementChild.firstElementChild; - const infoShortcode = emojiInfo.current.lastElementChild; - - infoEmoji.src = emoji.src; - infoEmoji.alt = emoji.unicode; - infoShortcode.textContent = `:${emoji.shortcode}:`; - } - - function hoverEmoji(e) { - if (isTargetNotEmoji(e.target)) return; - - const emoji = e.target; - const { shortcodes, unicode } = getEmojiDataFromTarget(emoji); - const { src } = e.target; - - if (typeof shortcodes === 'undefined') { - searchRef.current.placeholder = 'Search'; - setEmojiInfo({ - unicode: '🙂', - shortcode: 'slight_smile', - src: 'https://twemoji.maxcdn.com/v/13.1.0/72x72/1f642.png', - }); - return; - } - if (searchRef.current.placeholder === shortcodes[0]) return; - searchRef.current.setAttribute('placeholder', shortcodes[0]); - setEmojiInfo({ shortcode: shortcodes[0], src, unicode }); - } - - function handleSearchChange() { - const term = searchRef.current.value; - asyncSearch.search(term); - scrollEmojisRef.current.scrollTop = 0; - } - - const [availableEmojis, setAvailableEmojis] = useState([]); - const [recentEmojis, setRecentEmojis] = useState([]); - - const recentOffset = recentEmojis.length > 0 ? 1 : 0; - - useEffect(() => { - const updateAvailableEmoji = (selectedRoomId) => { - if (!selectedRoomId) { - setAvailableEmojis([]); - return; - } - - const mx = initMatrix.matrixClient; - const room = mx.getRoom(selectedRoomId); - const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); - const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); - if (room) { - const packs = getRelevantPacks(room.client, [room, ...parentRooms]).filter( - (pack) => pack.getEmojis().length !== 0 - ); - - // Set an index for each pack so that we know where to jump when the user uses the nav - for (let i = 0; i < packs.length; i += 1) { - packs[i].packIndex = i; - } - setAvailableEmojis(packs); - } - }; - - const onOpen = () => { - searchRef.current.value = ''; - handleSearchChange(); - - // only update when board is getting opened to prevent shifting UI - setRecentEmojis(getRecentEmojis(3 * ROW_EMOJIS_COUNT)); - }; - - navigation.on(cons.events.navigation.ROOM_SELECTED, updateAvailableEmoji); - navigation.on(cons.events.navigation.EMOJIBOARD_OPENED, onOpen); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SELECTED, updateAvailableEmoji); - navigation.removeListener(cons.events.navigation.EMOJIBOARD_OPENED, onOpen); - }; - }, []); - - function openGroup(groupOrder) { - let tabIndex = groupOrder; - const $emojiContent = scrollEmojisRef.current.firstElementChild; - const groupCount = $emojiContent.childElementCount; - if (groupCount > emojiGroups.length) { - tabIndex += groupCount - emojiGroups.length - availableEmojis.length - recentOffset; - } - $emojiContent.children[tabIndex].scrollIntoView(); - } - - return ( -
    - -
    - {recentEmojis.length > 0 && ( - openGroup(0)} - src={RecentClockIC} - tooltip="Recent" - tooltipPlacement="left" - /> - )} -
    - {availableEmojis.map((pack) => { - const src = initMatrix.matrixClient.mxcUrlToHttp( - pack.avatarUrl ?? pack.getEmojis()[0].mxc - ); - return ( - openGroup(recentOffset + pack.packIndex)} - src={src} - key={pack.packIndex} - tooltip={pack.displayName ?? 'Unknown'} - tooltipPlacement="left" - isImage - /> - ); - })} -
    -
    - {[ - [0, EmojiIC, 'Smilies'], - [1, DogIC, 'Animals'], - [2, CupIC, 'Food'], - [3, BallIC, 'Activities'], - [4, PhotoIC, 'Travel'], - [5, BulbIC, 'Objects'], - [6, PeaceIC, 'Symbols'], - [7, FlagIC, 'Flags'], - ].map(([indx, ico, name]) => ( - openGroup(recentOffset + availableEmojis.length + indx)} - key={indx} - src={ico} - tooltip={name} - tooltipPlacement="left" - /> - ))} -
    -
    -
    -
    -
    - - -
    -
    - -
    - - {recentEmojis.length > 0 && ( - - )} - {availableEmojis.map((pack) => ( - - ))} - {emojiGroups.map((group) => ( - - ))} -
    -
    -
    -
    -
    {parse(twemoji.parse('🙂', { base: TWEMOJI_BASE_URL }))}
    - :slight_smile: -
    -
    -
    - ); -} - -EmojiBoard.propTypes = { - onSelect: PropTypes.func.isRequired, - searchRef: PropTypes.shape({}).isRequired, -}; - -export default EmojiBoard; diff --git a/src/app/organisms/emoji-board/EmojiBoard.scss b/src/app/organisms/emoji-board/EmojiBoard.scss deleted file mode 100644 index 683026f0..00000000 --- a/src/app/organisms/emoji-board/EmojiBoard.scss +++ /dev/null @@ -1,137 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/text'; -@use '../../partials/dir'; - -.emoji-board { - --emoji-board-height: 390px; - --emoji-board-width: 286px; - display: flex; - max-width: 90vw; - max-height: 90vh; - - &__content { - @extend .cp-fx__item-one; - @extend .cp-fx__column; - height: var(--emoji-board-height); - width: var(--emoji-board-width); - } - & > .scrollbar { - width: initial; - height: var(--emoji-board-height); - } - &__nav { - @extend .cp-fx__column; - justify-content: center; - - min-height: 100%; - padding: 4px 6px; - @include dir.side(border, none, 1px solid var(--bg-surface-border)); - - position: relative; - - & .ic-btn-surface { - opacity: 0.8; - } - } - &__nav-custom, - &__nav-twemoji { - @extend .cp-fx__column; - } - &__nav-twemoji { - background-color: var(--bg-surface); - position: sticky; - bottom: -70%; - z-index: 999; - } -} - -.emoji-board__content__search { - padding: var(--sp-extra-tight); - position: relative; - - & .ic-raw { - position: absolute; - @include dir.prop(left, var(--sp-normal), unset); - @include dir.prop(right, unset, var(--sp-normal)); - top: var(--sp-normal); - transform: translateY(1px); - } - - & .input-container { - & .input { - min-width: 100%; - width: 0; - padding: var(--sp-extra-tight) 36px; - border-radius: calc(var(--bo-radius) / 2); - } - } -} -.emoji-board__content__emojis { - @extend .cp-fx__item-one; - @extend .cp-fx__column; -} -.emoji-board__content__info { - margin: 0 var(--sp-extra-tight); - padding: var(--sp-tight) var(--sp-extra-tight); - border-top: 1px solid var(--bg-surface-border); - - display: flex; - align-items: center; - - & > div:first-child { - line-height: 0; - .emoji { - width: 32px; - height: 32px; - object-fit: contain; - } - } - & > p:last-child { - @extend .cp-fx__item-one; - @extend .cp-txt__ellipsis; - margin: 0 var(--sp-tight); - } -} - -.emoji-row { - display: flex; -} - -.emoji-group { - --emoji-padding: 6px; - position: relative; - margin-bottom: var(--sp-normal); - - &__header { - position: sticky; - top: 0; - z-index: 99; - background-color: var(--bg-surface); - - @include dir.side(margin, var(--sp-extra-tight), 0); - padding: var(--sp-extra-tight) var(--sp-ultra-tight); - text-transform: uppercase; - box-shadow: 0 -4px 0 0 var(--bg-surface); - border-bottom: 1px solid var(--bg-surface-border); - } - & .emoji-set { - --left-margin: calc(var(--sp-normal) - var(--emoji-padding)); - --right-margin: calc(var(--sp-extra-tight) - var(--emoji-padding)); - margin: var(--sp-extra-tight); - @include dir.side(margin, var(--left-margin), var(--right-margin)); - } - & .emoji { - max-width: 38px; - max-height: 38px; - width: 100%; - height: 100%; - overflow: hidden; - object-fit: contain; - padding: var(--emoji-padding); - cursor: pointer; - &:hover { - background-color: var(--bg-surface-hover); - border-radius: var(--bo-radius); - } - } -} \ No newline at end of file diff --git a/src/app/organisms/emoji-board/EmojiBoardOpener.jsx b/src/app/organisms/emoji-board/EmojiBoardOpener.jsx deleted file mode 100644 index 32b7a837..00000000 --- a/src/app/organisms/emoji-board/EmojiBoardOpener.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import React, { useEffect, useRef } from 'react'; - -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import settings from '../../../client/state/settings'; - -import ContextMenu from '../../atoms/context-menu/ContextMenu'; -import EmojiBoard from './EmojiBoard'; - -let requestCallback = null; -let isEmojiBoardVisible = false; -function EmojiBoardOpener() { - const openerRef = useRef(null); - const searchRef = useRef(null); - - function openEmojiBoard(cords, requestEmojiCallback) { - if (requestCallback !== null || isEmojiBoardVisible) { - requestCallback = null; - if (cords.detail === 0) openerRef.current.click(); - return; - } - - openerRef.current.style.transform = `translate(${cords.x}px, ${cords.y}px)`; - requestCallback = requestEmojiCallback; - openerRef.current.click(); - } - - function afterEmojiBoardToggle(isVisible) { - isEmojiBoardVisible = isVisible; - if (isVisible) { - if (!settings.isTouchScreenDevice) searchRef.current.focus(); - } else { - setTimeout(() => { - if (!isEmojiBoardVisible) requestCallback = null; - }, 500); - } - } - - function addEmoji(emoji) { - requestCallback(emoji); - } - - useEffect(() => { - navigation.on(cons.events.navigation.EMOJIBOARD_OPENED, openEmojiBoard); - return () => { - navigation.removeListener(cons.events.navigation.EMOJIBOARD_OPENED, openEmojiBoard); - }; - }, []); - - return ( - - )} - afterToggle={afterEmojiBoardToggle} - render={(toggleMenu) => ( - - )} - /> - ); -} - -export default EmojiBoardOpener; diff --git a/src/app/organisms/emoji-board/custom-emoji.js b/src/app/organisms/emoji-board/custom-emoji.js index 09b60522..4ca2088f 100644 --- a/src/app/organisms/emoji-board/custom-emoji.js +++ b/src/app/organisms/emoji-board/custom-emoji.js @@ -1,8 +1,6 @@ -import { emojis } from './emoji'; - // https://github.com/Sorunome/matrix-doc/blob/soru/emotes/proposals/2545-emotes.md -class ImagePack { +export class ImagePack { static parsePack(eventId, packContent) { if (!eventId || typeof packContent?.images !== 'object') { return null; @@ -141,127 +139,4 @@ class ImagePack { } } -function getGlobalImagePacks(mx) { - const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent(); - if (typeof globalContent !== 'object') return []; - const { rooms } = globalContent; - if (typeof rooms !== 'object') return []; - - const roomIds = Object.keys(rooms); - - const packs = roomIds.flatMap((roomId) => { - if (typeof rooms[roomId] !== 'object') return []; - const room = mx.getRoom(roomId); - if (!room) return []; - const stateKeys = Object.keys(rooms[roomId]); - - return stateKeys.map((stateKey) => { - const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); - const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); - if (pack) { - pack.displayName ??= room.name; - pack.avatarUrl ??= room.getMxcAvatarUrl(); - } - return pack; - }).filter((pack) => pack !== null); - }); - - return packs; -} - -function getUserImagePack(mx) { - const accountDataEmoji = mx.getAccountData('im.ponies.user_emotes'); - if (!accountDataEmoji) { - return null; - } - - const userImagePack = ImagePack.parsePack(mx.getUserId(), accountDataEmoji.event.content); - if (userImagePack) userImagePack.displayName ??= 'Personal Emoji'; - return userImagePack; -} - -function getRoomImagePacks(room) { - const dataEvents = room.currentState.getStateEvents('im.ponies.room_emotes'); - - return dataEvents - .map((data) => { - const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); - if (pack) { - pack.displayName ??= room.name; - pack.avatarUrl ??= room.getMxcAvatarUrl(); - } - return pack; - }) - .filter((pack) => pack !== null); -} - -/** - * @param {MatrixClient} mx Provide if you want to include user personal/global pack - * @param {Room[]} rooms Provide rooms if you want to include rooms pack - * @returns {ImagePack[]} packs - */ -function getRelevantPacks(mx, rooms) { - const userPack = mx ? getUserImagePack(mx) : []; - const globalPacks = mx ? getGlobalImagePacks(mx) : []; - const globalPackIds = new Set(globalPacks.map((pack) => pack.id)); - const roomsPack = rooms?.flatMap(getRoomImagePacks) ?? []; - - return [].concat( - userPack ?? [], - globalPacks, - roomsPack.filter((pack) => !globalPackIds.has(pack.id)), - ); -} - -function getShortcodeToEmoji(mx, rooms) { - const allEmoji = new Map(); - - emojis.forEach((emoji) => { - if (Array.isArray(emoji.shortcodes)) { - emoji.shortcodes.forEach((shortcode) => { - allEmoji.set(shortcode, emoji); - }); - } else { - allEmoji.set(emoji.shortcodes, emoji); - } - }); - - getRelevantPacks(mx, rooms) - .flatMap((pack) => pack.getEmojis()) - .forEach((emoji) => { - allEmoji.set(emoji.shortcode, emoji); - }); - - return allEmoji; -} - -function getShortcodeToCustomEmoji(room) { - const allEmoji = new Map(); - - getRelevantPacks(room.client, [room]) - .flatMap((pack) => pack.getEmojis()) - .forEach((emoji) => { - allEmoji.set(emoji.shortcode, emoji); - }); - - return allEmoji; -} - -function getEmojiForCompletion(mx, rooms) { - const allEmoji = new Map(); - getRelevantPacks(mx, rooms) - .flatMap((pack) => pack.getEmojis()) - .forEach((emoji) => { - allEmoji.set(emoji.shortcode, emoji); - }); - - return Array.from(allEmoji.values()).concat(emojis.filter((e) => !allEmoji.has(e.shortcode))); -} - -export { - ImagePack, - getUserImagePack, getGlobalImagePacks, getRoomImagePacks, - getShortcodeToEmoji, getShortcodeToCustomEmoji, - getRelevantPacks, getEmojiForCompletion, -}; diff --git a/src/app/organisms/emoji-board/emoji.js b/src/app/organisms/emoji-board/emoji.js deleted file mode 100644 index 3cbd0b88..00000000 --- a/src/app/organisms/emoji-board/emoji.js +++ /dev/null @@ -1,69 +0,0 @@ -import emojisData from 'emojibase-data/en/compact.json'; -import joypixels from 'emojibase-data/en/shortcodes/joypixels.json'; -import emojibase from 'emojibase-data/en/shortcodes/emojibase.json'; - -const emojiGroups = [{ - name: 'Smileys & people', - order: 0, - emojis: [], -}, { - name: 'Animals & nature', - order: 1, - emojis: [], -}, { - name: 'Food & drinks', - order: 2, - emojis: [], -}, { - name: 'Activity', - order: 3, - emojis: [], -}, { - name: 'Travel & places', - order: 4, - emojis: [], -}, { - name: 'Objects', - order: 5, - emojis: [], -}, { - name: 'Symbols', - order: 6, - emojis: [], -}, { - name: 'Flags', - order: 7, - emojis: [], -}]; -Object.freeze(emojiGroups); - -function addEmoji(emoji, order) { - emojiGroups[order].emojis.push(emoji); -} -function addToGroup(emoji) { - if (emoji.group === 0 || emoji.group === 1) addEmoji(emoji, 0); - else if (emoji.group === 3) addEmoji(emoji, 1); - else if (emoji.group === 4) addEmoji(emoji, 2); - else if (emoji.group === 6) addEmoji(emoji, 3); - else if (emoji.group === 5) addEmoji(emoji, 4); - else if (emoji.group === 7) addEmoji(emoji, 5); - else if (emoji.group === 8 || typeof emoji.group === 'undefined') addEmoji(emoji, 6); - else if (emoji.group === 9) addEmoji(emoji, 7); -} - -const emojis = []; -emojisData.forEach((emoji) => { - const myShortCodes = joypixels[emoji.hexcode] || emojibase[emoji.hexcode]; - if (!myShortCodes) return; - const em = { - ...emoji, - shortcode: Array.isArray(myShortCodes) ? myShortCodes[0] : myShortCodes, - shortcodes: myShortCodes, - }; - addToGroup(em); - emojis.push(em); -}); - -export { - emojis, emojiGroups, -}; diff --git a/src/app/organisms/emoji-board/recent.js b/src/app/organisms/emoji-board/recent.js deleted file mode 100644 index dff67fb0..00000000 --- a/src/app/organisms/emoji-board/recent.js +++ /dev/null @@ -1,36 +0,0 @@ -import initMatrix from '../../../client/initMatrix'; -import { emojis } from './emoji'; - -const eventType = 'io.element.recent_emoji'; - -function getRecentEmojisRaw() { - return initMatrix.matrixClient.getAccountData(eventType)?.getContent().recent_emoji ?? []; -} - -export function getRecentEmojis(limit) { - const res = []; - getRecentEmojisRaw() - .sort((a, b) => b[1] - a[1]) - .find(([unicode]) => { - const emoji = emojis.find((e) => e.unicode === unicode); - if (emoji) return res.push(emoji) >= limit; - return false; - }); - return res; -} - -export function addRecentEmoji(unicode) { - const recent = getRecentEmojisRaw(); - const i = recent.findIndex(([u]) => u === unicode); - let entry; - if (i < 0) { - entry = [unicode, 1]; - } else { - [entry] = recent.splice(i, 1); - entry[1] += 1; - } - recent.unshift(entry); - initMatrix.matrixClient.setAccountData(eventType, { - recent_emoji: recent.slice(0, 100), - }); -} diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 3ae1f294..1b543c05 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './EmojiVerification.scss'; -import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; @@ -30,8 +29,9 @@ function EmojiVerificationContent({ data, requestClose }) { const beginVerification = async () => { if ( - isCrossVerified(mx.deviceId) - && (mx.getCrossSigningId() === null || await mx.crypto.crossSigningInfo.isStoredInKeyCache('self_signing') === false) + isCrossVerified(mx.deviceId) && + (mx.getCrossSigningId() === null || + (await mx.crypto.crossSigningInfo.isStoredInKeyCache('self_signing')) === false) ) { if (!hasPrivateKey(getDefaultSSKey())) { const keyData = await accessSecretStorage('Emoji verification'); @@ -106,16 +106,20 @@ function EmojiVerificationContent({ data, requestClose }) { {sas.sas.emoji.map((emoji, i) => ( // eslint-disable-next-line react/no-array-index-key
    - {twemojify(emoji[0])} + {emoji[0]} {emoji[1]}
    ))}
    - {process ? renderWait() : ( + {process ? ( + renderWait() + ) : ( <> - - + + )}
    @@ -127,9 +131,7 @@ function EmojiVerificationContent({ data, requestClose }) { return (
    Please accept the request from other device. -
    - {renderWait()} -
    +
    {renderWait()}
    ); } @@ -138,11 +140,13 @@ function EmojiVerificationContent({ data, requestClose }) {
    Click accept to start the verification process.
    - { - process - ? renderWait() - : - } + {process ? ( + renderWait() + ) : ( + + )}
    ); @@ -180,19 +184,19 @@ function EmojiVerification() { Emoji verification - )} + } contentOptions={} onRequestClose={requestClose} > - { - data !== null - ? - :
    - } + {data !== null ? ( + + ) : ( +
    + )}
    ); } diff --git a/src/app/organisms/invite-list/InviteList.jsx b/src/app/organisms/invite-list/InviteList.jsx deleted file mode 100644 index 231928fe..00000000 --- a/src/app/organisms/invite-list/InviteList.jsx +++ /dev/null @@ -1,145 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './InviteList.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import * as roomActions from '../../../client/action/room'; -import { selectRoom, selectTab } from '../../../client/action/navigation'; - -import Text from '../../atoms/text/Text'; -import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; -import Spinner from '../../atoms/spinner/Spinner'; -import PopupWindow from '../../molecules/popup-window/PopupWindow'; -import RoomTile from '../../molecules/room-tile/RoomTile'; - -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; - -function InviteList({ isOpen, onRequestClose }) { - const [procInvite, changeProcInvite] = useState(new Set()); - - function acceptInvite(roomId, isDM) { - procInvite.add(roomId); - changeProcInvite(new Set(Array.from(procInvite))); - roomActions.join(roomId, isDM); - } - function rejectInvite(roomId, isDM) { - procInvite.add(roomId); - changeProcInvite(new Set(Array.from(procInvite))); - roomActions.leave(roomId, isDM); - } - function updateInviteList(roomId) { - if (procInvite.has(roomId)) procInvite.delete(roomId); - changeProcInvite(new Set(Array.from(procInvite))); - - const rl = initMatrix.roomList; - const totalInvites = rl.inviteDirects.size + rl.inviteRooms.size + rl.inviteSpaces.size; - const room = initMatrix.matrixClient.getRoom(roomId); - const isRejected = room === null || room?.getMyMembership() !== 'join'; - if (!isRejected) { - if (room.isSpaceRoom()) selectTab(roomId); - else selectRoom(roomId); - onRequestClose(); - } - if (totalInvites === 0) onRequestClose(); - } - - useEffect(() => { - initMatrix.roomList.on(cons.events.roomList.INVITELIST_UPDATED, updateInviteList); - - return () => { - initMatrix.roomList.removeListener(cons.events.roomList.INVITELIST_UPDATED, updateInviteList); - }; - }, [procInvite]); - - function renderRoomTile(roomId) { - const mx = initMatrix.matrixClient; - const myRoom = mx.getRoom(roomId); - if (!myRoom) return null; - const roomName = myRoom.name; - let roomAlias = myRoom.getCanonicalAlias(); - if (!roomAlias) roomAlias = myRoom.roomId; - const inviterName = myRoom.getMember(mx.getUserId())?.events?.member?.getSender?.() ?? ''; - return ( - ) - : ( -
    - - -
    - ) - } - /> - ); - } - - return ( - } - onRequestClose={onRequestClose} - > -
    - { initMatrix.roomList.inviteDirects.size !== 0 && ( -
    - Direct Messages -
    - )} - { - Array.from(initMatrix.roomList.inviteDirects).map((roomId) => { - const myRoom = initMatrix.matrixClient.getRoom(roomId); - if (myRoom === null) return null; - const roomName = myRoom.name; - return ( - ) - : ( -
    - - -
    - ) - } - /> - ); - }) - } - { initMatrix.roomList.inviteSpaces.size !== 0 && ( -
    - Spaces -
    - )} - { Array.from(initMatrix.roomList.inviteSpaces).map(renderRoomTile) } - - { initMatrix.roomList.inviteRooms.size !== 0 && ( -
    - Rooms -
    - )} - { Array.from(initMatrix.roomList.inviteRooms).map(renderRoomTile) } -
    -
    - ); -} - -InviteList.propTypes = { - isOpen: PropTypes.bool.isRequired, - onRequestClose: PropTypes.func.isRequired, -}; - -export default InviteList; diff --git a/src/app/organisms/invite-list/InviteList.scss b/src/app/organisms/invite-list/InviteList.scss deleted file mode 100644 index da1968c3..00000000 --- a/src/app/organisms/invite-list/InviteList.scss +++ /dev/null @@ -1,26 +0,0 @@ -@use '../../partials/dir'; - -.invites-content { - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - - &__subheading { - margin-top: var(--sp-extra-loose); - - & .text { - text-transform: uppercase; - } - &:first-child { - margin-top: var(--sp-tight); - } - } - - & .room-tile { - margin-top: var(--sp-normal); - &__options { - align-self: flex-end; - } - } - & .invite-btn__container .btn-surface { - @include dir.side(margin, 0, var(--sp-normal)); - } -} \ No newline at end of file diff --git a/src/app/organisms/invite-user/InviteUser.jsx b/src/app/organisms/invite-user/InviteUser.jsx index 75195102..10f55f9f 100644 --- a/src/app/organisms/invite-user/InviteUser.jsx +++ b/src/app/organisms/invite-user/InviteUser.jsx @@ -3,10 +3,8 @@ import PropTypes from 'prop-types'; import './InviteUser.scss'; import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; import * as roomActions from '../../../client/action/room'; -import { selectRoom } from '../../../client/action/navigation'; -import { hasDMWith, hasDevices } from '../../../util/matrixUtil'; +import { hasDevices } from '../../../util/matrixUtil'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -18,10 +16,10 @@ import RoomTile from '../../molecules/room-tile/RoomTile'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { getDMRoomFor } from '../../utils/matrix'; -function InviteUser({ - isOpen, roomId, searchTerm, onRequestClose, -}) { +function InviteUser({ isOpen, roomId, searchTerm, onRequestClose }) { const [isSearching, updateIsSearching] = useState(false); const [searchQuery, updateSearchQuery] = useState({}); const [users, updateUsers] = useState([]); @@ -37,6 +35,7 @@ function InviteUser({ const usernameRef = useRef(null); const mx = initMatrix.matrixClient; + const { navigateRoom } = useRoomNavigate(); function getMapCopy(myMap) { const newMap = new Map(); @@ -76,11 +75,13 @@ function InviteUser({ if (isInputUserId) { try { const result = await mx.getProfileInfo(inputUsername); - updateUsers([{ - user_id: inputUsername, - display_name: result.displayname, - avatar_url: result.avatar_url, - }]); + updateUsers([ + { + user_id: inputUsername, + display_name: result.displayname, + avatar_url: result.avatar_url, + }, + ]); } catch (e) { updateSearchQuery({ error: `${inputUsername} not found!` }); } @@ -105,9 +106,9 @@ function InviteUser({ async function createDM(userId) { if (mx.getUserId() === userId) return; - const dmRoomId = hasDMWith(userId); + const dmRoomId = getDMRoomFor(mx, userId)?.roomId; if (dmRoomId) { - selectRoom(dmRoomId); + navigateRoom(dmRoomId); onRequestClose(); return; } @@ -120,6 +121,7 @@ function InviteUser({ const result = await roomActions.createDM(userId, await hasDevices(userId)); roomIdToUserId.set(result.room_id, userId); updateRoomIdToUserId(getMapCopy(roomIdToUserId)); + onDMCreated(result.room_id); } catch (e) { deleteUserFromProc(userId); if (typeof e.message === 'string') procUserError.set(userId, e.message); @@ -150,7 +152,13 @@ function InviteUser({ function renderUserList() { const renderOptions = (userId) => { - const messageJSX = (message, isPositive) => {message}; + const messageJSX = (message, isPositive) => ( + + + {message} + + + ); if (mx.getUserId() === userId) return null; if (procUsers.has(userId)) { @@ -158,7 +166,16 @@ function InviteUser({ } if (createdDM.has(userId)) { // eslint-disable-next-line max-len - return ; + return ( + + ); } if (invitedUserIds.has(userId)) { return messageJSX('Invited', true); @@ -178,13 +195,23 @@ function InviteUser({ } } } - return (typeof roomId === 'string') - ? - : ; + return typeof roomId === 'string' ? ( + + ) : ( + + ); }; const renderError = (userId) => { if (!procUserError.has(userId)) return null; - return {procUserError.get(userId)}; + return ( + + {procUserError.get(userId)} + + ); }; return users.map((user) => { @@ -193,7 +220,11 @@ function InviteUser({ return ( { - initMatrix.roomList.on(cons.events.roomList.ROOM_CREATED, onDMCreated); - return () => { - initMatrix.roomList.removeListener(cons.events.roomList.ROOM_CREATED, onDMCreated); - }; - }, [isOpen, procUsers, createdDM, roomIdToUserId]); - return ( } onRequestClose={onRequestClose} >
    -
    { e.preventDefault(); searchUser(usernameRef.current.value); }}> + { + e.preventDefault(); + searchUser(usernameRef.current.value); + }} + > - +
    - { - typeof searchQuery.username !== 'undefined' && isSearching && ( -
    - - {`Searching for user "${searchQuery.username}"...`} -
    - ) - } - { - typeof searchQuery.username !== 'undefined' && !isSearching && ( - {`Search result for user "${searchQuery.username}"`} - ) - } - { - searchQuery.error && {searchQuery.error} - } + {typeof searchQuery.username !== 'undefined' && isSearching && ( +
    + + {`Searching for user "${searchQuery.username}"...`} +
    + )} + {typeof searchQuery.username !== 'undefined' && !isSearching && ( + {`Search result for user "${searchQuery.username}"`} + )} + {searchQuery.error && ( + + {searchQuery.error} + + )}
    - { users.length !== 0 && ( -
    - {renderUserList()} -
    - )} + {users.length !== 0 &&
    {renderUserList()}
    }
    ); diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx index bc0a8adb..9fa5542d 100644 --- a/src/app/organisms/join-alias/JoinAlias.jsx +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -6,7 +6,6 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { join } from '../../../client/action/room'; -import { selectRoom, selectTab } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; @@ -18,36 +17,24 @@ import Dialog from '../../molecules/dialog/Dialog'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useStore } from '../../hooks/useStore'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; const ALIAS_OR_ID_REG = /^[#|!].+:.+\..+$/; function JoinAliasContent({ term, requestClose }) { const [process, setProcess] = useState(false); const [error, setError] = useState(undefined); - const [lastJoinId, setLastJoinId] = useState(undefined); const mx = initMatrix.matrixClient; const mountStore = useStore(); + const { navigateRoom } = useRoomNavigate(); + const openRoom = (roomId) => { - const room = mx.getRoom(roomId); - if (!room) return; - if (room.isSpaceRoom()) selectTab(roomId); - else selectRoom(roomId); + navigateRoom(roomId); requestClose(); }; - useEffect(() => { - const handleJoin = (roomId) => { - if (lastJoinId !== roomId) return; - openRoom(roomId); - }; - initMatrix.roomList.on(cons.events.roomList.ROOM_JOINED, handleJoin); - return () => { - initMatrix.roomList.removeListener(cons.events.roomList.ROOM_JOINED, handleJoin); - }; - }, [lastJoinId]); - const handleSubmit = async (e) => { e.preventDefault(); mountStore.setItem(true); @@ -70,13 +57,14 @@ function JoinAliasContent({ term, requestClose }) { } catch (err) { if (!mountStore.getItem()) return; setProcess(false); - setError(`Unable to find room/space with ${alias}. Either room/space is private or doesn't exist.`); + setError( + `Unable to find room/space with ${alias}. Either room/space is private or doesn't exist.` + ); } } try { const roomId = await join(alias, false, via); if (!mountStore.getItem()) return; - setLastJoinId(roomId); openRoom(roomId); } catch { if (!mountStore.getItem()) return; @@ -87,24 +75,23 @@ function JoinAliasContent({ term, requestClose }) { return (
    - - {error && {error}} + + {error && ( + + {error} + + )}
    - { - process - ? ( - <> - - {process} - - ) - : - } + {process ? ( + <> + + {process} + + ) : ( + + )}
    ); @@ -141,13 +128,15 @@ function JoinAlias() { return ( Join with address - )} + title={ + + Join with address + + } contentOptions={} onRequestClose={requestClose} > - { data ? :
    } + {data ? :
    }
    ); } diff --git a/src/app/organisms/navigation/Directs.jsx b/src/app/organisms/navigation/Directs.jsx deleted file mode 100644 index e65c8afc..00000000 --- a/src/app/organisms/navigation/Directs.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import Postie from '../../../util/Postie'; -import { roomIdByActivity } from '../../../util/sort'; - -import RoomsCategory from './RoomsCategory'; - -const drawerPostie = new Postie(); -function Directs({ size }) { - const mx = initMatrix.matrixClient; - const { roomList, notifications } = initMatrix; - const [directIds, setDirectIds] = useState([]); - - useEffect(() => setDirectIds([...roomList.directs].sort(roomIdByActivity)), [size]); - - useEffect(() => { - const handleTimeline = (event, room, toStartOfTimeline, removed, data) => { - if (!roomList.directs.has(room.roomId)) return; - if (!data.liveEvent) return; - if (directIds[0] === room.roomId) return; - const newDirectIds = [room.roomId]; - directIds.forEach((id) => { - if (id === room.roomId) return; - newDirectIds.push(id); - }); - setDirectIds(newDirectIds); - }; - mx.on('Room.timeline', handleTimeline); - return () => { - mx.removeListener('Room.timeline', handleTimeline); - }; - }, [directIds]); - - useEffect(() => { - const selectorChanged = (selectedRoomId, prevSelectedRoomId) => { - if (!drawerPostie.hasTopic('selector-change')) return; - const addresses = []; - if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); - if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); - if (addresses.length === 0) return; - drawerPostie.post('selector-change', addresses, selectedRoomId); - }; - - const notiChanged = (roomId, total, prevTotal) => { - if (total === prevTotal) return; - if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { - drawerPostie.post('unread-change', roomId); - } - }; - - navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged); - notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged); - notifications.on(cons.events.notifications.MUTE_TOGGLED, notiChanged); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged); - notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged); - notifications.removeListener(cons.events.notifications.MUTE_TOGGLED, notiChanged); - }; - }, []); - - return ; -} -Directs.propTypes = { - size: PropTypes.number.isRequired, -}; - -export default Directs; diff --git a/src/app/organisms/navigation/Drawer.jsx b/src/app/organisms/navigation/Drawer.jsx deleted file mode 100644 index 0795e469..00000000 --- a/src/app/organisms/navigation/Drawer.jsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import './Drawer.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; - -import Text from '../../atoms/text/Text'; -import ScrollView from '../../atoms/scroll/ScrollView'; - -import DrawerHeader from './DrawerHeader'; -import DrawerBreadcrumb from './DrawerBreadcrumb'; -import Home from './Home'; -import Directs from './Directs'; - -import { useForceUpdate } from '../../hooks/useForceUpdate'; -import { useSelectedTab } from '../../hooks/useSelectedTab'; -import { useSelectedSpace } from '../../hooks/useSelectedSpace'; - -function useSystemState() { - const [systemState, setSystemState] = useState(null); - - useEffect(() => { - const handleSystemState = (state) => { - if (state === 'ERROR' || state === 'RECONNECTING' || state === 'STOPPED') { - setSystemState({ status: 'Connection lost!' }); - } - if (systemState !== null) setSystemState(null); - }; - initMatrix.matrixClient.on('sync', handleSystemState); - return () => { - initMatrix.matrixClient.removeListener('sync', handleSystemState); - }; - }, [systemState]); - - return [systemState]; -} - -function Drawer() { - const [systemState] = useSystemState(); - const [selectedTab] = useSelectedTab(); - const [spaceId] = useSelectedSpace(); - const [, forceUpdate] = useForceUpdate(); - const scrollRef = useRef(null); - const { roomList } = initMatrix; - - useEffect(() => { - const handleUpdate = () => { - forceUpdate(); - }; - roomList.on(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate); - return () => { - roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate); - }; - }, []); - - useEffect(() => { - requestAnimationFrame(() => { - if (scrollRef.current) { - scrollRef.current.scrollTop = 0; - } - }); - }, [selectedTab]); - - return ( -
    - -
    - {navigation.selectedSpacePath.length > 1 && selectedTab !== cons.tabs.DIRECTS && ( - - )} -
    - -
    - {selectedTab !== cons.tabs.DIRECTS ? ( - - ) : ( - - )} -
    -
    -
    -
    - {systemState !== null && ( -
    - {systemState.status} -
    - )} -
    - ); -} - -export default Drawer; diff --git a/src/app/organisms/navigation/Drawer.scss b/src/app/organisms/navigation/Drawer.scss deleted file mode 100644 index 4e54c5fa..00000000 --- a/src/app/organisms/navigation/Drawer.scss +++ /dev/null @@ -1,56 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.drawer { - @extend .cp-fx__column; - @extend .cp-fx__item-one; - min-width: 0; - @include dir.side(border, - none, - 1px solid var(--bg-surface-border), - ); - - & .header { - padding: var(--sp-extra-tight); - & > .header__title-wrapper { - @include dir.side(margin, var(--sp-ultra-tight), 0); - } - } - - &__content-wrapper { - @extend .cp-fx__item-one; - @extend .cp-fx__column; - } - - &__state { - padding: var(--sp-extra-tight); - border-top: 1px solid var(--bg-surface-border); - @extend .cp-fx__row--c-c; - - & .text { - color: var(--tc-danger-high); - } - } -} -.rooms__wrapper { - @extend .cp-fx__item-one; - position: relative; -} - -.rooms-container { - padding-bottom: var(--sp-extra-loose); - - &::before { - position: absolute; - top: 0; - z-index: 99; - content: ''; - display: inline-block; - width: 100%; - height: 8px; - background-image: linear-gradient( - to bottom, - var(--bg-surface-low), - var(--bg-surface-low-transparent)); - } -} diff --git a/src/app/organisms/navigation/DrawerBreadcrumb.jsx b/src/app/organisms/navigation/DrawerBreadcrumb.jsx deleted file mode 100644 index face349d..00000000 --- a/src/app/organisms/navigation/DrawerBreadcrumb.jsx +++ /dev/null @@ -1,142 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './DrawerBreadcrumb.scss'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import { selectTab, selectSpace } from '../../../client/action/navigation'; -import navigation from '../../../client/state/navigation'; -import { abbreviateNumber } from '../../../util/common'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Button from '../../atoms/button/Button'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import NotificationBadge from '../../atoms/badge/NotificationBadge'; - -import ChevronRightIC from '../../../../public/res/ic/outlined/chevron-right.svg'; - -function DrawerBreadcrumb({ spaceId }) { - const [, forceUpdate] = useState({}); - const scrollRef = useRef(null); - const { roomList, notifications, accountData } = initMatrix; - const mx = initMatrix.matrixClient; - const spacePath = navigation.selectedSpacePath; - - function onNotiChanged(roomId, total, prevTotal) { - if (total === prevTotal) return; - if (navigation.selectedSpacePath.includes(roomId)) { - forceUpdate({}); - } - if (navigation.selectedSpacePath[0] === cons.tabs.HOME) { - if (!roomList.isOrphan(roomId)) return; - if (roomList.directs.has(roomId)) return; - forceUpdate({}); - } - } - - useEffect(() => { - requestAnimationFrame(() => { - if (scrollRef?.current === null) return; - scrollRef.current.scrollLeft = scrollRef.current.scrollWidth; - }); - notifications.on(cons.events.notifications.NOTI_CHANGED, onNotiChanged); - return () => { - notifications.removeListener(cons.events.notifications.NOTI_CHANGED, onNotiChanged); - }; - }, [spaceId]); - - function getHomeNotiExcept(childId) { - const orphans = roomList.getOrphans() - .filter((id) => (id !== childId)) - .filter((id) => !accountData.spaceShortcut.has(id)); - - let noti = null; - - orphans.forEach((roomId) => { - if (!notifications.hasNoti(roomId)) return; - if (noti === null) noti = { total: 0, highlight: 0 }; - const childNoti = notifications.getNoti(roomId); - noti.total += childNoti.total; - noti.highlight += childNoti.highlight; - }); - - return noti; - } - - function getNotiExcept(roomId, childId) { - if (!notifications.hasNoti(roomId)) return null; - - const noti = notifications.getNoti(roomId); - if (!notifications.hasNoti(childId)) return noti; - if (noti.from === null) return noti; - - const childNoti = notifications.getNoti(childId); - - let noOther = true; - let total = 0; - let highlight = 0; - noti.from.forEach((fromId) => { - if (childNoti.from.has(fromId)) return; - noOther = false; - const fromNoti = notifications.getNoti(fromId); - total += fromNoti.total; - highlight += fromNoti.highlight; - }); - - if (noOther) return null; - return { total, highlight }; - } - - return ( -
    - -
    - { - spacePath.map((id, index) => { - const noti = (id !== cons.tabs.HOME && index < spacePath.length) - ? getNotiExcept(id, (index === spacePath.length - 1) ? null : spacePath[index + 1]) - : getHomeNotiExcept((index === spacePath.length - 1) ? null : spacePath[index + 1]); - - return ( - - { index !== 0 && } - - - ); - }) - } -
    -
    - -
    - ); -} - -DrawerBreadcrumb.defaultProps = { - spaceId: null, -}; - -DrawerBreadcrumb.propTypes = { - spaceId: PropTypes.string, -}; - -export default DrawerBreadcrumb; diff --git a/src/app/organisms/navigation/DrawerBreadcrumb.scss b/src/app/organisms/navigation/DrawerBreadcrumb.scss deleted file mode 100644 index 0b7bacce..00000000 --- a/src/app/organisms/navigation/DrawerBreadcrumb.scss +++ /dev/null @@ -1,66 +0,0 @@ -@use '../../partials/text'; -@use '../../partials/dir'; - -.drawer-breadcrumb__wrapper { - height: var(--header-height); - position: relative; -} - -.drawer-breadcrumb { - display: flex; - align-items: center; - height: 100%; - margin: 0 var(--sp-extra-tight); - - &::before, - &::after { - flex-shrink: 0; - position: absolute; - right: 0; - z-index: 99; - - content: ''; - display: inline-block; - min-width: 8px; - width: 8px; - height: 100%; - background-image: linear-gradient( - to right, - var(--bg-surface-low-transparent), - var(--bg-surface-low) - ); - } - &::before { - left: 0; - right: unset; - background-image: linear-gradient( - to left, - var(--bg-surface-low-transparent), - var(--bg-surface-low) - ); - } - - & > * { - flex-shrink: 0; - } - - & > .btn-surface { - min-width: 0; - padding: var(--sp-extra-tight) 10px; - white-space: nowrap; - box-shadow: none; - & p { - @extend .cp-txt__ellipsis; - max-width: 86px; - } - - & .notification-badge { - @include dir.side(margin, var(--sp-extra-tight), 0); - } - } - - &__btn--selected { - box-shadow: var(--bs-surface-border) !important; - background-color: var(--bg-surface); - } -} \ No newline at end of file diff --git a/src/app/organisms/navigation/DrawerHeader.jsx b/src/app/organisms/navigation/DrawerHeader.jsx deleted file mode 100644 index e8782e38..00000000 --- a/src/app/organisms/navigation/DrawerHeader.jsx +++ /dev/null @@ -1,159 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './DrawerHeader.scss'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import { - openPublicRooms, openCreateRoom, openSpaceManage, openJoinAlias, - openSpaceAddExisting, openInviteUser, openReusableContextMenu, -} from '../../../client/action/navigation'; -import { getEventCords } from '../../../util/common'; - -import { blurOnBubbling } from '../../atoms/button/script'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Header, { TitleWrapper } from '../../atoms/header/Header'; -import IconButton from '../../atoms/button/IconButton'; -import { MenuItem, MenuHeader } from '../../atoms/context-menu/ContextMenu'; -import SpaceOptions from '../../molecules/space-options/SpaceOptions'; - -import PlusIC from '../../../../public/res/ic/outlined/plus.svg'; -import HashPlusIC from '../../../../public/res/ic/outlined/hash-plus.svg'; -import HashGlobeIC from '../../../../public/res/ic/outlined/hash-globe.svg'; -import HashSearchIC from '../../../../public/res/ic/outlined/hash-search.svg'; -import SpacePlusIC from '../../../../public/res/ic/outlined/space-plus.svg'; -import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; - -export function HomeSpaceOptions({ spaceId, afterOptionSelect }) { - const mx = initMatrix.matrixClient; - const room = mx.getRoom(spaceId); - const canManage = room - ? room.currentState.maySendStateEvent('m.space.child', mx.getUserId()) - : true; - - return ( - <> - Add rooms or spaces - { afterOptionSelect(); openCreateRoom(true, spaceId); }} - disabled={!canManage} - > - Create new space - - { afterOptionSelect(); openCreateRoom(false, spaceId); }} - disabled={!canManage} - > - Create new room - - { !spaceId && ( - { afterOptionSelect(); openPublicRooms(); }} - > - Explore public rooms - - )} - { !spaceId && ( - { afterOptionSelect(); openJoinAlias(); }} - > - Join with address - - )} - { spaceId && ( - { afterOptionSelect(); openSpaceAddExisting(spaceId); }} - disabled={!canManage} - > - Add existing - - )} - { spaceId && ( - { afterOptionSelect(); openSpaceManage(spaceId); }} - iconSrc={HashSearchIC} - > - Manage rooms - - )} - - ); -} -HomeSpaceOptions.defaultProps = { - spaceId: null, -}; -HomeSpaceOptions.propTypes = { - spaceId: PropTypes.string, - afterOptionSelect: PropTypes.func.isRequired, -}; - -function DrawerHeader({ selectedTab, spaceId }) { - const mx = initMatrix.matrixClient; - const tabName = selectedTab !== cons.tabs.DIRECTS ? 'Home' : 'Direct messages'; - - const isDMTab = selectedTab === cons.tabs.DIRECTS; - const room = mx.getRoom(spaceId); - const spaceName = isDMTab ? null : (room?.name || null); - - const openSpaceOptions = (e) => { - e.preventDefault(); - openReusableContextMenu( - 'bottom', - getEventCords(e, '.header'), - (closeMenu) => , - ); - }; - - const openHomeSpaceOptions = (e) => { - e.preventDefault(); - openReusableContextMenu( - 'right', - getEventCords(e, '.ic-btn'), - (closeMenu) => , - ); - }; - - return ( -
    - {spaceName ? ( - - ) : ( - - {tabName} - - )} - - { isDMTab && openInviteUser()} tooltip="Start DM" src={PlusIC} size="small" /> } - { !isDMTab && } -
    - ); -} - -DrawerHeader.defaultProps = { - spaceId: null, -}; -DrawerHeader.propTypes = { - selectedTab: PropTypes.string.isRequired, - spaceId: PropTypes.string, -}; - -export default DrawerHeader; diff --git a/src/app/organisms/navigation/DrawerHeader.scss b/src/app/organisms/navigation/DrawerHeader.scss deleted file mode 100644 index 9ed17e4b..00000000 --- a/src/app/organisms/navigation/DrawerHeader.scss +++ /dev/null @@ -1,28 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.drawer-header__btn { - min-width: 0; - @extend .cp-fx__row--s-c; - @include dir.side(margin, 0, auto); - padding: var(--sp-ultra-tight); - border-radius: calc(var(--bo-radius) / 2); - cursor: pointer; - - & .header__title-wrapper { - @include dir.side(margin, 0, var(--sp-extra-tight)); - } - - @media (hover:hover) { - &:hover { - background-color: var(--bg-surface-hover); - box-shadow: var(--bs-surface-outline); - } - } - &:focus, - &:active { - background-color: var(--bg-surface-active); - box-shadow: var(--bs-surface-outline); - outline: none; - } -} \ No newline at end of file diff --git a/src/app/organisms/navigation/Home.jsx b/src/app/organisms/navigation/Home.jsx deleted file mode 100644 index 6bfa6c0d..00000000 --- a/src/app/organisms/navigation/Home.jsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import Postie from '../../../util/Postie'; -import { roomIdByActivity, roomIdByAtoZ } from '../../../util/sort'; - -import RoomsCategory from './RoomsCategory'; - -import { useCategorizedSpaces } from '../../hooks/useCategorizedSpaces'; - -const drawerPostie = new Postie(); -function Home({ spaceId }) { - const mx = initMatrix.matrixClient; - const { roomList, notifications, accountData } = initMatrix; - const { spaces, rooms, directs } = roomList; - useCategorizedSpaces(); - const isCategorized = accountData.categorizedSpaces.has(spaceId); - - let categories = null; - let spaceIds = []; - let roomIds = []; - let directIds = []; - - if (spaceId) { - const spaceChildIds = roomList.getSpaceChildren(spaceId) ?? []; - spaceIds = spaceChildIds.filter((roomId) => spaces.has(roomId)); - roomIds = spaceChildIds.filter((roomId) => rooms.has(roomId)); - directIds = spaceChildIds.filter((roomId) => directs.has(roomId)); - } else { - spaceIds = roomList.getOrphanSpaces().filter((id) => !accountData.spaceShortcut.has(id)); - roomIds = roomList.getOrphanRooms(); - } - - if (isCategorized) { - categories = roomList.getCategorizedSpaces(spaceIds); - categories.delete(spaceId); - } - - useEffect(() => { - const selectorChanged = (selectedRoomId, prevSelectedRoomId) => { - if (!drawerPostie.hasTopic('selector-change')) return; - const addresses = []; - if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); - if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); - if (addresses.length === 0) return; - drawerPostie.post('selector-change', addresses, selectedRoomId); - }; - - const notiChanged = (roomId, total, prevTotal) => { - if (total === prevTotal) return; - if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { - drawerPostie.post('unread-change', roomId); - } - }; - - navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged); - notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged); - notifications.on(cons.events.notifications.MUTE_TOGGLED, notiChanged); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged); - notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged); - notifications.removeListener(cons.events.notifications.MUTE_TOGGLED, notiChanged); - }; - }, []); - - return ( - <> - { !isCategorized && spaceIds.length !== 0 && ( - - )} - - { roomIds.length !== 0 && ( - - )} - - { directIds.length !== 0 && ( - - )} - - { isCategorized && [...categories.keys()].sort(roomIdByAtoZ).map((catId) => { - const rms = []; - const dms = []; - categories.get(catId).forEach((id) => { - if (directs.has(id)) dms.push(id); - else rms.push(id); - }); - rms.sort(roomIdByAtoZ); - dms.sort(roomIdByActivity); - return ( - - ); - })} - - ); -} -Home.defaultProps = { - spaceId: null, -}; -Home.propTypes = { - spaceId: PropTypes.string, -}; - -export default Home; diff --git a/src/app/organisms/navigation/Navigation.jsx b/src/app/organisms/navigation/Navigation.jsx deleted file mode 100644 index 24bd1bd2..00000000 --- a/src/app/organisms/navigation/Navigation.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import './Navigation.scss'; - -import SideBar from './SideBar'; -import Drawer from './Drawer'; - -function Navigation() { - return ( -
    - - -
    - ); -} - -export default Navigation; diff --git a/src/app/organisms/navigation/Navigation.scss b/src/app/organisms/navigation/Navigation.scss deleted file mode 100644 index 4a932c79..00000000 --- a/src/app/organisms/navigation/Navigation.scss +++ /dev/null @@ -1,7 +0,0 @@ -.navigation { - width: 100%; - height: 100%; - background-color: var(--bg-surface-low); - - display: flex; -} \ No newline at end of file diff --git a/src/app/organisms/navigation/RoomsCategory.jsx b/src/app/organisms/navigation/RoomsCategory.jsx deleted file mode 100644 index b5666512..00000000 --- a/src/app/organisms/navigation/RoomsCategory.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import './RoomsCategory.scss'; - -import initMatrix from '../../../client/initMatrix'; -import { selectSpace, selectRoom, openReusableContextMenu } from '../../../client/action/navigation'; -import { getEventCords } from '../../../util/common'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import IconButton from '../../atoms/button/IconButton'; -import Selector from './Selector'; -import SpaceOptions from '../../molecules/space-options/SpaceOptions'; -import { HomeSpaceOptions } from './DrawerHeader'; - -import PlusIC from '../../../../public/res/ic/outlined/plus.svg'; -import HorizontalMenuIC from '../../../../public/res/ic/outlined/horizontal-menu.svg'; -import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; -import ChevronRightIC from '../../../../public/res/ic/outlined/chevron-right.svg'; - -function RoomsCategory({ - spaceId, name, hideHeader, roomIds, drawerPostie, -}) { - const { spaces, directs } = initMatrix.roomList; - const [isOpen, setIsOpen] = useState(true); - - const openSpaceOptions = (e) => { - e.preventDefault(); - openReusableContextMenu( - 'bottom', - getEventCords(e, '.header'), - (closeMenu) => , - ); - }; - - const openHomeSpaceOptions = (e) => { - e.preventDefault(); - openReusableContextMenu( - 'right', - getEventCords(e, '.ic-btn'), - (closeMenu) => , - ); - }; - - const renderSelector = (roomId) => { - const isSpace = spaces.has(roomId); - const isDM = directs.has(roomId); - - return ( - (isSpace ? selectSpace(roomId) : selectRoom(roomId))} - /> - ); - }; - - return ( -
    - {!hideHeader && ( -
    - - {spaceId && } - {spaceId && } -
    - )} - {(isOpen || hideHeader) && ( -
    - {roomIds.map(renderSelector)} -
    - )} -
    - ); -} -RoomsCategory.defaultProps = { - spaceId: null, - hideHeader: false, -}; -RoomsCategory.propTypes = { - spaceId: PropTypes.string, - name: PropTypes.string.isRequired, - hideHeader: PropTypes.bool, - roomIds: PropTypes.arrayOf(PropTypes.string).isRequired, - drawerPostie: PropTypes.shape({}).isRequired, -}; - -export default RoomsCategory; diff --git a/src/app/organisms/navigation/RoomsCategory.scss b/src/app/organisms/navigation/RoomsCategory.scss deleted file mode 100644 index 841290c5..00000000 --- a/src/app/organisms/navigation/RoomsCategory.scss +++ /dev/null @@ -1,54 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; -@use '../../partials/text'; - -.room-category { - &__header, - &__toggle { - display: flex; - align-items: center; - } - &__header { - margin-top: var(--sp-extra-tight); - - & .ic-btn { - padding: var(--sp-ultra-tight); - border-radius: 4px; - @include dir.side(margin, 0, 5px); - & .ic-raw { - width: 16px; - height: 16px; - background-color: var(--ic-surface-low); - } - } - } - &__toggle { - @extend .cp-fx__item-one; - padding: var(--sp-extra-tight) var(--sp-tight); - cursor: pointer; - - & .ic-raw { - flex-shrink: 0; - width: 12px; - height: 12px; - background-color: var(--ic-surface-low); - @include dir.side(margin, 0, var(--sp-ultra-tight)); - } - & .text { - text-transform: uppercase; - @extend .cp-txt__ellipsis; - } - &:hover .text { - color: var(--tc-surface-normal); - } - } - - &__content:first-child { - margin-top: var(--sp-extra-tight); - } - - & .room-selector { - width: calc(100% - var(--sp-extra-tight)); - @include dir.side(margin, auto, 0); - } -} \ No newline at end of file diff --git a/src/app/organisms/navigation/Selector.jsx b/src/app/organisms/navigation/Selector.jsx deleted file mode 100644 index cb1086ea..00000000 --- a/src/app/organisms/navigation/Selector.jsx +++ /dev/null @@ -1,93 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { openReusableContextMenu } from '../../../client/action/navigation'; -import { getEventCords, abbreviateNumber } from '../../../util/common'; -import { joinRuleToIconSrc } from '../../../util/matrixUtil'; - -import IconButton from '../../atoms/button/IconButton'; -import RoomSelector from '../../molecules/room-selector/RoomSelector'; -import RoomOptions from '../../molecules/room-options/RoomOptions'; -import SpaceOptions from '../../molecules/space-options/SpaceOptions'; - -import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; - -import { useForceUpdate } from '../../hooks/useForceUpdate'; - -function Selector({ - roomId, isDM, drawerPostie, onClick, -}) { - const mx = initMatrix.matrixClient; - const noti = initMatrix.notifications; - const room = mx.getRoom(roomId); - - let imageSrc = room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - if (imageSrc === null) imageSrc = room.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - - const isMuted = noti.getNotiType(roomId) === cons.notifs.MUTE; - - const [, forceUpdate] = useForceUpdate(); - - useEffect(() => { - const unSub1 = drawerPostie.subscribe('selector-change', roomId, forceUpdate); - const unSub2 = drawerPostie.subscribe('unread-change', roomId, forceUpdate); - return () => { - unSub1(); - unSub2(); - }; - }, []); - - const openOptions = (e) => { - e.preventDefault(); - openReusableContextMenu( - 'right', - getEventCords(e, '.room-selector'), - room.isSpaceRoom() - ? (closeMenu) => - : (closeMenu) => , - ); - }; - - return ( - - )} - /> - ); -} - -Selector.defaultProps = { - isDM: true, -}; - -Selector.propTypes = { - roomId: PropTypes.string.isRequired, - isDM: PropTypes.bool, - drawerPostie: PropTypes.shape({}).isRequired, - onClick: PropTypes.func.isRequired, -}; - -export default Selector; diff --git a/src/app/organisms/navigation/SideBar.jsx b/src/app/organisms/navigation/SideBar.jsx deleted file mode 100644 index 53186965..00000000 --- a/src/app/organisms/navigation/SideBar.jsx +++ /dev/null @@ -1,390 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './SideBar.scss'; - -import { DndProvider, useDrag, useDrop } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import colorMXID from '../../../util/colorMXID'; -import { - selectTab, openShortcutSpaces, openInviteList, - openSearch, openSettings, openReusableContextMenu, -} from '../../../client/action/navigation'; -import { moveSpaceShortcut } from '../../../client/action/accountData'; -import { abbreviateNumber, getEventCords } from '../../../util/common'; -import { isCrossVerified } from '../../../util/matrixUtil'; - -import Avatar from '../../atoms/avatar/Avatar'; -import NotificationBadge from '../../atoms/badge/NotificationBadge'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import SidebarAvatar from '../../molecules/sidebar-avatar/SidebarAvatar'; -import SpaceOptions from '../../molecules/space-options/SpaceOptions'; - -import HomeIC from '../../../../public/res/ic/outlined/home.svg'; -import UserIC from '../../../../public/res/ic/outlined/user.svg'; -import AddPinIC from '../../../../public/res/ic/outlined/add-pin.svg'; -import SearchIC from '../../../../public/res/ic/outlined/search.svg'; -import InviteIC from '../../../../public/res/ic/outlined/invite.svg'; -import ShieldUserIC from '../../../../public/res/ic/outlined/shield-user.svg'; - -import { useSelectedTab } from '../../hooks/useSelectedTab'; -import { useDeviceList } from '../../hooks/useDeviceList'; - -import { tabText as settingTabText } from '../settings/Settings'; - -function useNotificationUpdate() { - const { notifications } = initMatrix; - const [, forceUpdate] = useState({}); - useEffect(() => { - function onNotificationChanged(roomId, total, prevTotal) { - if (total === prevTotal) return; - forceUpdate({}); - } - notifications.on(cons.events.notifications.NOTI_CHANGED, onNotificationChanged); - return () => { - notifications.removeListener(cons.events.notifications.NOTI_CHANGED, onNotificationChanged); - }; - }, []); -} - -function ProfileAvatarMenu() { - const mx = initMatrix.matrixClient; - const [profile, setProfile] = useState({ - avatarUrl: null, - displayName: mx.getUser(mx.getUserId()).displayName, - }); - - useEffect(() => { - const user = mx.getUser(mx.getUserId()); - const setNewProfile = (avatarUrl, displayName) => setProfile({ - avatarUrl: avatarUrl || null, - displayName: displayName || profile.displayName, - }); - const onAvatarChange = (event, myUser) => { - setNewProfile(myUser.avatarUrl, myUser.displayName); - }; - mx.getProfileInfo(mx.getUserId()).then((info) => { - setNewProfile(info.avatar_url, info.displayname); - }); - user.on('User.avatarUrl', onAvatarChange); - return () => { - user.removeListener('User.avatarUrl', onAvatarChange); - }; - }, []); - - return ( - - )} - /> - ); -} - -function CrossSigninAlert() { - const deviceList = useDeviceList(); - const unverified = deviceList?.filter((device) => isCrossVerified(device.device_id) === false); - - if (!unverified?.length) return null; - - return ( - openSettings(settingTabText.SECURITY)} - avatar={} - /> - ); -} - -function FeaturedTab() { - const { roomList, accountData, notifications } = initMatrix; - const [selectedTab] = useSelectedTab(); - useNotificationUpdate(); - - function getHomeNoti() { - const orphans = roomList.getOrphans(); - let noti = null; - - orphans.forEach((roomId) => { - if (accountData.spaceShortcut.has(roomId)) return; - if (!notifications.hasNoti(roomId)) return; - if (noti === null) noti = { total: 0, highlight: 0 }; - const childNoti = notifications.getNoti(roomId); - noti.total += childNoti.total; - noti.highlight += childNoti.highlight; - }); - - return noti; - } - function getDMsNoti() { - if (roomList.directs.size === 0) return null; - let noti = null; - - [...roomList.directs].forEach((roomId) => { - if (!notifications.hasNoti(roomId)) return; - if (noti === null) noti = { total: 0, highlight: 0 }; - const childNoti = notifications.getNoti(roomId); - noti.total += childNoti.total; - noti.highlight += childNoti.highlight; - }); - - return noti; - } - - const dmsNoti = getDMsNoti(); - const homeNoti = getHomeNoti(); - - return ( - <> - selectTab(cons.tabs.HOME)} - avatar={} - notificationBadge={homeNoti ? ( - 0} - content={abbreviateNumber(homeNoti.total) || null} - /> - ) : null} - /> - selectTab(cons.tabs.DIRECTS)} - avatar={} - notificationBadge={dmsNoti ? ( - 0} - content={abbreviateNumber(dmsNoti.total) || null} - /> - ) : null} - /> - - ); -} - -function DraggableSpaceShortcut({ - isActive, spaceId, index, moveShortcut, onDrop, -}) { - const mx = initMatrix.matrixClient; - const { notifications } = initMatrix; - const room = mx.getRoom(spaceId); - const shortcutRef = useRef(null); - const avatarRef = useRef(null); - - const openSpaceOptions = (e, sId) => { - e.preventDefault(); - openReusableContextMenu( - 'right', - getEventCords(e, '.sidebar-avatar'), - (closeMenu) => , - ); - }; - - const [, drop] = useDrop({ - accept: 'SPACE_SHORTCUT', - collect(monitor) { - return { - handlerId: monitor.getHandlerId(), - }; - }, - drop(item) { - onDrop(item.index, item.spaceId); - }, - hover(item, monitor) { - if (!shortcutRef.current) return; - - const dragIndex = item.index; - const hoverIndex = index; - if (dragIndex === hoverIndex) return; - - const hoverBoundingRect = shortcutRef.current?.getBoundingClientRect(); - const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; - const clientOffset = monitor.getClientOffset(); - const hoverClientY = clientOffset.y - hoverBoundingRect.top; - - if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { - return; - } - if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { - return; - } - moveShortcut(dragIndex, hoverIndex); - // eslint-disable-next-line no-param-reassign - item.index = hoverIndex; - }, - }); - const [{ isDragging }, drag] = useDrag({ - type: 'SPACE_SHORTCUT', - item: () => ({ spaceId, index }), - collect: (monitor) => ({ - isDragging: monitor.isDragging(), - }), - }); - - drag(avatarRef); - drop(shortcutRef); - - if (shortcutRef.current) { - if (isDragging) shortcutRef.current.style.opacity = 0; - else shortcutRef.current.style.opacity = 1; - } - - return ( - selectTab(spaceId)} - onContextMenu={(e) => openSpaceOptions(e, spaceId)} - avatar={( - - )} - notificationBadge={notifications.hasNoti(spaceId) ? ( - 0} - content={abbreviateNumber(notifications.getTotalNoti(spaceId)) || null} - /> - ) : null} - /> - ); -} - -DraggableSpaceShortcut.propTypes = { - spaceId: PropTypes.string.isRequired, - isActive: PropTypes.bool.isRequired, - index: PropTypes.number.isRequired, - moveShortcut: PropTypes.func.isRequired, - onDrop: PropTypes.func.isRequired, -}; - -function SpaceShortcut() { - const { accountData } = initMatrix; - const [selectedTab] = useSelectedTab(); - useNotificationUpdate(); - const [spaceShortcut, setSpaceShortcut] = useState([...accountData.spaceShortcut]); - - useEffect(() => { - const handleShortcut = () => setSpaceShortcut([...accountData.spaceShortcut]); - accountData.on(cons.events.accountData.SPACE_SHORTCUT_UPDATED, handleShortcut); - return () => { - accountData.removeListener(cons.events.accountData.SPACE_SHORTCUT_UPDATED, handleShortcut); - }; - }, []); - - const moveShortcut = (dragIndex, hoverIndex) => { - const dragSpaceId = spaceShortcut[dragIndex]; - const newShortcuts = [...spaceShortcut]; - newShortcuts.splice(dragIndex, 1); - newShortcuts.splice(hoverIndex, 0, dragSpaceId); - setSpaceShortcut(newShortcuts); - }; - - const handleDrop = (dragIndex, dragSpaceId) => { - if ([...accountData.spaceShortcut][dragIndex] === dragSpaceId) return; - moveSpaceShortcut(dragSpaceId, dragIndex); - }; - - return ( - - { - spaceShortcut.map((shortcut, index) => ( - - )) - } - - ); -} - -function useTotalInvites() { - const { roomList } = initMatrix; - const totalInviteCount = () => roomList.inviteRooms.size - + roomList.inviteSpaces.size - + roomList.inviteDirects.size; - const [totalInvites, updateTotalInvites] = useState(totalInviteCount()); - - useEffect(() => { - const onInviteListChange = () => { - updateTotalInvites(totalInviteCount()); - }; - roomList.on(cons.events.roomList.INVITELIST_UPDATED, onInviteListChange); - return () => { - roomList.removeListener(cons.events.roomList.INVITELIST_UPDATED, onInviteListChange); - }; - }, []); - - return [totalInvites]; -} - -function SideBar() { - const [totalInvites] = useTotalInvites(); - - return ( -
    -
    - -
    -
    - -
    -
    -
    - - openShortcutSpaces()} - avatar={} - /> -
    -
    - -
    -
    -
    -
    - openSearch()} - avatar={} - /> - { totalInvites !== 0 && ( - openInviteList()} - avatar={} - notificationBadge={} - /> - )} - - -
    -
    -
    - ); -} - -export default SideBar; diff --git a/src/app/organisms/navigation/SideBar.scss b/src/app/organisms/navigation/SideBar.scss deleted file mode 100644 index 401947a4..00000000 --- a/src/app/organisms/navigation/SideBar.scss +++ /dev/null @@ -1,75 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.sidebar { - @extend .cp-fx__column; - - width: var(--navigation-sidebar-width); - height: 100%; - background-color: var(--bg-surface-extra-low); - @include dir.side(border, none, 1px solid var(--bg-surface-border)); - - &__scrollable, - &__sticky { - width: 100%; - } - - &__scrollable { - @extend .cp-fx__item-one; - } -} - -.scrollable-content { - &::after { - content: ''; - display: block; - width: 100%; - height: 8px; - - background: transparent; - background-image: linear-gradient( - to top, - var(--bg-surface-extra-low), - var(--bg-surface-extra-low-transparent) - ); - position: sticky; - bottom: -1px; - left: 0; - } -} - -.featured-container, -.space-container, -.sticky-container { - @extend .cp-fx__column--c-c; - - padding: var(--sp-ultra-tight) 0; - - & > .sidebar-avatar, - & > .avatar-container { - margin: calc(var(--sp-tight) / 2) 0; - } -} -.sidebar-divider { - margin: auto; - width: 24px; - height: 1px; - background-color: var(--bg-surface-border); -} - -.sidebar__cross-signin-alert .avatar-container { - box-shadow: var(--bs-danger-border); - animation-name: pushRight; - animation-duration: 400ms; - animation-iteration-count: 30; - animation-direction: alternate; -} - -@keyframes pushRight { - from { - transform: translateX(4px) scale(1); - } - to { - transform: translateX(0) scale(1); - } -} diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index bb7359da..c21c82fa 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -1,6 +1,5 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; -import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import colorMXID from '../../../util/colorMXID'; @@ -22,7 +21,9 @@ function ProfileEditor({ userId }) { const user = mx.getUser(mx.getUserId()); const displayNameRef = useRef(null); - const [avatarSrc, setAvatarSrc] = useState(user.avatarUrl ? mx.mxcUrlToHttp(user.avatarUrl, 80, 80, 'crop') : null); + const [avatarSrc, setAvatarSrc] = useState( + user.avatarUrl ? mx.mxcUrlToHttp(user.avatarUrl, 80, 80, 'crop') : null + ); const [username, setUsername] = useState(user.displayName); const [disabled, setDisabled] = useState(true); @@ -44,7 +45,7 @@ function ProfileEditor({ userId }) { 'Remove avatar', 'Are you sure that you want to remove avatar?', 'Remove', - 'caution', + 'caution' ); if (isConfirmed) { mx.setAvatarUrl(''); @@ -79,7 +80,10 @@ function ProfileEditor({ userId }) {
    { e.preventDefault(); saveDisplayName(); }} + onSubmit={(e) => { + e.preventDefault(); + saveDisplayName(); + }} > - +
    ); @@ -95,7 +101,9 @@ function ProfileEditor({ userId }) { const renderInfo = () => (
    - {twemojify(username) ?? userId} + + {username ?? userId} + handleAvatarUpload(null)} /> - { - isEditing ? renderForm() : renderInfo() - } + {isEditing ? renderForm() : renderInfo()}
    ); } diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index b6ce426e..b19c9c86 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -2,16 +2,17 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './ProfileViewer.scss'; -import { twemojify } from '../../../util/twemojify'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { selectRoom, openReusableContextMenu } from '../../../client/action/navigation'; +import { openReusableContextMenu } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; import { - getUsername, getUsernameOfRoomMember, getPowerLabel, hasDMWith, hasDevices, + getUsername, + getUsernameOfRoomMember, + getPowerLabel, + hasDevices, } from '../../../util/matrixUtil'; import { getEventCords } from '../../../util/common'; import colorMXID from '../../../util/colorMXID'; @@ -33,26 +34,24 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { getDMRoomFor } from '../../utils/matrix'; -function ModerationTools({ - roomId, userId, -}) { +function ModerationTools({ roomId, userId }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); const roomMember = room.getMember(userId); const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel || 0; const powerLevel = roomMember?.powerLevel || 0; - const canIKick = ( - roomMember?.membership === 'join' - && room.currentState.hasSufficientPowerLevelFor('kick', myPowerLevel) - && powerLevel < myPowerLevel - ); - const canIBan = ( - ['join', 'leave'].includes(roomMember?.membership) - && room.currentState.hasSufficientPowerLevelFor('ban', myPowerLevel) - && powerLevel < myPowerLevel - ); + const canIKick = + roomMember?.membership === 'join' && + room.currentState.hasSufficientPowerLevelFor('kick', myPowerLevel) && + powerLevel < myPowerLevel; + const canIBan = + ['join', 'leave'].includes(roomMember?.membership) && + room.currentState.hasSufficientPowerLevelFor('ban', myPowerLevel) && + powerLevel < myPowerLevel; const handleKick = (e) => { e.preventDefault(); @@ -120,13 +119,14 @@ function SessionInfo({ userId }) {
    {devices === null && Loading sessions...} {devices?.length === 0 && No session found.} - {devices !== null && (devices.map((device) => ( - - )))} + {devices !== null && + devices.map((device) => ( + + ))}
    ); } @@ -137,7 +137,11 @@ function SessionInfo({ userId }) { onClick={() => setIsVisible(!isVisible)} iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC} > - {`View ${devices?.length > 0 ? `${devices.length} ${devices.length == 1 ? 'session' : 'sessions'}` : 'sessions'}`} + {`View ${ + devices?.length > 0 + ? `${devices.length} ${devices.length == 1 ? 'session' : 'sessions'}` + : 'sessions' + }`} {renderSessionChips()}
    @@ -155,6 +159,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { const isMountedRef = useRef(true); const mx = initMatrix.matrixClient; + const { navigateRoom } = useRoomNavigate(); const room = mx.getRoom(roomId); const member = room.getMember(userId); const isInvitable = member?.membership !== 'join' && member?.membership !== 'ban'; @@ -164,25 +169,18 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; const userPL = room.getMember(userId)?.powerLevel || 0; - const canIKick = room.currentState.hasSufficientPowerLevelFor('kick', myPowerlevel) && userPL < myPowerlevel; + const canIKick = + room.currentState.hasSufficientPowerLevelFor('kick', myPowerlevel) && userPL < myPowerlevel; const isBanned = member?.membership === 'ban'; const onCreated = (dmRoomId) => { if (isMountedRef.current === false) return; setIsCreatingDM(false); - selectRoom(dmRoomId); + navigateRoom(dmRoomId); onRequestClose(); }; - useEffect(() => { - const { roomList } = initMatrix; - roomList.on(cons.events.roomList.ROOM_CREATED, onCreated); - return () => { - isMountedRef.current = false; - roomList.removeListener(cons.events.roomList.ROOM_CREATED, onCreated); - }; - }, []); useEffect(() => { setIsUserIgnored(initMatrix.matrixClient.isUserIgnored(userId)); setIsIgnoring(false); @@ -191,9 +189,9 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { const openDM = async () => { // Check and open if user already have a DM with userId. - const dmRoomId = hasDMWith(userId); + const dmRoomId = getDMRoomFor(mx, userId)?.roomId; if (dmRoomId) { - selectRoom(dmRoomId); + navigateRoom(dmRoomId); onRequestClose(); return; } @@ -201,7 +199,8 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { // Create new DM try { setIsCreatingDM(true); - await roomActions.createDM(userId, await hasDevices(userId)); + const result = await roomActions.createDM(userId, await hasDevices(userId)); + onCreated(result.room_id); } catch { if (isMountedRef.current === false) return; setIsCreatingDM(false); @@ -246,31 +245,19 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { return (
    - - { isBanned && canIKick && ( - )} - { (isInvited ? canIKick : room.canInvite(mx.getUserId())) && isInvitable && ( - )}
    ); @@ -326,8 +311,8 @@ function useRerenderOnProfileChange(roomId, userId) { useEffect(() => { const handleProfileChange = (mEvent, member) => { if ( - mEvent.getRoomId() === roomId - && (member.userId === userId || member.userId === mx.getUserId()) + mEvent.getRoomId() === roomId && + (member.userId === userId || member.userId === mx.getUserId()) ) { forceUpdate(); } @@ -352,20 +337,22 @@ function ProfileViewer() { const roomMember = room.getMember(userId); const username = roomMember ? getUsernameOfRoomMember(roomMember) : getUsername(userId); const avatarMxc = roomMember?.getMxcAvatarUrl?.() || mx.getUser(userId)?.avatarUrl; - const avatarUrl = (avatarMxc && avatarMxc !== 'null') ? mx.mxcUrlToHttp(avatarMxc, 80, 80, 'crop') : null; + const avatarUrl = + avatarMxc && avatarMxc !== 'null' ? mx.mxcUrlToHttp(avatarMxc, 80, 80, 'crop') : null; const powerLevel = roomMember?.powerLevel || 0; const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel || 0; - const canChangeRole = ( - room.currentState.maySendEvent('m.room.power_levels', mx.getUserId()) - && (powerLevel < myPowerLevel || userId === mx.getUserId()) - ); + const canChangeRole = + room.currentState.maySendEvent('m.room.power_levels', mx.getUserId()) && + (powerLevel < myPowerLevel || userId === mx.getUserId()); const handleChangePowerLevel = async (newPowerLevel) => { if (newPowerLevel === powerLevel) return; - const SHARED_POWER_MSG = 'You will not be able to undo this change as you are promoting the user to have the same power level as yourself. Are you sure?'; - const DEMOTING_MYSELF_MSG = 'You will not be able to undo this change as you are demoting yourself. Are you sure?'; + const SHARED_POWER_MSG = + 'You will not be able to undo this change as you are promoting the user to have the same power level as yourself. Are you sure?'; + const DEMOTING_MYSELF_MSG = + 'You will not be able to undo this change as you are demoting yourself. Are you sure?'; const isSharedPower = newPowerLevel === myPowerLevel; const isDemotingMyself = userId === mx.getUserId(); @@ -374,7 +361,7 @@ function ProfileViewer() { 'Change power level', isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG, 'Change', - 'caution', + 'caution' ); if (!isConfirmed) return; roomActions.setPowerLevel(roomId, userId, newPowerLevel); @@ -384,20 +371,16 @@ function ProfileViewer() { }; const handlePowerSelector = (e) => { - openReusableContextMenu( - 'bottom', - getEventCords(e, '.btn-surface'), - (closeMenu) => ( - { - closeMenu(); - handleChangePowerLevel(pl); - }} - /> - ), - ); + openReusableContextMenu('bottom', getEventCords(e, '.btn-surface'), (closeMenu) => ( + { + closeMenu(); + handleChangePowerLevel(pl); + }} + /> + )); }; return ( @@ -405,8 +388,10 @@ function ProfileViewer() {
    - {twemojify(username)} - {twemojify(userId)} + + {username} + + {userId}
    Role @@ -420,7 +405,7 @@ function ProfileViewer() {
    - { userId !== mx.getUserId() && ( + {userId !== mx.getUserId() && ( )}
    diff --git a/src/app/organisms/public-rooms/PublicRooms.jsx b/src/app/organisms/public-rooms/PublicRooms.jsx deleted file mode 100644 index d1674c32..00000000 --- a/src/app/organisms/public-rooms/PublicRooms.jsx +++ /dev/null @@ -1,295 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './PublicRooms.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import { selectRoom, selectTab } from '../../../client/action/navigation'; -import * as roomActions from '../../../client/action/room'; - -import Text from '../../atoms/text/Text'; -import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; -import Spinner from '../../atoms/spinner/Spinner'; -import Input from '../../atoms/input/Input'; -import PopupWindow from '../../molecules/popup-window/PopupWindow'; -import RoomTile from '../../molecules/room-tile/RoomTile'; - -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; -import HashSearchIC from '../../../../public/res/ic/outlined/hash-search.svg'; - -const SEARCH_LIMIT = 20; - -function TryJoinWithAlias({ alias, onRequestClose }) { - const [status, setStatus] = useState({ - isJoining: false, - error: null, - roomId: null, - tempRoomId: null, - }); - function handleOnRoomAdded(roomId) { - if (status.tempRoomId !== null && status.tempRoomId !== roomId) return; - setStatus({ - isJoining: false, error: null, roomId, tempRoomId: null, - }); - } - - useEffect(() => { - initMatrix.roomList.on(cons.events.roomList.ROOM_JOINED, handleOnRoomAdded); - return () => { - initMatrix.roomList.removeListener(cons.events.roomList.ROOM_JOINED, handleOnRoomAdded); - }; - }, [status]); - - async function joinWithAlias() { - setStatus({ - isJoining: true, error: null, roomId: null, tempRoomId: null, - }); - try { - const roomId = await roomActions.join(alias, false); - setStatus({ - isJoining: true, error: null, roomId: null, tempRoomId: roomId, - }); - } catch (e) { - setStatus({ - isJoining: false, - error: `Unable to join ${alias}. Either room is private or doesn't exist.`, - roomId: null, - tempRoomId: null, - }); - } - } - - return ( -
    - {status.roomId === null && !status.isJoining && status.error === null && ( - - )} - {status.isJoining && ( - <> - - {`Joining ${alias}...`} - - )} - {status.roomId !== null && ( - - )} - {status.error !== null && {status.error}} -
    - ); -} - -TryJoinWithAlias.propTypes = { - alias: PropTypes.string.isRequired, - onRequestClose: PropTypes.func.isRequired, -}; - -function PublicRooms({ isOpen, searchTerm, onRequestClose }) { - const [isSearching, updateIsSearching] = useState(false); - const [isViewMore, updateIsViewMore] = useState(false); - const [publicRooms, updatePublicRooms] = useState([]); - const [nextBatch, updateNextBatch] = useState(undefined); - const [searchQuery, updateSearchQuery] = useState({}); - const [joiningRooms, updateJoiningRooms] = useState(new Set()); - - const roomNameRef = useRef(null); - const hsRef = useRef(null); - const userId = initMatrix.matrixClient.getUserId(); - - async function searchRooms(viewMore) { - let inputRoomName = roomNameRef?.current?.value || searchTerm; - let isInputAlias = false; - if (typeof inputRoomName === 'string') { - isInputAlias = inputRoomName[0] === '#' && inputRoomName.indexOf(':') > 1; - } - const hsFromAlias = (isInputAlias) ? inputRoomName.slice(inputRoomName.indexOf(':') + 1) : null; - let inputHs = hsFromAlias || hsRef?.current?.value; - - if (typeof inputHs !== 'string') inputHs = userId.slice(userId.indexOf(':') + 1); - if (typeof inputRoomName !== 'string') inputRoomName = ''; - - if (isSearching) return; - if (viewMore !== true - && inputRoomName === searchQuery.name - && inputHs === searchQuery.homeserver - ) return; - - updateSearchQuery({ - name: inputRoomName, - homeserver: inputHs, - }); - if (isViewMore !== viewMore) updateIsViewMore(viewMore); - updateIsSearching(true); - - try { - const result = await initMatrix.matrixClient.publicRooms({ - server: inputHs, - limit: SEARCH_LIMIT, - since: viewMore ? nextBatch : undefined, - include_all_networks: true, - filter: { - generic_search_term: inputRoomName, - }, - }); - - const totalRooms = viewMore ? publicRooms.concat(result.chunk) : result.chunk; - updatePublicRooms(totalRooms); - updateNextBatch(result.next_batch); - updateIsSearching(false); - updateIsViewMore(false); - if (totalRooms.length === 0) { - updateSearchQuery({ - error: inputRoomName === '' - ? `No public rooms on ${inputHs}` - : `No result found for "${inputRoomName}" on ${inputHs}`, - alias: isInputAlias ? inputRoomName : null, - }); - } - } catch (e) { - updatePublicRooms([]); - let err = 'Something went wrong!'; - if (e?.httpStatus >= 400 && e?.httpStatus < 500) { - err = e.message; - } - updateSearchQuery({ - error: err, - alias: isInputAlias ? inputRoomName : null, - }); - updateIsSearching(false); - updateNextBatch(undefined); - updateIsViewMore(false); - } - } - - useEffect(() => { - if (isOpen) searchRooms(); - }, [isOpen]); - - function handleOnRoomAdded(roomId) { - if (joiningRooms.has(roomId)) { - joiningRooms.delete(roomId); - updateJoiningRooms(new Set(Array.from(joiningRooms))); - } - } - useEffect(() => { - initMatrix.roomList.on(cons.events.roomList.ROOM_JOINED, handleOnRoomAdded); - return () => { - initMatrix.roomList.removeListener(cons.events.roomList.ROOM_JOINED, handleOnRoomAdded); - }; - }, [joiningRooms]); - - function handleViewRoom(roomId) { - const room = initMatrix.matrixClient.getRoom(roomId); - if (room.isSpaceRoom()) selectTab(roomId); - else selectRoom(roomId); - onRequestClose(); - } - - function joinRoom(roomIdOrAlias) { - joiningRooms.add(roomIdOrAlias); - updateJoiningRooms(new Set(Array.from(joiningRooms))); - roomActions.join(roomIdOrAlias, false); - } - - function renderRoomList(rooms) { - return rooms.map((room) => { - const alias = typeof room.canonical_alias === 'string' ? room.canonical_alias : room.room_id; - const name = typeof room.name === 'string' ? room.name : alias; - const isJoined = initMatrix.matrixClient.getRoom(room.room_id)?.getMyMembership() === 'join'; - return ( - - {isJoined && } - {!isJoined && (joiningRooms.has(room.room_id) ? : )} - - )} - /> - ); - }); - } - - return ( - } - onRequestClose={onRequestClose} - > -
    -
    { e.preventDefault(); searchRooms(); }}> -
    - - -
    - -
    -
    - { - typeof searchQuery.name !== 'undefined' && isSearching && ( - searchQuery.name === '' - ? ( -
    - - {`Loading public rooms from ${searchQuery.homeserver}...`} -
    - ) - : ( -
    - - {`Searching for "${searchQuery.name}" on ${searchQuery.homeserver}...`} -
    - ) - ) - } - { - typeof searchQuery.name !== 'undefined' && !isSearching && ( - searchQuery.name === '' - ? {`Public rooms on ${searchQuery.homeserver}.`} - : {`Search result for "${searchQuery.name}" on ${searchQuery.homeserver}.`} - ) - } - { searchQuery.error && ( - <> - {searchQuery.error} - {typeof searchQuery.alias === 'string' && ( - - )} - - )} -
    - { publicRooms.length !== 0 && ( -
    - { renderRoomList(publicRooms) } -
    - )} - { publicRooms.length !== 0 && publicRooms.length % SEARCH_LIMIT === 0 && ( -
    - { isViewMore !== true && ( - - )} - { isViewMore && } -
    - )} -
    -
    - ); -} - -PublicRooms.defaultProps = { - searchTerm: undefined, -}; - -PublicRooms.propTypes = { - isOpen: PropTypes.bool.isRequired, - searchTerm: PropTypes.string, - onRequestClose: PropTypes.func.isRequired, -}; - -export default PublicRooms; diff --git a/src/app/organisms/public-rooms/PublicRooms.scss b/src/app/organisms/public-rooms/PublicRooms.scss deleted file mode 100644 index dc55c947..00000000 --- a/src/app/organisms/public-rooms/PublicRooms.scss +++ /dev/null @@ -1,85 +0,0 @@ -@use '../../partials/dir'; - -.public-rooms { - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - margin-top: var(--sp-extra-tight); - - &__form { - display: flex; - align-items: flex-end; - - & .btn-primary { - padding: { - top: 11px; - bottom: 11px; - } - } - } - &__input-wrapper { - flex: 1; - min-width: 0; - - display: flex; - @include dir.side(margin, 0, var(--sp-normal)); - - & > div:first-child { - flex: 1; - min-width: 0; - - & .input { - @include dir.prop(border-radius, - var(--bo-radius) 0 0 var(--bo-radius), - 0 var(--bo-radius) var(--bo-radius) 0, - ); - } - } - - & > div:last-child .input { - width: 120px; - @include dir.prop(border-left-width, 0, 1px); - @include dir.prop(border-right-width, 1px, 0); - @include dir.prop(border-radius, - 0 var(--bo-radius) var(--bo-radius) 0, - var(--bo-radius) 0 0 var(--bo-radius), - ); - } - } - - &__search-status { - margin-top: var(--sp-extra-loose); - margin-bottom: var(--sp-tight); - & .donut-spinner { - margin: 0 var(--sp-tight); - } - - .try-join-with-alias { - margin-top: var(--sp-normal); - } - } - &__search-error { - color: var(--bg-danger); - } - &__content { - border-top: 1px solid var(--bg-surface-border); - } - &__view-more { - margin-top: var(--sp-loose); - @include dir.side(margin, calc(var(--av-normal) + var(--sp-normal)), 0); - } - - & .room-tile { - margin-top: var(--sp-normal); - &__options { - align-self: flex-end; - } - } -} - -.try-join-with-alias { - display: flex; - align-items: center; - - & >.text:nth-child(2) { - margin: 0 var(--sp-normal); - } -} \ No newline at end of file diff --git a/src/app/organisms/pw/Dialogs.jsx b/src/app/organisms/pw/Dialogs.jsx index a51d07e1..cc77cf18 100644 --- a/src/app/organisms/pw/Dialogs.jsx +++ b/src/app/organisms/pw/Dialogs.jsx @@ -1,11 +1,8 @@ import React from 'react'; -import ReadReceipts from '../read-receipts/ReadReceipts'; import ProfileViewer from '../profile-viewer/ProfileViewer'; -import ShortcutSpaces from '../shortcut-spaces/ShortcutSpaces'; import SpaceAddExisting from '../../molecules/space-add-existing/SpaceAddExisting'; import Search from '../search/Search'; -import ViewSource from '../view-source/ViewSource'; import CreateRoom from '../create-room/CreateRoom'; import JoinAlias from '../join-alias/JoinAlias'; import EmojiVerification from '../emoji-verification/EmojiVerification'; @@ -15,10 +12,7 @@ import ReusableDialog from '../../molecules/dialog/ReusableDialog'; function Dialogs() { return ( <> - - - diff --git a/src/app/organisms/pw/Windows.jsx b/src/app/organisms/pw/Windows.jsx index 835b7033..3ee99769 100644 --- a/src/app/organisms/pw/Windows.jsx +++ b/src/app/organisms/pw/Windows.jsx @@ -3,35 +3,18 @@ import React, { useState, useEffect } from 'react'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import InviteList from '../invite-list/InviteList'; -import PublicRooms from '../public-rooms/PublicRooms'; import InviteUser from '../invite-user/InviteUser'; import Settings from '../settings/Settings'; import SpaceSettings from '../space-settings/SpaceSettings'; -import SpaceManage from '../space-manage/SpaceManage'; import RoomSettings from '../room/RoomSettings'; function Windows() { - const [isInviteList, changeInviteList] = useState(false); - const [publicRooms, changePublicRooms] = useState({ - isOpen: false, - searchTerm: undefined, - }); const [inviteUser, changeInviteUser] = useState({ isOpen: false, roomId: undefined, term: undefined, }); - function openInviteList() { - changeInviteList(true); - } - function openPublicRooms(searchTerm) { - changePublicRooms({ - isOpen: true, - searchTerm, - }); - } function openInviteUser(roomId, searchTerm) { changeInviteUser({ isOpen: true, @@ -41,24 +24,14 @@ function Windows() { } useEffect(() => { - navigation.on(cons.events.navigation.INVITE_LIST_OPENED, openInviteList); - navigation.on(cons.events.navigation.PUBLIC_ROOMS_OPENED, openPublicRooms); navigation.on(cons.events.navigation.INVITE_USER_OPENED, openInviteUser); return () => { - navigation.removeListener(cons.events.navigation.INVITE_LIST_OPENED, openInviteList); - navigation.removeListener(cons.events.navigation.PUBLIC_ROOMS_OPENED, openPublicRooms); navigation.removeListener(cons.events.navigation.INVITE_USER_OPENED, openInviteUser); }; }, []); return ( <> - changeInviteList(false)} /> - changePublicRooms({ isOpen: false, searchTerm: undefined })} - /> - ); } diff --git a/src/app/organisms/read-receipts/ReadReceipts.jsx b/src/app/organisms/read-receipts/ReadReceipts.jsx deleted file mode 100644 index 1e648e0b..00000000 --- a/src/app/organisms/read-receipts/ReadReceipts.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useState, useEffect } from 'react'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { getUsername, getUsernameOfRoomMember } from '../../../util/matrixUtil'; -import colorMXID from '../../../util/colorMXID'; - -import IconButton from '../../atoms/button/IconButton'; -import PeopleSelector from '../../molecules/people-selector/PeopleSelector'; -import Dialog from '../../molecules/dialog/Dialog'; - -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; -import { openProfileViewer } from '../../../client/action/navigation'; - -function ReadReceipts() { - const [isOpen, setIsOpen] = useState(false); - const [readers, setReaders] = useState([]); - const [roomId, setRoomId] = useState(null); - - useEffect(() => { - const loadReadReceipts = (rId, userIds) => { - setReaders(userIds); - setRoomId(rId); - setIsOpen(true); - }; - navigation.on(cons.events.navigation.READRECEIPTS_OPENED, loadReadReceipts); - return () => { - navigation.removeListener(cons.events.navigation.READRECEIPTS_OPENED, loadReadReceipts); - }; - }, []); - - const handleAfterClose = () => { - setReaders([]); - setRoomId(null); - }; - - function renderPeople(userId) { - const room = initMatrix.matrixClient.getRoom(roomId); - const member = room.getMember(userId); - const getUserDisplayName = () => { - if (room?.getMember(userId)) return getUsernameOfRoomMember(room.getMember(userId)); - return getUsername(userId); - }; - return ( - { - setIsOpen(false); - openProfileViewer(userId, roomId); - }} - avatarSrc={member?.getAvatarUrl(initMatrix.matrixClient.baseUrl, 24, 24, 'crop')} - name={getUserDisplayName(userId)} - color={colorMXID(userId)} - /> - ); - } - - return ( - setIsOpen(false)} - contentOptions={ setIsOpen(false)} tooltip="Close" />} - > -
    - { - readers.map(renderPeople) - } -
    -
    - ); -} - -export default ReadReceipts; diff --git a/src/app/organisms/room/EventLimit.js b/src/app/organisms/room/EventLimit.js deleted file mode 100644 index de87da37..00000000 --- a/src/app/organisms/room/EventLimit.js +++ /dev/null @@ -1,35 +0,0 @@ -class EventLimit { - constructor() { - this._from = 0; - - this.SMALLEST_EVT_HEIGHT = 32; - this.PAGES_COUNT = 4; - } - - get maxEvents() { - return Math.round(document.body.clientHeight / this.SMALLEST_EVT_HEIGHT) * this.PAGES_COUNT; - } - - get from() { - return this._from; - } - - get length() { - return this._from + this.maxEvents; - } - - setFrom(from) { - this._from = from < 0 ? 0 : from; - } - - paginate(backwards, limit, timelineLength) { - this._from = backwards ? this._from - limit : this._from + limit; - - if (!backwards && this.length > timelineLength) { - this._from = timelineLength - this.maxEvents; - } - if (this._from < 0) this._from = 0; - } -} - -export default EventLimit; diff --git a/src/app/organisms/room/PeopleDrawer.jsx b/src/app/organisms/room/PeopleDrawer.jsx deleted file mode 100644 index 8f983247..00000000 --- a/src/app/organisms/room/PeopleDrawer.jsx +++ /dev/null @@ -1,215 +0,0 @@ -import React, { - useState, useEffect, useCallback, useRef, -} from 'react'; -import PropTypes from 'prop-types'; -import './PeopleDrawer.scss'; - -import initMatrix from '../../../client/initMatrix'; -import { getPowerLabel, getUsernameOfRoomMember } from '../../../util/matrixUtil'; -import colorMXID from '../../../util/colorMXID'; -import { openInviteUser, openProfileViewer } from '../../../client/action/navigation'; -import AsyncSearch from '../../../util/AsyncSearch'; -import { memberByAtoZ, memberByPowerLevel } from '../../../util/sort'; - -import Text from '../../atoms/text/Text'; -import Header, { TitleWrapper } from '../../atoms/header/Header'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import IconButton from '../../atoms/button/IconButton'; -import Button from '../../atoms/button/Button'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import Input from '../../atoms/input/Input'; -import SegmentedControl from '../../atoms/segmented-controls/SegmentedControls'; -import PeopleSelector from '../../molecules/people-selector/PeopleSelector'; - -import AddUserIC from '../../../../public/res/ic/outlined/add-user.svg'; -import SearchIC from '../../../../public/res/ic/outlined/search.svg'; -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; - -function simplyfiMembers(members) { - const mx = initMatrix.matrixClient; - return members.map((member) => ({ - userId: member.userId, - name: getUsernameOfRoomMember(member), - username: member.userId.slice(1, member.userId.indexOf(':')), - avatarSrc: member.getAvatarUrl(mx.baseUrl, 24, 24, 'crop'), - peopleRole: getPowerLabel(member.powerLevel), - powerLevel: members.powerLevel, - })); -} - -const asyncSearch = new AsyncSearch(); -function PeopleDrawer({ roomId }) { - const PER_PAGE_MEMBER = 50; - const mx = initMatrix.matrixClient; - const room = mx.getRoom(roomId); - const canInvite = room?.canInvite(mx.getUserId()); - - const [itemCount, setItemCount] = useState(PER_PAGE_MEMBER); - const [membership, setMembership] = useState('join'); - const [memberList, setMemberList] = useState([]); - const [searchedMembers, setSearchedMembers] = useState(null); - const searchRef = useRef(null); - - const getMembersWithMembership = useCallback( - (mship) => room.getMembersWithMembership(mship), - [roomId, membership], - ); - - function loadMorePeople() { - setItemCount(itemCount + PER_PAGE_MEMBER); - } - - function handleSearchData(data) { - // NOTICE: data is passed as object property - // because react sucks at handling state update with array. - setSearchedMembers({ data }); - setItemCount(PER_PAGE_MEMBER); - } - - function handleSearch(e) { - const term = e.target.value; - if (term === '' || term === undefined) { - searchRef.current.value = ''; - searchRef.current.focus(); - setSearchedMembers(null); - setItemCount(PER_PAGE_MEMBER); - } else asyncSearch.search(term); - } - - useEffect(() => { - asyncSearch.setup(memberList, { - keys: ['name', 'username', 'userId'], - limit: PER_PAGE_MEMBER, - }); - }, [memberList]); - - useEffect(() => { - let isLoadingMembers = false; - let isRoomChanged = false; - const updateMemberList = (event) => { - if (isLoadingMembers) return; - if (event && event?.getRoomId() !== roomId) return; - setMemberList( - simplyfiMembers( - getMembersWithMembership(membership) - .sort(memberByAtoZ).sort(memberByPowerLevel), - ), - ); - }; - searchRef.current.value = ''; - updateMemberList(); - isLoadingMembers = true; - room.loadMembersIfNeeded().then(() => { - isLoadingMembers = false; - if (isRoomChanged) return; - updateMemberList(); - }); - - asyncSearch.on(asyncSearch.RESULT_SENT, handleSearchData); - mx.on('RoomMember.membership', updateMemberList); - mx.on('RoomMember.powerLevel', updateMemberList); - return () => { - isRoomChanged = true; - setMemberList([]); - setSearchedMembers(null); - setItemCount(PER_PAGE_MEMBER); - asyncSearch.removeListener(asyncSearch.RESULT_SENT, handleSearchData); - mx.removeListener('RoomMember.membership', updateMemberList); - mx.removeListener('RoomMember.powerLevel', updateMemberList); - }; - }, [roomId, membership]); - - useEffect(() => { - setMembership('join'); - }, [roomId]); - - const mList = searchedMembers !== null ? searchedMembers.data : memberList.slice(0, itemCount); - return ( -
    -
    - - - People - {`${room.getJoinedMemberCount()} members`} - - - openInviteUser(roomId)} tooltip="Invite" src={AddUserIC} disabled={!canInvite} /> -
    -
    -
    - -
    - { - const getSegmentIndex = { - join: 0, - invite: 1, - ban: 2, - }; - return getSegmentIndex[membership]; - })() - } - segments={[{ text: 'Joined' }, { text: 'Invited' }, { text: 'Banned' }]} - onSelect={(index) => { - const selectSegment = [ - () => setMembership('join'), - () => setMembership('invite'), - () => setMembership('ban'), - ]; - selectSegment[index]?.(); - }} - /> - { - mList.map((member) => ( - openProfileViewer(member.userId, roomId)} - avatarSrc={member.avatarSrc} - name={member.name} - color={colorMXID(member.userId)} - peopleRole={member.peopleRole} - /> - )) - } - { - (searchedMembers?.data.length === 0 || memberList.length === 0) - && ( -
    - No results found! -
    - ) - } -
    - { - mList.length !== 0 - && memberList.length > itemCount - && searchedMembers === null - && ( - - ) - } -
    -
    -
    -
    -
    -
    e.preventDefault()} className="people-search"> - - - { - searchedMembers !== null - && - } - -
    -
    -
    - ); -} - -PeopleDrawer.propTypes = { - roomId: PropTypes.string.isRequired, -}; - -export default PeopleDrawer; diff --git a/src/app/organisms/room/PeopleDrawer.scss b/src/app/organisms/room/PeopleDrawer.scss deleted file mode 100644 index cfc5f6c9..00000000 --- a/src/app/organisms/room/PeopleDrawer.scss +++ /dev/null @@ -1,93 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.people-drawer { - @extend .cp-fx__column; - width: var(--people-drawer-width); - background-color: var(--bg-surface-low); - @include dir.side(border, 1px solid var(--bg-surface-border), none); - - &__member-count { - color: var(--tc-surface-low); - } - - &__content-wrapper { - @extend .cp-fx__item-one; - @extend .cp-fx__column; - } - - &__scrollable { - @extend .cp-fx__item-one; - } - - &__noresult { - padding: var(--sp-extra-tight) var(--sp-normal); - text-align: center; - } - - &__sticky { - & .people-search { - --search-input-height: 40px; - min-height: var(--search-input-height); - - margin: 0 var(--sp-extra-tight); - - position: relative; - bottom: var(--sp-normal); - display: flex; - align-items: center; - - & > .ic-raw, - & > .ic-btn { - position: absolute; - z-index: 99; - } - & > .ic-raw { - @include dir.prop(left, var(--sp-tight), unset); - @include dir.prop(right, unset, var(--sp-tight)); - } - & > .ic-btn { - @include dir.prop(right, 2px, unset); - @include dir.prop(left, unset, 2px); - } - & .input-container { - flex: 1; - } - & .input { - padding: 0 44px; - height: var(--search-input-height); - } - } - } -} - -.people-drawer__content { - padding-top: var(--sp-extra-tight); - padding-bottom: calc(2 * var(--sp-normal)); - - & .people-selector { - padding: var(--sp-extra-tight); - border-radius: var(--bo-radius); - &__container { - @include dir.side(margin, var(--sp-extra-tight), 0); - } - } - - & .segmented-controls { - display: flex; - margin-bottom: var(--sp-extra-tight); - @include dir.side(margin, var(--sp-extra-tight), 0); - } - & .segment-btn { - flex: 1; - padding: var(--sp-ultra-tight) 0; - } -} -.people-drawer__load-more { - padding: var(--sp-normal) 0 0; - @include dir.side(padding, var(--sp-normal), var(--sp-extra-tight)); - - & .btn-surface { - width: 100%; - } -} \ No newline at end of file diff --git a/src/app/organisms/room/Room.scss b/src/app/organisms/room/Room.scss deleted file mode 100644 index 69f8f9dd..00000000 --- a/src/app/organisms/room/Room.scss +++ /dev/null @@ -1,20 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/screen'; - -.room { - @extend .cp-fx__row; - height: 100%; - flex-grow: 1; - - &__content { - @extend .cp-fx__item-one; - position: relative; - overflow: hidden; - } -} - -.room .people-drawer { - @include screen.smallerThan(tabletBreakpoint) { - display: none; - } -} diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 1e617ae7..2b8f28e6 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -5,7 +5,6 @@ import './RoomSettings.scss'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; import Tabs from '../../atoms/tabs/Tabs'; @@ -86,7 +85,7 @@ function GeneralSettings({ roomId }) { 'danger' ); if (!isConfirmed) return; - roomActions.leave(roomId); + mx.leave(roomId); }} iconSrc={LeaveArrowIC} > diff --git a/src/app/organisms/room/RoomView.scss b/src/app/organisms/room/RoomView.scss deleted file mode 100644 index c70c2b09..00000000 --- a/src/app/organisms/room/RoomView.scss +++ /dev/null @@ -1,46 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/screen'; -@use '../../partials/dir'; - -.room-view { - @extend .cp-fx__column; - background-color: var(--bg-surface); - height: 100%; - width: 100%; - position: absolute; - top: 0; - z-index: 999; - box-shadow: none; - - transition: transform 200ms var(--fluid-slide-down); - - &--dropped { - transform: translateY(calc(100% - var(--header-height))); - border-radius: var(--bo-radius) var(--bo-radius) 0 0; - box-shadow: var(--bs-popup); - } - - & .header { - @include screen.smallerThan(mobileBreakpoint) { - padding: 0 var(--sp-tight); - } - } - - &__content-wrapper { - @extend .cp-fx__item-one; - @extend .cp-fx__column; - } - - &__scrollable { - @extend .cp-fx__item-one; - position: relative; - } - - &__sticky { - position: relative; - background: var(--bg-surface); - } - &__editor { - padding: 0 var(--sp-normal); - } -} diff --git a/src/app/organisms/room/RoomViewCmdBar.jsx b/src/app/organisms/room/RoomViewCmdBar.jsx deleted file mode 100644 index 0d21123b..00000000 --- a/src/app/organisms/room/RoomViewCmdBar.jsx +++ /dev/null @@ -1,297 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './RoomViewCmdBar.scss'; -import parse from 'html-react-parser'; -import twemoji from 'twemoji'; - -import { twemojify, TWEMOJI_BASE_URL } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import { getEmojiForCompletion } from '../emoji-board/custom-emoji'; -import AsyncSearch from '../../../util/AsyncSearch'; - -import Text from '../../atoms/text/Text'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import FollowingMembers from '../../molecules/following-members/FollowingMembers'; -import { addRecentEmoji, getRecentEmojis } from '../emoji-board/recent'; -import commands from './commands'; - -function CmdItem({ onClick, children }) { - return ( - - ); -} -CmdItem.propTypes = { - onClick: PropTypes.func.isRequired, - children: PropTypes.node.isRequired, -}; - -function renderSuggestions({ prefix, option, suggestions }, fireCmd) { - function renderCmdSuggestions(cmdPrefix, cmds) { - const cmdOptString = typeof option === 'string' ? `/${option}` : '/?'; - return cmds.map((cmd) => ( - { - fireCmd({ - prefix: cmdPrefix, - option, - result: commands[cmd], - }); - }} - > - {`${cmd}${cmd.isOptions ? cmdOptString : ''}`} - - )); - } - - function renderEmojiSuggestion(emPrefix, emos) { - const mx = initMatrix.matrixClient; - - // Renders a small Twemoji - function renderTwemoji(emoji) { - return parse( - twemoji.parse(emoji.unicode, { - attributes: () => ({ - unicode: emoji.unicode, - shortcodes: emoji.shortcodes?.toString(), - }), - base: TWEMOJI_BASE_URL, - }) - ); - } - - // Render a custom emoji - function renderCustomEmoji(emoji) { - return ( - {`:${emoji.shortcode}:`} - ); - } - - // Dynamically render either a custom emoji or twemoji based on what the input is - function renderEmoji(emoji) { - if (emoji.mxc) { - return renderCustomEmoji(emoji); - } - return renderTwemoji(emoji); - } - - return emos.map((emoji) => ( - - fireCmd({ - prefix: emPrefix, - result: emoji, - }) - } - > - {renderEmoji(emoji)} - {`:${emoji.shortcode}:`} - - )); - } - - function renderNameSuggestion(namePrefix, members) { - return members.map((member) => ( - { - fireCmd({ - prefix: namePrefix, - result: member, - }); - }} - > - {twemojify(member.name)} - - )); - } - - const cmd = { - '/': (cmds) => renderCmdSuggestions(prefix, cmds), - ':': (emos) => renderEmojiSuggestion(prefix, emos), - '@': (members) => renderNameSuggestion(prefix, members), - }; - return cmd[prefix]?.(suggestions); -} - -const asyncSearch = new AsyncSearch(); -let cmdPrefix; -let cmdOption; -function RoomViewCmdBar({ roomId, roomTimeline, viewEvent }) { - const [cmd, setCmd] = useState(null); - - function displaySuggestions(suggestions) { - if (suggestions.length === 0) { - setCmd({ prefix: cmd?.prefix || cmdPrefix, error: 'No suggestion found.' }); - viewEvent.emit('cmd_error'); - return; - } - setCmd({ prefix: cmd?.prefix || cmdPrefix, suggestions, option: cmdOption }); - } - - function processCmd(prefix, slug) { - let searchTerm = slug; - cmdOption = undefined; - cmdPrefix = prefix; - if (prefix === '/') { - const cmdSlugParts = slug.split('/'); - [searchTerm, cmdOption] = cmdSlugParts; - } - if (prefix === ':') { - if (searchTerm.length <= 3) { - if (searchTerm.match(/^[-]?(\))$/)) searchTerm = 'smile'; - else if (searchTerm.match(/^[-]?(s|S)$/)) searchTerm = 'confused'; - else if (searchTerm.match(/^[-]?(o|O|0)$/)) searchTerm = 'astonished'; - else if (searchTerm.match(/^[-]?(\|)$/)) searchTerm = 'neutral_face'; - else if (searchTerm.match(/^[-]?(d|D)$/)) searchTerm = 'grin'; - else if (searchTerm.match(/^[-]?(\/)$/)) searchTerm = 'frown'; - else if (searchTerm.match(/^[-]?(p|P)$/)) searchTerm = 'stuck_out_tongue'; - else if (searchTerm.match(/^'[-]?(\()$/)) searchTerm = 'cry'; - else if (searchTerm.match(/^[-]?(x|X)$/)) searchTerm = 'dizzy_face'; - else if (searchTerm.match(/^[-]?(\()$/)) searchTerm = 'pleading_face'; - else if (searchTerm.match(/^[-]?(\$)$/)) searchTerm = 'money'; - else if (searchTerm.match(/^(<3)$/)) searchTerm = 'heart'; - else if (searchTerm.match(/^(c|ca|cat)$/)) searchTerm = '_cat'; - } - } - - asyncSearch.search(searchTerm); - } - function activateCmd(prefix) { - cmdPrefix = prefix; - cmdPrefix = undefined; - - const mx = initMatrix.matrixClient; - const setupSearch = { - '/': () => { - asyncSearch.setup(Object.keys(commands), { isContain: true }); - setCmd({ prefix, suggestions: Object.keys(commands) }); - }, - ':': () => { - const parentIds = initMatrix.roomList.getAllParentSpaces(roomId); - const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); - const emojis = getEmojiForCompletion(mx, [mx.getRoom(roomId), ...parentRooms]); - const recentEmoji = getRecentEmojis(20); - asyncSearch.setup(emojis, { keys: ['shortcode'], isContain: true, limit: 20 }); - setCmd({ - prefix, - suggestions: recentEmoji.length > 0 ? recentEmoji : emojis.slice(26, 46), - }); - }, - '@': () => { - const members = mx - .getRoom(roomId) - .getJoinedMembers() - .map((member) => ({ - name: member.name, - userId: member.userId.slice(1), - })); - asyncSearch.setup(members, { keys: ['name', 'userId'], limit: 20 }); - const endIndex = members.length > 20 ? 20 : members.length; - setCmd({ prefix, suggestions: members.slice(0, endIndex) }); - }, - }; - setupSearch[prefix]?.(); - } - function deactivateCmd() { - setCmd(null); - cmdOption = undefined; - cmdPrefix = undefined; - } - function fireCmd(myCmd) { - if (myCmd.prefix === '/') { - viewEvent.emit('cmd_fired', { - replace: `/${myCmd.result.name}`, - }); - } - if (myCmd.prefix === ':') { - if (!myCmd.result.mxc) addRecentEmoji(myCmd.result.unicode); - viewEvent.emit('cmd_fired', { - replace: myCmd.result.mxc ? `:${myCmd.result.shortcode}: ` : myCmd.result.unicode, - }); - } - if (myCmd.prefix === '@') { - viewEvent.emit('cmd_fired', { - replace: `@${myCmd.result.userId}`, - }); - } - deactivateCmd(); - } - - function listenKeyboard(event) { - const { activeElement } = document; - const lastCmdItem = document.activeElement.parentNode.lastElementChild; - if (event.key === 'Escape') { - if (activeElement.className !== 'cmd-item') return; - viewEvent.emit('focus_msg_input'); - } - if (event.key === 'Tab') { - if (lastCmdItem.className !== 'cmd-item') return; - if (lastCmdItem !== activeElement) return; - if (event.shiftKey) return; - viewEvent.emit('focus_msg_input'); - event.preventDefault(); - } - } - - useEffect(() => { - viewEvent.on('cmd_activate', activateCmd); - viewEvent.on('cmd_deactivate', deactivateCmd); - return () => { - deactivateCmd(); - viewEvent.removeListener('cmd_activate', activateCmd); - viewEvent.removeListener('cmd_deactivate', deactivateCmd); - }; - }, [roomId]); - - useEffect(() => { - if (cmd !== null) document.body.addEventListener('keydown', listenKeyboard); - viewEvent.on('cmd_process', processCmd); - asyncSearch.on(asyncSearch.RESULT_SENT, displaySuggestions); - return () => { - if (cmd !== null) document.body.removeEventListener('keydown', listenKeyboard); - - viewEvent.removeListener('cmd_process', processCmd); - asyncSearch.removeListener(asyncSearch.RESULT_SENT, displaySuggestions); - }; - }, [cmd]); - - const isError = typeof cmd?.error === 'string'; - if (cmd === null || isError) { - return ( -
    - -
    - ); - } - - return ( -
    -
    - TAB -
    -
    - -
    {renderSuggestions(cmd, fireCmd)}
    -
    -
    -
    - ); -} -RoomViewCmdBar.propTypes = { - roomId: PropTypes.string.isRequired, - roomTimeline: PropTypes.shape({}).isRequired, - viewEvent: PropTypes.shape({}).isRequired, -}; - -export default RoomViewCmdBar; diff --git a/src/app/organisms/room/RoomViewCmdBar.scss b/src/app/organisms/room/RoomViewCmdBar.scss deleted file mode 100644 index 3f03fb06..00000000 --- a/src/app/organisms/room/RoomViewCmdBar.scss +++ /dev/null @@ -1,57 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/text'; -@use '../../partials/dir'; - -.cmd-bar { - --cmd-bar-height: 28px; - min-height: var(--cmd-bar-height); - display: flex; - - &__info { - display: flex; - width: 40px; - @include dir.side(margin, 14px, 10px); - - & > * { - margin: auto; - } - } - - &__content { - @extend .cp-fx__item-one; - display: flex; - - &-suggestions { - height: 100%; - white-space: nowrap; - display: flex; - align-items: center; - - & > .text { - @extend .cp-txt__ellipsis; - } - } - } -} - -.cmd-item { - --cmd-item-bar: inset 0 -2px 0 0 var(--bg-caution); - height: 100%; - @include dir.side(margin, 0, var(--sp-extra-tight)); - padding: 0 var(--sp-extra-tight); - border-radius: var(--bo-radius) var(--bo-radius) 0 0; - cursor: pointer; - - display: inline-flex; - align-items: center; - - &:hover { - background-color: var(--bg-caution-hover); - } - &:focus { - background-color: var(--bg-caution-active); - box-shadow: var(--cmd-item-bar); - border-bottom: 2px solid transparent; - outline: none; - } -} \ No newline at end of file diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx deleted file mode 100644 index 5726fe11..00000000 --- a/src/app/organisms/room/RoomViewContent.jsx +++ /dev/null @@ -1,644 +0,0 @@ -/* eslint-disable jsx-a11y/no-static-element-interactions */ -/* eslint-disable jsx-a11y/click-events-have-key-events */ -/* eslint-disable react/prop-types */ -import React, { - useState, useEffect, useLayoutEffect, useCallback, useRef, -} from 'react'; -import PropTypes from 'prop-types'; -import './RoomViewContent.scss'; - -import dateFormat from 'dateformat'; -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { openProfileViewer } from '../../../client/action/navigation'; -import { diffMinutes, isInSameDay, Throttle } from '../../../util/common'; -import { markAsRead } from '../../../client/action/notifications'; - -import Divider from '../../atoms/divider/Divider'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import { Message, PlaceholderMessage } from '../../molecules/message/Message'; -import RoomIntro from '../../molecules/room-intro/RoomIntro'; -import TimelineChange from '../../molecules/message/TimelineChange'; - -import { useStore } from '../../hooks/useStore'; -import { useForceUpdate } from '../../hooks/useForceUpdate'; -import { parseTimelineChange } from './common'; -import TimelineScroll from './TimelineScroll'; -import EventLimit from './EventLimit'; -import { getResizeObserverEntry, useResizeObserver } from '../../hooks/useResizeObserver'; - -const PAG_LIMIT = 30; -const MAX_MSG_DIFF_MINUTES = 5; -const PLACEHOLDER_COUNT = 2; -const PLACEHOLDERS_HEIGHT = 96 * PLACEHOLDER_COUNT; -const SCROLL_TRIGGER_POS = PLACEHOLDERS_HEIGHT * 4; - -function loadingMsgPlaceholders(key, count = 2) { - const pl = []; - const genPlaceholders = () => { - for (let i = 0; i < count; i += 1) { - pl.push(); - } - return pl; - }; - - return ( - - {genPlaceholders()} - - ); -} - -function RoomIntroContainer({ event, timeline }) { - const [, nameForceUpdate] = useForceUpdate(); - const mx = initMatrix.matrixClient; - const { roomList } = initMatrix; - const { room } = timeline; - const roomTopic = room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic; - const isDM = roomList.directs.has(timeline.roomId); - let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop'); - avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc; - - const heading = isDM ? room.name : `Welcome to ${room.name}`; - const topic = twemojify(roomTopic || '', undefined, true); - const nameJsx = twemojify(room.name); - const desc = isDM - ? ( - <> - This is the beginning of your direct message history with @ - {nameJsx} - {'. '} - {topic} - - ) - : ( - <> - {'This is the beginning of the '} - {nameJsx} - {' room. '} - {topic} - - ); - - useEffect(() => { - const handleUpdate = () => nameForceUpdate(); - - roomList.on(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate); - return () => { - roomList.removeListener(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate); - }; - }, []); - - return ( - - ); -} - -function handleOnClickCapture(e) { - const { target, nativeEvent } = e; - - const userId = target.getAttribute('data-mx-pill'); - if (userId) { - const roomId = navigation.selectedRoomId; - openProfileViewer(userId, roomId); - } - - const spoiler = nativeEvent.composedPath().find((el) => el?.hasAttribute?.('data-mx-spoiler')); - if (spoiler) { - if (!spoiler.classList.contains('data-mx-spoiler--visible')) e.preventDefault(); - spoiler.classList.toggle('data-mx-spoiler--visible'); - } -} - -function renderEvent( - roomTimeline, - mEvent, - prevMEvent, - isFocus, - isEdit, - setEdit, - cancelEdit, -) { - const isBodyOnly = (prevMEvent !== null - && prevMEvent.getSender() === mEvent.getSender() - && prevMEvent.getType() !== 'm.room.member' - && prevMEvent.getType() !== 'm.room.create' - && diffMinutes(mEvent.getDate(), prevMEvent.getDate()) <= MAX_MSG_DIFF_MINUTES - ); - const timestamp = mEvent.getTs(); - - if (mEvent.getType() === 'm.room.member') { - const timelineChange = parseTimelineChange(mEvent); - if (timelineChange === null) return
    ; - return ( - - ); - } - return ( - - ); -} - -function useTimeline(roomTimeline, eventId, readUptoEvtStore, eventLimitRef) { - const [timelineInfo, setTimelineInfo] = useState(null); - - const setEventTimeline = async (eId) => { - if (typeof eId === 'string') { - const isLoaded = await roomTimeline.loadEventTimeline(eId); - if (isLoaded) return; - // if eventTimeline failed to load, - // we will load live timeline as fallback. - } - roomTimeline.loadLiveTimeline(); - }; - - useEffect(() => { - const limit = eventLimitRef.current; - const initTimeline = (eId) => { - // NOTICE: eId can be id of readUpto, reply or specific event. - // readUpTo: when user click jump to unread message button. - // reply: when user click reply from timeline. - // specific event when user open a link of event. behave same as ^^^^ - const readUpToId = roomTimeline.getReadUpToEventId(); - let focusEventIndex = -1; - const isSpecificEvent = eId && eId !== readUpToId; - - if (isSpecificEvent) { - focusEventIndex = roomTimeline.getEventIndex(eId); - } - if (!readUptoEvtStore.getItem() && roomTimeline.hasEventInTimeline(readUpToId)) { - // either opening live timeline or jump to unread. - readUptoEvtStore.setItem(roomTimeline.findEventByIdInTimelineSet(readUpToId)); - } - if (readUptoEvtStore.getItem() && !isSpecificEvent) { - focusEventIndex = roomTimeline.getUnreadEventIndex(readUptoEvtStore.getItem().getId()); - } - - if (focusEventIndex > -1) { - limit.setFrom(focusEventIndex - Math.round(limit.maxEvents / 2)); - } else { - limit.setFrom(roomTimeline.timeline.length - limit.maxEvents); - } - setTimelineInfo({ focusEventId: isSpecificEvent ? eId : null }); - }; - - roomTimeline.on(cons.events.roomTimeline.READY, initTimeline); - setEventTimeline(eventId); - return () => { - roomTimeline.removeListener(cons.events.roomTimeline.READY, initTimeline); - limit.setFrom(0); - }; - }, [roomTimeline, eventId]); - - return timelineInfo; -} - -function usePaginate( - roomTimeline, - readUptoEvtStore, - forceUpdateLimit, - timelineScrollRef, - eventLimitRef, -) { - const [info, setInfo] = useState(null); - - useEffect(() => { - const handlePaginatedFromServer = (backwards, loaded) => { - const limit = eventLimitRef.current; - if (loaded === 0) return; - if (!readUptoEvtStore.getItem()) { - const readUpToId = roomTimeline.getReadUpToEventId(); - readUptoEvtStore.setItem(roomTimeline.findEventByIdInTimelineSet(readUpToId)); - } - limit.paginate(backwards, PAG_LIMIT, roomTimeline.timeline.length); - setTimeout(() => setInfo({ - backwards, - loaded, - })); - }; - roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer); - return () => { - roomTimeline.removeListener(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer); - }; - }, [roomTimeline]); - - const autoPaginate = useCallback(async () => { - const timelineScroll = timelineScrollRef.current; - const limit = eventLimitRef.current; - if (roomTimeline.isOngoingPagination) return; - const tLength = roomTimeline.timeline.length; - - if (timelineScroll.bottom < SCROLL_TRIGGER_POS) { - if (limit.length < tLength) { - // paginate from memory - limit.paginate(false, PAG_LIMIT, tLength); - forceUpdateLimit(); - } else if (roomTimeline.canPaginateForward()) { - // paginate from server. - await roomTimeline.paginateTimeline(false, PAG_LIMIT); - return; - } - } - if (timelineScroll.top < SCROLL_TRIGGER_POS) { - if (limit.from > 0) { - // paginate from memory - limit.paginate(true, PAG_LIMIT, tLength); - forceUpdateLimit(); - } else if (roomTimeline.canPaginateBackward()) { - // paginate from server. - await roomTimeline.paginateTimeline(true, PAG_LIMIT); - } - } - }, [roomTimeline]); - - return [info, autoPaginate]; -} - -function useHandleScroll( - roomTimeline, - autoPaginate, - readUptoEvtStore, - forceUpdateLimit, - timelineScrollRef, - eventLimitRef, -) { - const handleScroll = useCallback(() => { - const timelineScroll = timelineScrollRef.current; - const limit = eventLimitRef.current; - requestAnimationFrame(() => { - // emit event to toggle scrollToBottom button visibility - const isAtBottom = ( - timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward() - && limit.length >= roomTimeline.timeline.length - ); - roomTimeline.emit(cons.events.roomTimeline.AT_BOTTOM, isAtBottom); - if (isAtBottom && readUptoEvtStore.getItem()) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - } - }); - autoPaginate(); - }, [roomTimeline]); - - const handleScrollToLive = useCallback(() => { - const timelineScroll = timelineScrollRef.current; - const limit = eventLimitRef.current; - if (readUptoEvtStore.getItem()) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - } - if (roomTimeline.isServingLiveTimeline()) { - limit.setFrom(roomTimeline.timeline.length - limit.maxEvents); - timelineScroll.scrollToBottom(); - forceUpdateLimit(); - return; - } - roomTimeline.loadLiveTimeline(); - }, [roomTimeline]); - - return [handleScroll, handleScrollToLive]; -} - -function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, eventLimitRef) { - const myUserId = initMatrix.matrixClient.getUserId(); - const [newEvent, setEvent] = useState(null); - - useEffect(() => { - const timelineScroll = timelineScrollRef.current; - const limit = eventLimitRef.current; - const trySendReadReceipt = (event) => { - if (myUserId === event.getSender()) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - return; - } - const readUpToEvent = readUptoEvtStore.getItem(); - const readUpToId = roomTimeline.getReadUpToEventId(); - const isUnread = readUpToEvent ? readUpToEvent?.getId() === readUpToId : true; - - if (isUnread === false) { - if (document.visibilityState === 'visible' && timelineScroll.bottom < 16) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - } else { - readUptoEvtStore.setItem(roomTimeline.findEventByIdInTimelineSet(readUpToId)); - } - return; - } - - const { timeline } = roomTimeline; - const unreadMsgIsLast = timeline[timeline.length - 2].getId() === readUpToId; - if (unreadMsgIsLast) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - } - }; - - const handleEvent = (event) => { - const tLength = roomTimeline.timeline.length; - const isViewingLive = roomTimeline.isServingLiveTimeline() && limit.length >= tLength - 1; - const isAttached = timelineScroll.bottom < SCROLL_TRIGGER_POS; - - if (isViewingLive && isAttached && document.hasFocus()) { - limit.setFrom(tLength - limit.maxEvents); - trySendReadReceipt(event); - setEvent(event); - return; - } - const isRelates = (event.getType() === 'm.reaction' || event.getRelation()?.rel_type === 'm.replace'); - if (isRelates) { - setEvent(event); - return; - } - - if (isViewingLive) { - // This stateUpdate will help to put the - // loading msg placeholder at bottom - setEvent(event); - } - }; - - const handleEventRedact = (event) => setEvent(event); - - roomTimeline.on(cons.events.roomTimeline.EVENT, handleEvent); - roomTimeline.on(cons.events.roomTimeline.EVENT_REDACTED, handleEventRedact); - return () => { - roomTimeline.removeListener(cons.events.roomTimeline.EVENT, handleEvent); - roomTimeline.removeListener(cons.events.roomTimeline.EVENT_REDACTED, handleEventRedact); - }; - }, [roomTimeline]); - - return newEvent; -} - -let jumpToItemIndex = -1; - -function RoomViewContent({ roomInputRef, eventId, roomTimeline }) { - const [throttle] = useState(new Throttle()); - - const timelineSVRef = useRef(null); - const timelineScrollRef = useRef(null); - const eventLimitRef = useRef(null); - const [editEventId, setEditEventId] = useState(null); - const cancelEdit = () => setEditEventId(null); - - const readUptoEvtStore = useStore(roomTimeline); - const [onLimitUpdate, forceUpdateLimit] = useForceUpdate(); - - const timelineInfo = useTimeline(roomTimeline, eventId, readUptoEvtStore, eventLimitRef); - const [paginateInfo, autoPaginate] = usePaginate( - roomTimeline, - readUptoEvtStore, - forceUpdateLimit, - timelineScrollRef, - eventLimitRef, - ); - const [handleScroll, handleScrollToLive] = useHandleScroll( - roomTimeline, - autoPaginate, - readUptoEvtStore, - forceUpdateLimit, - timelineScrollRef, - eventLimitRef, - ); - const newEvent = useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, eventLimitRef); - - const { timeline } = roomTimeline; - - useLayoutEffect(() => { - if (!roomTimeline.initialized) { - timelineScrollRef.current = new TimelineScroll(timelineSVRef.current); - eventLimitRef.current = new EventLimit(); - } - }); - - // when active timeline changes - useEffect(() => { - if (!roomTimeline.initialized) return undefined; - const timelineScroll = timelineScrollRef.current; - - if (timeline.length > 0) { - if (jumpToItemIndex === -1) { - timelineScroll.scrollToBottom(); - } else { - timelineScroll.scrollToIndex(jumpToItemIndex, 80); - } - if (timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward()) { - const readUpToId = roomTimeline.getReadUpToEventId(); - if (readUptoEvtStore.getItem()?.getId() === readUpToId || readUpToId === null) { - requestAnimationFrame(() => markAsRead(roomTimeline.roomId)); - } - } - jumpToItemIndex = -1; - } - autoPaginate(); - - roomTimeline.on(cons.events.roomTimeline.SCROLL_TO_LIVE, handleScrollToLive); - return () => { - if (timelineSVRef.current === null) return; - roomTimeline.removeListener(cons.events.roomTimeline.SCROLL_TO_LIVE, handleScrollToLive); - }; - }, [timelineInfo]); - - // when paginating from server - useEffect(() => { - if (!roomTimeline.initialized) return; - const timelineScroll = timelineScrollRef.current; - timelineScroll.tryRestoringScroll(); - autoPaginate(); - }, [paginateInfo]); - - // when paginating locally - useEffect(() => { - if (!roomTimeline.initialized) return; - const timelineScroll = timelineScrollRef.current; - timelineScroll.tryRestoringScroll(); - }, [onLimitUpdate]); - - useEffect(() => { - const timelineScroll = timelineScrollRef.current; - if (!roomTimeline.initialized) return; - if (timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward() && document.visibilityState === 'visible') { - timelineScroll.scrollToBottom(); - } else { - timelineScroll.tryRestoringScroll(); - } - }, [newEvent]); - - useResizeObserver( - useCallback((entries) => { - if (!roomInputRef.current) return; - const editorBaseEntry = getResizeObserverEntry(roomInputRef.current, entries); - if (!editorBaseEntry) return; - - const timelineScroll = timelineScrollRef.current; - if (!roomTimeline.initialized) return; - if (timelineScroll.bottom < 40 && !roomTimeline.canPaginateForward() && document.visibilityState === 'visible') { - timelineScroll.scrollToBottom(); - } - }, [roomInputRef]), - useCallback(() => roomInputRef.current, [roomInputRef]), - ); - - const listenKeyboard = useCallback((event) => { - if (event.ctrlKey || event.altKey || event.metaKey) return; - if (event.key !== 'ArrowUp') return; - if (navigation.isRawModalVisible) return; - - if (document.activeElement.id !== 'message-textarea') return; - if (document.activeElement.value !== '') return; - - const { - timeline: tl, activeTimeline, liveTimeline, matrixClient: mx, - } = roomTimeline; - const limit = eventLimitRef.current; - if (activeTimeline !== liveTimeline) return; - if (tl.length > limit.length) return; - - const mTypes = ['m.text']; - for (let i = tl.length - 1; i >= 0; i -= 1) { - const mE = tl[i]; - if ( - mE.getSender() === mx.getUserId() - && mE.getType() === 'm.room.message' - && mTypes.includes(mE.getContent()?.msgtype) - ) { - setEditEventId(mE.getId()); - return; - } - } - }, [roomTimeline]); - - useEffect(() => { - document.body.addEventListener('keydown', listenKeyboard); - return () => { - document.body.removeEventListener('keydown', listenKeyboard); - }; - }, [listenKeyboard]); - - const handleTimelineScroll = (event) => { - const timelineScroll = timelineScrollRef.current; - if (!event.target) return; - - throttle._(() => { - const backwards = timelineScroll?.calcScroll(); - if (typeof backwards !== 'boolean') return; - handleScroll(backwards); - }, 200)(); - }; - - const renderTimeline = () => { - const tl = []; - const limit = eventLimitRef.current; - - let itemCountIndex = 0; - jumpToItemIndex = -1; - const readUptoEvent = readUptoEvtStore.getItem(); - let unreadDivider = false; - - if (roomTimeline.canPaginateBackward() || limit.from > 0) { - tl.push(loadingMsgPlaceholders(1, PLACEHOLDER_COUNT)); - itemCountIndex += PLACEHOLDER_COUNT; - } - for (let i = limit.from; i < limit.length; i += 1) { - if (i >= timeline.length) break; - const mEvent = timeline[i]; - const prevMEvent = timeline[i - 1] ?? null; - - if (i === 0 && !roomTimeline.canPaginateBackward()) { - if (mEvent.getType() === 'm.room.create') { - tl.push( - , - ); - itemCountIndex += 1; - // eslint-disable-next-line no-continue - continue; - } else { - tl.push(); - itemCountIndex += 1; - } - } - - let isNewEvent = false; - if (!unreadDivider) { - unreadDivider = (readUptoEvent - && prevMEvent?.getTs() <= readUptoEvent.getTs() - && readUptoEvent.getTs() < mEvent.getTs()); - if (unreadDivider) { - isNewEvent = true; - tl.push(); - itemCountIndex += 1; - if (jumpToItemIndex === -1) jumpToItemIndex = itemCountIndex; - } - } - const dayDivider = prevMEvent && !isInSameDay(mEvent.getDate(), prevMEvent.getDate()); - if (dayDivider) { - tl.push(); - itemCountIndex += 1; - } - - const focusId = timelineInfo.focusEventId; - const isFocus = focusId === mEvent.getId(); - if (isFocus) jumpToItemIndex = itemCountIndex; - - tl.push(renderEvent( - roomTimeline, - mEvent, - isNewEvent ? null : prevMEvent, - isFocus, - editEventId === mEvent.getId(), - setEditEventId, - cancelEdit, - )); - itemCountIndex += 1; - } - if (roomTimeline.canPaginateForward() || limit.length < timeline.length) { - tl.push(loadingMsgPlaceholders(2, PLACEHOLDER_COUNT)); - } - - return tl; - }; - - return ( - -
    -
    - { roomTimeline.initialized ? renderTimeline() : loadingMsgPlaceholders('loading', 3) } -
    -
    -
    - ); -} - -RoomViewContent.defaultProps = { - eventId: null, -}; -RoomViewContent.propTypes = { - eventId: PropTypes.string, - roomTimeline: PropTypes.shape({}).isRequired, - roomInputRef: PropTypes.shape({ - current: PropTypes.shape({}) - }).isRequired -}; - -export default RoomViewContent; diff --git a/src/app/organisms/room/RoomViewContent.scss b/src/app/organisms/room/RoomViewContent.scss deleted file mode 100644 index 1afd187e..00000000 --- a/src/app/organisms/room/RoomViewContent.scss +++ /dev/null @@ -1,30 +0,0 @@ -@use '../../partials/dir'; - -.room-view__content { - min-height: 100%; - display: flex; - flex-direction: column; - justify-content: flex-end; - - & .timeline__wrapper { - --typing-noti-height: 28px; - min-height: 0; - min-width: 0; - padding-bottom: var(--typing-noti-height); - - & .message, - & .ph-msg, - & .timeline-change { - @include dir.prop(border-radius, - 0 var(--bo-radius) var(--bo-radius) 0, - var(--bo-radius) 0 0 var(--bo-radius), - ); - } - - & > .divider { - margin: var(--sp-extra-tight); - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - @include dir.side(padding, calc(var(--av-small) + var(--sp-tight)), 0); - } - } -} \ No newline at end of file diff --git a/src/app/organisms/room/RoomViewFloating.jsx b/src/app/organisms/room/RoomViewFloating.jsx deleted file mode 100644 index d027aff2..00000000 --- a/src/app/organisms/room/RoomViewFloating.jsx +++ /dev/null @@ -1,125 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './RoomViewFloating.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import { markAsRead } from '../../../client/action/notifications'; - -import Text from '../../atoms/text/Text'; -import Button from '../../atoms/button/Button'; - -import MessageIC from '../../../../public/res/ic/outlined/message.svg'; -import MessageUnreadIC from '../../../../public/res/ic/outlined/message-unread.svg'; -import TickMarkIC from '../../../../public/res/ic/outlined/tick-mark.svg'; - -import { getUsersActionJsx } from './common'; - -function useJumpToEvent(roomTimeline) { - const [eventId, setEventId] = useState(null); - - const jumpToEvent = () => { - roomTimeline.loadEventTimeline(eventId); - }; - - const cancelJumpToEvent = () => { - markAsRead(roomTimeline.roomId); - setEventId(null); - }; - - useEffect(() => { - const readEventId = roomTimeline.getReadUpToEventId(); - // we only show "Jump to unread" btn only if the event is not in timeline. - // if event is in timeline - // we will automatically open the timeline from that event position - if (!readEventId?.startsWith('~') && !roomTimeline.hasEventInTimeline(readEventId)) { - setEventId(readEventId); - } - - const { notifications } = initMatrix; - const handleMarkAsRead = () => setEventId(null); - notifications.on(cons.events.notifications.FULL_READ, handleMarkAsRead); - - return () => { - notifications.removeListener(cons.events.notifications.FULL_READ, handleMarkAsRead); - setEventId(null); - }; - }, [roomTimeline]); - - return [!!eventId, jumpToEvent, cancelJumpToEvent]; -} - -function useTypingMembers(roomTimeline) { - const [typingMembers, setTypingMembers] = useState(new Set()); - - const updateTyping = (members) => { - const mx = initMatrix.matrixClient; - members.delete(mx.getUserId()); - setTypingMembers(members); - }; - - useEffect(() => { - setTypingMembers(new Set()); - roomTimeline.on(cons.events.roomTimeline.TYPING_MEMBERS_UPDATED, updateTyping); - return () => { - roomTimeline?.removeListener(cons.events.roomTimeline.TYPING_MEMBERS_UPDATED, updateTyping); - }; - }, [roomTimeline]); - - return [typingMembers]; -} - -function useScrollToBottom(roomTimeline) { - const [isAtBottom, setIsAtBottom] = useState(true); - const handleAtBottom = (atBottom) => setIsAtBottom(atBottom); - - useEffect(() => { - setIsAtBottom(true); - roomTimeline.on(cons.events.roomTimeline.AT_BOTTOM, handleAtBottom); - return () => roomTimeline.removeListener(cons.events.roomTimeline.AT_BOTTOM, handleAtBottom); - }, [roomTimeline]); - - return [isAtBottom, setIsAtBottom]; -} - -function RoomViewFloating({ - roomId, roomTimeline, -}) { - const [isJumpToEvent, jumpToEvent, cancelJumpToEvent] = useJumpToEvent(roomTimeline); - const [typingMembers] = useTypingMembers(roomTimeline); - const [isAtBottom, setIsAtBottom] = useScrollToBottom(roomTimeline); - - const handleScrollToBottom = () => { - roomTimeline.emit(cons.events.roomTimeline.SCROLL_TO_LIVE); - setIsAtBottom(true); - }; - - return ( - <> -
    - - -
    -
    0 ? ' room-view__typing--open' : ''}`}> -
    - {getUsersActionJsx(roomId, [...typingMembers], 'typing...')} -
    -
    - -
    - - ); -} -RoomViewFloating.propTypes = { - roomId: PropTypes.string.isRequired, - roomTimeline: PropTypes.shape({}).isRequired, -}; - -export default RoomViewFloating; diff --git a/src/app/organisms/room/RoomViewFloating.scss b/src/app/organisms/room/RoomViewFloating.scss deleted file mode 100644 index 75802175..00000000 --- a/src/app/organisms/room/RoomViewFloating.scss +++ /dev/null @@ -1,125 +0,0 @@ - @use '../../partials/flex'; -@use '../../partials/text'; -@use '../../partials/dir'; - -.room-view { - &__typing { - display: flex; - padding: var(--sp-ultra-tight) var(--sp-normal); - background: var(--bg-surface); - transition: transform 200ms ease-in-out; - - & b { - color: var(--tc-surface-high); - } - - & .text { - @extend .cp-txt__ellipsis; - @extend .cp-fx__item-one; - - margin: 0 var(--sp-tight); - } - - &--open { - transform: translateY(-99%); - box-shadow: 0 4px 0 0 var(--bg-surface); - & .bouncing-loader { - & > *, - &::after, - &::before { - animation: bouncing-loader 0.6s infinite alternate; - } - } - } - } - - .bouncing-loader { - transform: translateY(2px); - margin: 0 calc(var(--sp-ultra-tight) / 2); - } - .bouncing-loader > div, - .bouncing-loader::before, - .bouncing-loader::after { - display: inline-block; - width: 8px; - height: 8px; - background: var(--tc-surface-high); - border-radius: 50%; - } - - - .bouncing-loader::before, - .bouncing-loader::after { - content: ""; - } - - .bouncing-loader > div { - margin: 0 4px; - } - - .bouncing-loader > div { - animation-delay: 0.2s; - } - - .bouncing-loader::after { - animation-delay: 0.4s; - } - - @keyframes bouncing-loader { - to { - opacity: 0.1; - transform: translate3d(0, -4px, 0); - } - } - - &__STB, - &__unread { - overflow: hidden; - background-color: var(--bg-surface-low); - border-radius: var(--bo-radius); - - & button { - justify-content: flex-start; - border-radius: 0; - box-shadow: none; - padding: 6px var(--sp-tight); - & .ic-raw { - width: 16px; - height: 16px; - } - } - } - - &__STB { - position: absolute; - @include dir.prop(left, 50%, unset); - @include dir.prop(right, unset, 50%); - bottom: 0; - box-shadow: var(--bs-surface-border); - transition: transform 200ms ease-in-out; - transform: translate(-50%, 100%); - - &--open { - transform: translate(-50%, -28px); - } - } - - &__unread { - position: absolute; - top: var(--sp-extra-tight); - @include dir.prop(left, var(--sp-normal), unset); - @include dir.prop(right, unset, var(--sp-normal)); - z-index: 999; - - display: none; - width: calc(100% - var(--sp-extra-loose)); - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 20%); - - &--open { - display: flex; - } - & button:first-child { - @extend .cp-fx__item-one; - } - } -} \ No newline at end of file diff --git a/src/app/organisms/room/RoomViewHeader.jsx b/src/app/organisms/room/RoomViewHeader.jsx deleted file mode 100644 index 6571241e..00000000 --- a/src/app/organisms/room/RoomViewHeader.jsx +++ /dev/null @@ -1,132 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './RoomViewHeader.scss'; - -import { twemojify } from '../../../util/twemojify'; -import { blurOnBubbling } from '../../atoms/button/script'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { - toggleRoomSettings, - openReusableContextMenu, - openNavigation, -} from '../../../client/action/navigation'; -import colorMXID from '../../../util/colorMXID'; -import { getEventCords } from '../../../util/common'; - -import { tabText } from './RoomSettings'; -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import IconButton from '../../atoms/button/IconButton'; -import Header, { TitleWrapper } from '../../atoms/header/Header'; -import Avatar from '../../atoms/avatar/Avatar'; -import RoomOptions from '../../molecules/room-options/RoomOptions'; - -import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; -import SearchIC from '../../../../public/res/ic/outlined/search.svg'; -import UserIC from '../../../../public/res/ic/outlined/user.svg'; -import VerticalMenuIC from '../../../../public/res/ic/outlined/vertical-menu.svg'; -import BackArrowIC from '../../../../public/res/ic/outlined/chevron-left.svg'; - -import { useForceUpdate } from '../../hooks/useForceUpdate'; -import { useSetSetting } from '../../state/hooks/settings'; -import { settingsAtom } from '../../state/settings'; - -function RoomViewHeader({ roomId }) { - const [, forceUpdate] = useForceUpdate(); - const mx = initMatrix.matrixClient; - const isDM = initMatrix.roomList.directs.has(roomId); - const room = mx.getRoom(roomId); - const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); - let avatarSrc = room.getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); - avatarSrc = isDM - ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') - : avatarSrc; - const roomName = room.name; - - const roomHeaderBtnRef = useRef(null); - useEffect(() => { - const settingsToggle = (isVisibile) => { - const rawIcon = roomHeaderBtnRef.current.lastElementChild; - rawIcon.style.transform = isVisibile ? 'rotateX(180deg)' : 'rotateX(0deg)'; - }; - navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle); - }; - }, []); - - useEffect(() => { - const { roomList } = initMatrix; - const handleProfileUpdate = (rId) => { - if (roomId !== rId) return; - forceUpdate(); - }; - - roomList.on(cons.events.roomList.ROOM_PROFILE_UPDATED, handleProfileUpdate); - return () => { - roomList.removeListener(cons.events.roomList.ROOM_PROFILE_UPDATED, handleProfileUpdate); - }; - }, [roomId]); - - const openRoomOptions = (e) => { - openReusableContextMenu('bottom', getEventCords(e, '.ic-btn'), (closeMenu) => ( - - )); - }; - - return ( -
    - openNavigation()} - /> - - {mx.isRoomEncrypted(roomId) === false && ( - toggleRoomSettings(tabText.SEARCH)} - tooltip="Search" - src={SearchIC} - /> - )} - { - setPeopleDrawer((t) => !t); - }} - tooltip="People" - src={UserIC} - /> - toggleRoomSettings(tabText.MEMBERS)} - tooltip="Members" - src={UserIC} - /> - -
    - ); -} -RoomViewHeader.propTypes = { - roomId: PropTypes.string.isRequired, -}; - -export default RoomViewHeader; diff --git a/src/app/organisms/room/RoomViewHeader.scss b/src/app/organisms/room/RoomViewHeader.scss deleted file mode 100644 index fc19c064..00000000 --- a/src/app/organisms/room/RoomViewHeader.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; -@use '../../partials/screen'; - -.room-header__btn { - min-width: 0; - @extend .cp-fx__row--s-c; - @include dir.side(margin, 0, auto); - border-radius: var(--bo-radius); - cursor: pointer; - - & .ic-raw { - @include dir.side(margin, 0, var(--sp-extra-tight)); - transition: transform 200ms ease-in-out; - } - @media (hover:hover) { - &:hover { - background-color: var(--bg-surface-hover); - box-shadow: var(--bs-surface-outline); - } - } - &:focus, - &:active { - background-color: var(--bg-surface-active); - box-shadow: var(--bs-surface-outline); - outline: none; - } -} - -.room-header__drawer-btn { - @include screen.smallerThan(tabletBreakpoint) { - display: none; - } -} -.room-header__members-btn { - @include screen.biggerThan(tabletBreakpoint) { - display: none; - } -} - -.room-header__back-btn { - @include dir.side(margin, 0, var(--sp-tight)); - - @include screen.biggerThan(mobileBreakpoint) { - display: none; - } -} diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx deleted file mode 100644 index 3fb780a4..00000000 --- a/src/app/organisms/room/RoomViewInput.jsx +++ /dev/null @@ -1,491 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './RoomViewInput.scss'; - -import TextareaAutosize from 'react-autosize-textarea'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import settings from '../../../client/state/settings'; -import { openEmojiBoard, openReusableContextMenu } from '../../../client/action/navigation'; -import navigation from '../../../client/state/navigation'; -import { bytesToSize, getEventCords } from '../../../util/common'; -import { getUsername } from '../../../util/matrixUtil'; -import colorMXID from '../../../util/colorMXID'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import IconButton from '../../atoms/button/IconButton'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import { MessageReply } from '../../molecules/message/Message'; - -import StickerBoard from '../sticker-board/StickerBoard'; -import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; - -import CirclePlusIC from '../../../../public/res/ic/outlined/circle-plus.svg'; -import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; -import SendIC from '../../../../public/res/ic/outlined/send.svg'; -import StickerIC from '../../../../public/res/ic/outlined/sticker.svg'; -import ShieldIC from '../../../../public/res/ic/outlined/shield.svg'; -import VLCIC from '../../../../public/res/ic/outlined/vlc.svg'; -import VolumeFullIC from '../../../../public/res/ic/outlined/volume-full.svg'; -import FileIC from '../../../../public/res/ic/outlined/file.svg'; -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; - -import commands from './commands'; - -const CMD_REGEX = /(^\/|:|@)(\S*)$/; -let isTyping = false; -let isCmdActivated = false; -let cmdCursorPos = null; -function RoomViewInput({ - roomId, roomTimeline, viewEvent, -}) { - const [attachment, setAttachment] = useState(null); - const [replyTo, setReplyTo] = useState(null); - - const textAreaRef = useRef(null); - const inputBaseRef = useRef(null); - const uploadInputRef = useRef(null); - const uploadProgressRef = useRef(null); - const rightOptionsRef = useRef(null); - - const TYPING_TIMEOUT = 5000; - const mx = initMatrix.matrixClient; - const { roomsInput } = initMatrix; - - function requestFocusInput() { - if (textAreaRef === null) return; - textAreaRef.current.focus(); - } - - useEffect(() => { - roomsInput.on(cons.events.roomsInput.ATTACHMENT_SET, setAttachment); - viewEvent.on('focus_msg_input', requestFocusInput); - return () => { - roomsInput.removeListener(cons.events.roomsInput.ATTACHMENT_SET, setAttachment); - viewEvent.removeListener('focus_msg_input', requestFocusInput); - }; - }, []); - - const sendIsTyping = (isT) => { - mx.sendTyping(roomId, isT, isT ? TYPING_TIMEOUT : undefined); - isTyping = isT; - - if (isT === true) { - setTimeout(() => { - if (isTyping) sendIsTyping(false); - }, TYPING_TIMEOUT); - } - }; - - function uploadingProgress(myRoomId, { loaded, total }) { - if (myRoomId !== roomId) return; - const progressPer = Math.round((loaded * 100) / total); - uploadProgressRef.current.textContent = `Uploading: ${bytesToSize(loaded)}/${bytesToSize(total)} (${progressPer}%)`; - inputBaseRef.current.style.backgroundImage = `linear-gradient(90deg, var(--bg-surface-hover) ${progressPer}%, var(--bg-surface-low) ${progressPer}%)`; - } - function clearAttachment(myRoomId) { - if (roomId !== myRoomId) return; - setAttachment(null); - inputBaseRef.current.style.backgroundImage = 'unset'; - uploadInputRef.current.value = null; - } - - function rightOptionsA11Y(A11Y) { - const rightOptions = rightOptionsRef.current.children; - for (let index = 0; index < rightOptions.length; index += 1) { - rightOptions[index].tabIndex = A11Y ? 0 : -1; - } - } - - function activateCmd(prefix) { - isCmdActivated = true; - rightOptionsA11Y(false); - viewEvent.emit('cmd_activate', prefix); - } - function deactivateCmd() { - isCmdActivated = false; - cmdCursorPos = null; - rightOptionsA11Y(true); - } - function deactivateCmdAndEmit() { - deactivateCmd(); - viewEvent.emit('cmd_deactivate'); - } - function setCursorPosition(pos) { - setTimeout(() => { - textAreaRef.current.focus(); - textAreaRef.current.setSelectionRange(pos, pos); - }, 0); - } - function replaceCmdWith(msg, cursor, replacement) { - if (msg === null) return null; - const targetInput = msg.slice(0, cursor); - const cmdParts = targetInput.match(CMD_REGEX); - const leadingInput = msg.slice(0, cmdParts.index); - if (replacement.length > 0) setCursorPosition(leadingInput.length + replacement.length); - return leadingInput + replacement + msg.slice(cursor); - } - function firedCmd(cmdData) { - const msg = textAreaRef.current.value; - textAreaRef.current.value = replaceCmdWith( - msg, - cmdCursorPos, - typeof cmdData?.replace !== 'undefined' ? cmdData.replace : '', - ); - deactivateCmd(); - } - - function focusInput() { - if (settings.isTouchScreenDevice) return; - textAreaRef.current.focus(); - } - - function setUpReply(userId, eventId, body, formattedBody) { - setReplyTo({ userId, eventId, body }); - roomsInput.setReplyTo(roomId, { - userId, eventId, body, formattedBody, - }); - focusInput(); - } - - useEffect(() => { - roomsInput.on(cons.events.roomsInput.UPLOAD_PROGRESS_CHANGES, uploadingProgress); - roomsInput.on(cons.events.roomsInput.ATTACHMENT_CANCELED, clearAttachment); - roomsInput.on(cons.events.roomsInput.FILE_UPLOADED, clearAttachment); - viewEvent.on('cmd_fired', firedCmd); - navigation.on(cons.events.navigation.REPLY_TO_CLICKED, setUpReply); - if (textAreaRef?.current !== null) { - isTyping = false; - textAreaRef.current.value = roomsInput.getMessage(roomId); - setAttachment(roomsInput.getAttachment(roomId)); - setReplyTo(roomsInput.getReplyTo(roomId)); - } - return () => { - roomsInput.removeListener(cons.events.roomsInput.UPLOAD_PROGRESS_CHANGES, uploadingProgress); - roomsInput.removeListener(cons.events.roomsInput.ATTACHMENT_CANCELED, clearAttachment); - roomsInput.removeListener(cons.events.roomsInput.FILE_UPLOADED, clearAttachment); - viewEvent.removeListener('cmd_fired', firedCmd); - navigation.removeListener(cons.events.navigation.REPLY_TO_CLICKED, setUpReply); - if (isCmdActivated) deactivateCmd(); - if (textAreaRef?.current === null) return; - - const msg = textAreaRef.current.value; - textAreaRef.current.style.height = 'unset'; - inputBaseRef.current.style.backgroundImage = 'unset'; - if (msg.trim() === '') { - roomsInput.setMessage(roomId, ''); - return; - } - roomsInput.setMessage(roomId, msg); - }; - }, [roomId]); - - const sendBody = async (body, options) => { - const opt = options ?? {}; - if (!opt.msgType) opt.msgType = 'm.text'; - if (typeof opt.autoMarkdown !== 'boolean') opt.autoMarkdown = true; - if (roomsInput.isSending(roomId)) return; - sendIsTyping(false); - - roomsInput.setMessage(roomId, body); - if (attachment !== null) { - roomsInput.setAttachment(roomId, attachment); - } - textAreaRef.current.disabled = true; - textAreaRef.current.style.cursor = 'not-allowed'; - await roomsInput.sendInput(roomId, opt); - textAreaRef.current.disabled = false; - textAreaRef.current.style.cursor = 'unset'; - focusInput(); - - textAreaRef.current.value = roomsInput.getMessage(roomId); - textAreaRef.current.style.height = 'unset'; - if (replyTo !== null) setReplyTo(null); - }; - - /** Return true if a command was executed. */ - const processCommand = async (cmdBody) => { - const spaceIndex = cmdBody.indexOf(' '); - const cmdName = cmdBody.slice(1, spaceIndex > -1 ? spaceIndex : undefined); - const cmdData = spaceIndex > -1 ? cmdBody.slice(spaceIndex + 1) : ''; - if (!commands[cmdName]) { - const sendAsMessage = await confirmDialog('Invalid Command', `"${cmdName}" is not a valid command. Did you mean to send this as a message?`, 'Send as message'); - if (sendAsMessage) { - sendBody(cmdBody); - return true; - } - return false; - } - if (['me', 'shrug', 'plain'].includes(cmdName)) { - commands[cmdName].exe(roomId, cmdData, sendBody); - return true; - } - commands[cmdName].exe(roomId, cmdData); - return true; - }; - - const sendMessage = async () => { - requestAnimationFrame(() => deactivateCmdAndEmit()); - const msgBody = textAreaRef.current.value.trim(); - if (msgBody.startsWith('/')) { - const executed = await processCommand(msgBody.trim()); - if (executed) { - textAreaRef.current.value = ''; - textAreaRef.current.style.height = 'unset'; - } - return; - } - if (msgBody === '' && attachment === null) return; - sendBody(msgBody); - }; - - const handleSendSticker = async (data) => { - roomsInput.sendSticker(roomId, data); - }; - - function processTyping(msg) { - const isEmptyMsg = msg === ''; - - if (isEmptyMsg && isTyping) { - sendIsTyping(false); - return; - } - if (!isEmptyMsg && !isTyping) { - sendIsTyping(true); - } - } - - function getCursorPosition() { - return textAreaRef.current.selectionStart; - } - - function recognizeCmd(rawInput) { - const cursor = getCursorPosition(); - const targetInput = rawInput.slice(0, cursor); - - const cmdParts = targetInput.match(CMD_REGEX); - if (cmdParts === null) { - if (isCmdActivated) deactivateCmdAndEmit(); - return; - } - const cmdPrefix = cmdParts[1]; - const cmdSlug = cmdParts[2]; - - if (cmdPrefix === ':') { - // skip emoji autofill command if link is suspected. - const checkForLink = targetInput.slice(0, cmdParts.index); - if (checkForLink.match(/(http|https|mailto|matrix|ircs|irc)$/)) { - deactivateCmdAndEmit(); - return; - } - } - - cmdCursorPos = cursor; - if (cmdSlug === '') { - activateCmd(cmdPrefix); - return; - } - if (!isCmdActivated) activateCmd(cmdPrefix); - viewEvent.emit('cmd_process', cmdPrefix, cmdSlug); - } - - const handleMsgTyping = (e) => { - const msg = e.target.value; - recognizeCmd(e.target.value); - if (!isCmdActivated) processTyping(msg); - }; - - const handleKeyDown = (e) => { - if (e.key === 'Escape') { - e.preventDefault(); - roomsInput.cancelReplyTo(roomId); - setReplyTo(null); - } - if (e.key === 'Enter' && e.shiftKey === false) { - e.preventDefault(); - sendMessage(); - } - }; - - const handlePaste = (e) => { - if (e.clipboardData === false) { - return; - } - - if (e.clipboardData.items === undefined) { - return; - } - - for (let i = 0; i < e.clipboardData.items.length; i += 1) { - const item = e.clipboardData.items[i]; - if (item.type.indexOf('image') !== -1) { - const image = item.getAsFile(); - if (attachment === null) { - setAttachment(image); - if (image !== null) { - roomsInput.setAttachment(roomId, image); - return; - } - } else { - return; - } - } - } - }; - - function addEmoji(emoji) { - textAreaRef.current.value += emoji.unicode; - textAreaRef.current.focus(); - } - - const handleUploadClick = () => { - if (attachment === null) uploadInputRef.current.click(); - else { - roomsInput.cancelAttachment(roomId); - } - }; - function uploadFileChange(e) { - const file = e.target.files.item(0); - setAttachment(file); - if (file !== null) roomsInput.setAttachment(roomId, file); - } - - function renderInputs() { - const canISend = roomTimeline.room.currentState.maySendMessage(mx.getUserId()); - const tombstoneEvent = roomTimeline.room.currentState.getStateEvents('m.room.tombstone')[0]; - if (!canISend || tombstoneEvent) { - return ( - - { - tombstoneEvent - ? tombstoneEvent.getContent()?.body ?? 'This room has been replaced and is no longer active.' - : 'You do not have permission to post to this room' - } - - ); - } - return ( - <> -
    - - -
    -
    - {roomTimeline.isEncrypted() && } - - - - - -
    -
    - { - openReusableContextMenu( - 'top', - (() => { - const cords = getEventCords(e); - cords.y -= 20; - return cords; - })(), - (closeMenu) => ( - { - handleSendSticker(data); - closeMenu(); - }} - /> - ), - ); - }} - tooltip="Sticker" - src={StickerIC} - /> - { - const cords = getEventCords(e); - cords.x += (document.dir === 'rtl' ? -80 : 80); - cords.y -= 250; - openEmojiBoard(cords, addEmoji); - }} - tooltip="Emoji" - src={EmojiIC} - /> - -
    - - ); - } - - function attachFile() { - const fileType = attachment.type.slice(0, attachment.type.indexOf('/')); - return ( -
    -
    - {fileType === 'image' && {attachment.name}} - {fileType === 'video' && } - {fileType === 'audio' && } - {fileType !== 'image' && fileType !== 'video' && fileType !== 'audio' && } -
    -
    - {attachment.name} - {`size: ${bytesToSize(attachment.size)}`} -
    -
    - ); - } - - function attachReply() { - return ( -
    - { - roomsInput.cancelReplyTo(roomId); - setReplyTo(null); - }} - src={CrossIC} - tooltip="Cancel reply" - size="extra-small" - /> - -
    - ); - } - - return ( - <> - { replyTo !== null && attachReply()} - { attachment !== null && attachFile() } -
    { e.preventDefault(); }}> - { - renderInputs() - } -
    - - ); -} -RoomViewInput.propTypes = { - roomId: PropTypes.string.isRequired, - roomTimeline: PropTypes.shape({}).isRequired, - viewEvent: PropTypes.shape({}).isRequired, -}; - -export default RoomViewInput; diff --git a/src/app/organisms/room/RoomViewInput.scss b/src/app/organisms/room/RoomViewInput.scss deleted file mode 100644 index 9fb7c4de..00000000 --- a/src/app/organisms/room/RoomViewInput.scss +++ /dev/null @@ -1,108 +0,0 @@ -@use '../../partials/dir'; - -.room-input { - padding: var(--sp-extra-tight) calc(var(--sp-normal) - 2px); - display: flex; - min-height: 56px; - - &__alert { - margin: auto; - padding: 0 var(--sp-tight); - text-align: center; - } - - &__input-container { - flex: 1; - min-width: 0; - display: flex; - align-items: center; - - margin: 0 calc(var(--sp-tight) - 2px); - background-color: var(--bg-surface-low); - box-shadow: var(--bs-surface-border); - border-radius: var(--bo-radius); - - & > .ic-raw { - transform: scale(0.8); - margin: 0 var(--sp-extra-tight); - } - - & .scrollbar { - max-height: 50vh; - flex: 1; - - &:first-child { - @include dir.side(margin, var(--sp-tight), 0); - } - } - } - - &__textarea-wrapper { - min-height: 40px; - display: flex; - align-items: center; - - & textarea { - resize: none; - width: 100%; - min-width: 0; - min-height: 100%; - padding: var(--sp-ultra-tight) 0; - - &::placeholder { - color: var(--tc-surface-low); - } - &:focus { - outline: none; - } - } - } -} - -.room-attachment { - --side-spacing: calc(var(--sp-normal) + var(--av-small) + var(--sp-tight)); - display: flex; - align-items: center; - @include dir.side(margin, var(--side-spacing), 0); - margin-top: var(--sp-extra-tight); - line-height: 0; - - &__preview > img { - max-height: 40px; - border-radius: var(--bo-radius); - max-width: 150px; - } - &__icon { - padding: var(--sp-extra-tight); - background-color: var(--bg-surface-low); - box-shadow: var(--bs-surface-border); - border-radius: var(--bo-radius); - } - &__info { - flex: 1; - min-width: 0; - margin: 0 var(--sp-tight); - } - - &__option button { - transition: transform 200ms ease-in-out; - transform: translateY(-48px); - & .ic-raw { - transition: transform 200ms ease-in-out; - transform: rotate(45deg); - background-color: var(--bg-caution); - } - } -} - -.room-reply { - display: flex; - align-items: center; - background-color: var(--bg-surface-low); - border-bottom: 1px solid var(--bg-surface-border); - - & .ic-btn-surface { - @include dir.side(margin, 17px, 13px); - border-radius: 0; - } -} \ No newline at end of file diff --git a/src/app/organisms/room/TimelineScroll.js b/src/app/organisms/room/TimelineScroll.js deleted file mode 100644 index ccdc9a97..00000000 --- a/src/app/organisms/room/TimelineScroll.js +++ /dev/null @@ -1,136 +0,0 @@ -import { getScrollInfo } from '../../../util/common'; - -class TimelineScroll { - constructor(target) { - if (target === null) { - throw new Error('Can not initialize TimelineScroll, target HTMLElement in null'); - } - this.scroll = target; - - this.backwards = false; - this.inTopHalf = false; - - this.isScrollable = false; - this.top = 0; - this.bottom = 0; - this.height = 0; - this.viewHeight = 0; - - this.topMsg = null; - this.bottomMsg = null; - this.diff = 0; - } - - scrollToBottom() { - const scrollInfo = getScrollInfo(this.scroll); - const maxScrollTop = scrollInfo.height - scrollInfo.viewHeight; - - this._scrollTo(scrollInfo, maxScrollTop); - } - - // use previous calc by this._updateTopBottomMsg() & this._calcDiff. - tryRestoringScroll() { - const scrollInfo = getScrollInfo(this.scroll); - - let scrollTop = 0; - const ot = this.inTopHalf ? this.topMsg?.offsetTop : this.bottomMsg?.offsetTop; - if (!ot) scrollTop = Math.round(this.height - this.viewHeight); - else scrollTop = ot - this.diff; - - this._scrollTo(scrollInfo, scrollTop); - } - - scrollToIndex(index, offset = 0) { - const scrollInfo = getScrollInfo(this.scroll); - const msgs = this.scroll.lastElementChild.lastElementChild.children; - const offsetTop = msgs[index]?.offsetTop; - - if (offsetTop === undefined) return; - // if msg is already in visible are we don't need to scroll to that - if (offsetTop > scrollInfo.top && offsetTop < (scrollInfo.top + scrollInfo.viewHeight)) return; - const to = offsetTop - offset; - - this._scrollTo(scrollInfo, to); - } - - _scrollTo(scrollInfo, scrollTop) { - this.scroll.scrollTop = scrollTop; - - // browser emit 'onscroll' event only if the 'element.scrollTop' value changes. - // so here we flag that the upcoming 'onscroll' event is - // emitted as side effect of assigning 'this.scroll.scrollTop' above - // only if it's changes. - // by doing so we prevent this._updateCalc() from calc again. - if (scrollTop !== this.top) { - this.scrolledByCode = true; - } - const sInfo = { ...scrollInfo }; - - const maxScrollTop = scrollInfo.height - scrollInfo.viewHeight; - - sInfo.top = (scrollTop > maxScrollTop) ? maxScrollTop : scrollTop; - this._updateCalc(sInfo); - } - - // we maintain reference of top and bottom messages - // to restore the scroll position when - // messages gets removed from either end and added to other. - _updateTopBottomMsg() { - const msgs = this.scroll.lastElementChild.lastElementChild.children; - const lMsgIndex = msgs.length - 1; - - // TODO: classname 'ph-msg' prevent this class from being used - const PLACEHOLDER_COUNT = 2; - this.topMsg = msgs[0]?.className === 'ph-msg' - ? msgs[PLACEHOLDER_COUNT] - : msgs[0]; - this.bottomMsg = msgs[lMsgIndex]?.className === 'ph-msg' - ? msgs[lMsgIndex - PLACEHOLDER_COUNT] - : msgs[lMsgIndex]; - } - - // we calculate the difference between first/last message and current scrollTop. - // if we are going above we calc diff between first and scrollTop - // else otherwise. - // NOTE: This will help to restore the scroll when msgs get's removed - // from one end and added to other end - _calcDiff(scrollInfo) { - if (!this.topMsg || !this.bottomMsg) return 0; - if (this.inTopHalf) { - return this.topMsg.offsetTop - scrollInfo.top; - } - return this.bottomMsg.offsetTop - scrollInfo.top; - } - - _updateCalc(scrollInfo) { - const halfViewHeight = Math.round(scrollInfo.viewHeight / 2); - const scrollMiddle = scrollInfo.top + halfViewHeight; - const lastMiddle = this.top + halfViewHeight; - - this.backwards = scrollMiddle < lastMiddle; - this.inTopHalf = scrollMiddle < scrollInfo.height / 2; - - this.isScrollable = scrollInfo.isScrollable; - this.top = scrollInfo.top; - this.bottom = scrollInfo.height - (scrollInfo.top + scrollInfo.viewHeight); - this.height = scrollInfo.height; - this.viewHeight = scrollInfo.viewHeight; - - this._updateTopBottomMsg(); - this.diff = this._calcDiff(scrollInfo); - } - - calcScroll() { - if (this.scrolledByCode) { - this.scrolledByCode = false; - return undefined; - } - - const scrollInfo = getScrollInfo(this.scroll); - this._updateCalc(scrollInfo); - - return this.backwards; - } -} - -export default TimelineScroll; diff --git a/src/app/organisms/room/commands.jsx b/src/app/organisms/room/commands.jsx deleted file mode 100644 index 463f9d94..00000000 --- a/src/app/organisms/room/commands.jsx +++ /dev/null @@ -1,220 +0,0 @@ -import React from 'react'; -import './commands.scss'; - -import initMatrix from '../../../client/initMatrix'; -import * as roomActions from '../../../client/action/room'; -import { hasDMWith, hasDevices } from '../../../util/matrixUtil'; -import { selectRoom, openReusableDialog } from '../../../client/action/navigation'; - -import Text from '../../atoms/text/Text'; -import SettingTile from '../../molecules/setting-tile/SettingTile'; - -const MXID_REG = /^@\S+:\S+$/; -const ROOM_ID_ALIAS_REG = /^(#|!)\S+:\S+$/; -const ROOM_ID_REG = /^!\S+:\S+$/; -const MXC_REG = /^mxc:\/\/\S+$/; - -export function processMxidAndReason(data) { - let reason; - let idData = data; - const reasonMatch = data.match(/\s-r\s/); - if (reasonMatch) { - idData = data.slice(0, reasonMatch.index); - reason = data.slice(reasonMatch.index + reasonMatch[0].length); - if (reason.trim() === '') reason = undefined; - } - const rawIds = idData.split(' '); - const userIds = rawIds.filter((id) => id.match(MXID_REG)); - return { - userIds, - reason, - }; -} - -const commands = { - me: { - name: 'me', - description: 'Display action', - exe: (roomId, data, onSuccess) => { - const body = data.trim(); - if (body === '') return; - onSuccess(body, { msgType: 'm.emote' }); - }, - }, - shrug: { - name: 'shrug', - description: 'Send ¯\\_(ツ)_/¯ as message', - exe: (roomId, data, onSuccess) => onSuccess( - `¯\\_(ツ)_/¯${data.trim() !== '' ? ` ${data}` : ''}`, - { msgType: 'm.text' }, - ), - }, - plain: { - name: 'plain', - description: 'Send plain text message', - exe: (roomId, data, onSuccess) => { - const body = data.trim(); - if (body === '') return; - onSuccess(body, { msgType: 'm.text', autoMarkdown: false }); - }, - }, - help: { - name: 'help', - description: 'View all commands', - // eslint-disable-next-line no-use-before-define - exe: () => openHelpDialog(), - }, - startdm: { - name: 'startdm', - description: 'Start direct message with user. Example: /startdm userId1', - exe: async (roomId, data) => { - const mx = initMatrix.matrixClient; - const rawIds = data.split(' '); - const userIds = rawIds.filter((id) => id.match(MXID_REG) && id !== mx.getUserId()); - if (userIds.length === 0) return; - if (userIds.length === 1) { - const dmRoomId = hasDMWith(userIds[0]); - if (dmRoomId) { - selectRoom(dmRoomId); - return; - } - } - const devices = await Promise.all(userIds.map(hasDevices)); - const isEncrypt = devices.every((hasDevice) => hasDevice); - const result = await roomActions.createDM(userIds, isEncrypt); - selectRoom(result.room_id); - }, - }, - join: { - name: 'join', - description: 'Join room with address. Example: /join address1 address2', - exe: (roomId, data) => { - const rawIds = data.split(' '); - const roomIds = rawIds.filter((id) => id.match(ROOM_ID_ALIAS_REG)); - roomIds.map((id) => roomActions.join(id)); - }, - }, - leave: { - name: 'leave', - description: 'Leave current room.', - exe: (roomId, data) => { - if (data.trim() === '') { - roomActions.leave(roomId); - return; - } - const rawIds = data.split(' '); - const roomIds = rawIds.filter((id) => id.match(ROOM_ID_REG)); - roomIds.map((id) => roomActions.leave(id)); - }, - }, - invite: { - name: 'invite', - description: 'Invite user to room. Example: /invite userId1 userId2 [-r reason]', - exe: (roomId, data) => { - const { userIds, reason } = processMxidAndReason(data); - userIds.map((id) => roomActions.invite(roomId, id, reason)); - }, - }, - disinvite: { - name: 'disinvite', - description: 'Disinvite user to room. Example: /disinvite userId1 userId2 [-r reason]', - exe: (roomId, data) => { - const { userIds, reason } = processMxidAndReason(data); - userIds.map((id) => roomActions.kick(roomId, id, reason)); - }, - }, - kick: { - name: 'kick', - description: 'Kick user from room. Example: /kick userId1 userId2 [-r reason]', - exe: (roomId, data) => { - const { userIds, reason } = processMxidAndReason(data); - userIds.map((id) => roomActions.kick(roomId, id, reason)); - }, - }, - ban: { - name: 'ban', - description: 'Ban user from room. Example: /ban userId1 userId2 [-r reason]', - exe: (roomId, data) => { - const { userIds, reason } = processMxidAndReason(data); - userIds.map((id) => roomActions.ban(roomId, id, reason)); - }, - }, - unban: { - name: 'unban', - description: 'Unban user from room. Example: /unban userId1 userId2', - exe: (roomId, data) => { - const rawIds = data.split(' '); - const userIds = rawIds.filter((id) => id.match(MXID_REG)); - userIds.map((id) => roomActions.unban(roomId, id)); - }, - }, - ignore: { - name: 'ignore', - description: 'Ignore user. Example: /ignore userId1 userId2', - exe: (roomId, data) => { - const rawIds = data.split(' '); - const userIds = rawIds.filter((id) => id.match(MXID_REG)); - if (userIds.length > 0) roomActions.ignore(userIds); - }, - }, - unignore: { - name: 'unignore', - description: 'Unignore user. Example: /unignore userId1 userId2', - exe: (roomId, data) => { - const rawIds = data.split(' '); - const userIds = rawIds.filter((id) => id.match(MXID_REG)); - if (userIds.length > 0) roomActions.unignore(userIds); - }, - }, - myroomnick: { - name: 'myroomnick', - description: 'Change nick in current room.', - exe: (roomId, data) => { - const nick = data.trim(); - if (nick === '') return; - roomActions.setMyRoomNick(roomId, nick); - }, - }, - myroomavatar: { - name: 'myroomavatar', - description: 'Change profile picture in current room. Example /myroomavatar mxc://xyzabc', - exe: (roomId, data) => { - if (data.match(MXC_REG)) { - roomActions.setMyRoomAvatar(roomId, data); - } - }, - }, - converttodm: { - name: 'converttodm', - description: 'Convert room to direct message', - exe: (roomId) => { - roomActions.convertToDm(roomId); - }, - }, - converttoroom: { - name: 'converttoroom', - description: 'Convert direct message to room', - exe: (roomId) => { - roomActions.convertToRoom(roomId); - }, - }, -}; - -function openHelpDialog() { - openReusableDialog( - Commands, - () => ( -
    - {Object.keys(commands).map((cmdName) => ( - {commands[cmdName].description}} - /> - ))} -
    - ), - ); -} - -export default commands; diff --git a/src/app/organisms/room/commands.scss b/src/app/organisms/room/commands.scss deleted file mode 100644 index 62839378..00000000 --- a/src/app/organisms/room/commands.scss +++ /dev/null @@ -1,10 +0,0 @@ -.commands-dialog { - & > * { - padding: var(--sp-tight) var(--sp-normal); - border-bottom: 1px solid var(--bg-surface-border); - &:last-child { - border-bottom: none; - margin-bottom: var(--sp-extra-loose); - } - } -} \ No newline at end of file diff --git a/src/app/organisms/room/common.jsx b/src/app/organisms/room/common.jsx deleted file mode 100644 index 28974a85..00000000 --- a/src/app/organisms/room/common.jsx +++ /dev/null @@ -1,222 +0,0 @@ -import React from 'react'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import { getUsername, getUsernameOfRoomMember } from '../../../util/matrixUtil'; - -function getTimelineJSXMessages() { - return { - join(user) { - return ( - <> - {twemojify(user)} - {' joined the room'} - - ); - }, - leave(user, reason) { - const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : ''; - return ( - <> - {twemojify(user)} - {' left the room'} - {twemojify(reasonMsg)} - - ); - }, - invite(inviter, user) { - return ( - <> - {twemojify(inviter)} - {' invited '} - {twemojify(user)} - - ); - }, - cancelInvite(inviter, user) { - return ( - <> - {twemojify(inviter)} - {' canceled '} - {twemojify(user)} - {'\'s invite'} - - ); - }, - rejectInvite(user) { - return ( - <> - {twemojify(user)} - {' rejected the invitation'} - - ); - }, - kick(actor, user, reason) { - const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : ''; - return ( - <> - {twemojify(actor)} - {' kicked '} - {twemojify(user)} - {twemojify(reasonMsg)} - - ); - }, - ban(actor, user, reason) { - const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : ''; - return ( - <> - {twemojify(actor)} - {' banned '} - {twemojify(user)} - {twemojify(reasonMsg)} - - ); - }, - unban(actor, user) { - return ( - <> - {twemojify(actor)} - {' unbanned '} - {twemojify(user)} - - ); - }, - avatarSets(user) { - return ( - <> - {twemojify(user)} - {' set a avatar'} - - ); - }, - avatarChanged(user) { - return ( - <> - {twemojify(user)} - {' changed their avatar'} - - ); - }, - avatarRemoved(user) { - return ( - <> - {twemojify(user)} - {' removed their avatar'} - - ); - }, - nameSets(user, newName) { - return ( - <> - {twemojify(user)} - {' set display name to '} - {twemojify(newName)} - - ); - }, - nameChanged(user, newName) { - return ( - <> - {twemojify(user)} - {' changed their display name to '} - {twemojify(newName)} - - ); - }, - nameRemoved(user, lastName) { - return ( - <> - {twemojify(user)} - {' removed their display name '} - {twemojify(lastName)} - - ); - }, - }; -} - -function getUsersActionJsx(roomId, userIds, actionStr) { - const room = initMatrix.matrixClient.getRoom(roomId); - const getUserDisplayName = (userId) => { - if (room?.getMember(userId)) return getUsernameOfRoomMember(room.getMember(userId)); - return getUsername(userId); - }; - const getUserJSX = (userId) => {twemojify(getUserDisplayName(userId))}; - if (!Array.isArray(userIds)) return 'Idle'; - if (userIds.length === 0) return 'Idle'; - const MAX_VISIBLE_COUNT = 3; - - const u1Jsx = getUserJSX(userIds[0]); - // eslint-disable-next-line react/jsx-one-expression-per-line - if (userIds.length === 1) return <>{u1Jsx} is {actionStr}; - - const u2Jsx = getUserJSX(userIds[1]); - // eslint-disable-next-line react/jsx-one-expression-per-line - if (userIds.length === 2) return <>{u1Jsx} and {u2Jsx} are {actionStr}; - - const u3Jsx = getUserJSX(userIds[2]); - if (userIds.length === 3) { - // eslint-disable-next-line react/jsx-one-expression-per-line - return <>{u1Jsx}, {u2Jsx} and {u3Jsx} are {actionStr}; - } - - const othersCount = userIds.length - MAX_VISIBLE_COUNT; - // eslint-disable-next-line react/jsx-one-expression-per-line - return <>{u1Jsx}, {u2Jsx}, {u3Jsx} and {othersCount} others are {actionStr}; -} - -function parseTimelineChange(mEvent) { - const tJSXMsgs = getTimelineJSXMessages(); - const makeReturnObj = (variant, content) => ({ - variant, - content, - }); - const content = mEvent.getContent(); - const prevContent = mEvent.getPrevContent(); - const sender = mEvent.getSender(); - const senderName = getUsername(sender); - const userName = getUsername(mEvent.getStateKey()); - - switch (content.membership) { - case 'invite': return makeReturnObj('invite', tJSXMsgs.invite(senderName, userName)); - case 'ban': return makeReturnObj('leave', tJSXMsgs.ban(senderName, userName, content.reason)); - case 'join': - if (prevContent.membership === 'join') { - if (content.displayname !== prevContent.displayname) { - if (typeof content.displayname === 'undefined') return makeReturnObj('avatar', tJSXMsgs.nameRemoved(sender, prevContent.displayname)); - if (typeof prevContent.displayname === 'undefined') return makeReturnObj('avatar', tJSXMsgs.nameSets(sender, content.displayname)); - return makeReturnObj('avatar', tJSXMsgs.nameChanged(prevContent.displayname, content.displayname)); - } - if (content.avatar_url !== prevContent.avatar_url) { - if (typeof content.avatar_url === 'undefined') return makeReturnObj('avatar', tJSXMsgs.avatarRemoved(content.displayname)); - if (typeof prevContent.avatar_url === 'undefined') return makeReturnObj('avatar', tJSXMsgs.avatarSets(content.displayname)); - return makeReturnObj('avatar', tJSXMsgs.avatarChanged(content.displayname)); - } - return null; - } - return makeReturnObj('join', tJSXMsgs.join(senderName)); - case 'leave': - if (sender === mEvent.getStateKey()) { - switch (prevContent.membership) { - case 'invite': return makeReturnObj('invite-cancel', tJSXMsgs.rejectInvite(senderName)); - default: return makeReturnObj('leave', tJSXMsgs.leave(senderName, content.reason)); - } - } - switch (prevContent.membership) { - case 'invite': return makeReturnObj('invite-cancel', tJSXMsgs.cancelInvite(senderName, userName)); - case 'ban': return makeReturnObj('other', tJSXMsgs.unban(senderName, userName)); - // sender is not target and made the target leave, - // if not from invite/ban then this is a kick - default: return makeReturnObj('leave', tJSXMsgs.kick(senderName, userName, content.reason)); - } - default: return null; - } -} - -export { - getTimelineJSXMessages, - getUsersActionJsx, - parseTimelineChange, -}; diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index 66b68511..c9d1d991 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useRef } from 'react'; +import { useAtomValue } from 'jotai'; import './Search.scss'; import initMatrix from '../../../client/initMatrix'; @@ -19,6 +20,11 @@ import RoomSelector from '../../molecules/room-selector/RoomSelector'; import SearchIC from '../../../../public/res/ic/outlined/search.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { useDirects, useRooms, useSpaces } from '../../state/hooks/roomList'; +import { roomToUnreadAtom } from '../../state/room/roomToUnread'; +import { roomToParentsAtom } from '../../state/room/roomToParents'; +import { allRoomsAtom } from '../../state/room-list/roomList'; +import { mDirectAtom } from '../../state/mDirectList'; function useVisiblityToggle(setResult) { const [isOpen, setIsOpen] = useState(false); @@ -48,9 +54,8 @@ function useVisiblityToggle(setResult) { return [isOpen, requestClose]; } -function mapRoomIds(roomIds) { +function mapRoomIds(roomIds, directs, roomIdToParents) { const mx = initMatrix.matrixClient; - const { directs, roomIdToParents } = initMatrix.roomList; return roomIds.map((roomId) => { const room = mx.getRoom(roomId); @@ -62,7 +67,7 @@ function mapRoomIds(roomIds) { let type = 'room'; if (room.isSpaceRoom()) type = 'space'; - else if (directs.has(roomId)) type = 'direct'; + else if (directs.includes(roomId)) type = 'direct'; return { type, @@ -81,6 +86,12 @@ function Search() { const searchRef = useRef(null); const mx = initMatrix.matrixClient; const { navigateRoom, navigateSpace } = useRoomNavigate(); + const mDirects = useAtomValue(mDirectAtom); + const spaces = useSpaces(mx, allRoomsAtom); + const rooms = useRooms(mx, allRoomsAtom, mDirects); + const directs = useDirects(mx, allRoomsAtom, mDirects); + const roomToUnread = useAtomValue(roomToUnreadAtom); + const roomToParents = useAtomValue(roomToParentsAtom); const handleSearchResults = (chunk, term) => { setResult({ @@ -97,7 +108,6 @@ function Search() { return; } - const { spaces, rooms, directs } = initMatrix.roomList; let ids = null; if (prefix) { @@ -109,15 +119,15 @@ function Search() { } ids.sort(roomIdByActivity); - const mappedIds = mapRoomIds(ids); + const mappedIds = mapRoomIds(ids, directs, roomToParents); asyncSearch.setup(mappedIds, { keys: 'name', isContain: true, limit: 20 }); if (prefix) handleSearchResults(mappedIds, prefix); else asyncSearch.search(term); }; const loadRecentRooms = () => { - const { recentRooms } = navigation; - handleSearchResults(mapRoomIds(recentRooms).reverse()); + const recentRooms = []; + handleSearchResults(mapRoomIds(recentRooms, directs, roomToParents).reverse()); }; const handleAfterOpen = () => { @@ -169,7 +179,6 @@ function Search() { } }; - const noti = initMatrix.notifications; const renderRoomSelector = (item) => { let imageSrc = null; let iconSrc = null; @@ -188,9 +197,9 @@ function Search() { roomId={item.roomId} imageSrc={imageSrc} iconSrc={iconSrc} - isUnread={noti.hasNoti(item.roomId)} - notificationCount={noti.getTotalNoti(item.roomId)} - isAlert={noti.getHighlightNoti(item.roomId) > 0} + isUnread={roomToUnread.has(item.roomId)} + notificationCount={roomToUnread.get(item.roomId)?.total ?? 0} + isAlert={roomToUnread.get(item.roomId)?.highlight > 0} onClick={() => openItem(item.roomId, item.type)} /> ); diff --git a/src/app/organisms/settings/CrossSigning.jsx b/src/app/organisms/settings/CrossSigning.jsx index 563e3152..9d848d5a 100644 --- a/src/app/organisms/settings/CrossSigning.jsx +++ b/src/app/organisms/settings/CrossSigning.jsx @@ -3,7 +3,6 @@ import React, { useState } from 'react'; import './CrossSigning.scss'; import FileSaver from 'file-saver'; import { Formik } from 'formik'; -import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; @@ -22,15 +21,17 @@ import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; const failedDialog = () => { const renderFailure = (requestClose) => (
    - {twemojify('❌')} + Failed to setup cross signing. Please try again.
    ); openReusableDialog( - Setup cross signing, - renderFailure, + + Setup cross signing + , + renderFailure ); }; @@ -48,11 +49,11 @@ const securityKeyDialog = (key) => { const renderSecurityKey = () => (
    Please save this security key somewhere safe. - - {key.encodedPrivateKey} - + {key.encodedPrivateKey}
    - +
    @@ -62,8 +63,10 @@ const securityKeyDialog = (key) => { downloadKey(); openReusableDialog( - Security Key, - () => renderSecurityKey(), + + Security Key + , + () => renderSecurityKey() ); }; @@ -112,7 +115,7 @@ function CrossSigningSetup() { errors.phrase = 'Phrase must contain 8-127 characters with no space.'; } if (values.confirmPhrase.length > 0 && values.confirmPhrase !== values.phrase) { - errors.confirmPhrase = 'Phrase don\'t match.'; + errors.confirmPhrase = "Phrase don't match."; } return errors; }; @@ -121,10 +124,14 @@ function CrossSigningSetup() {
    - We will generate a Security Key, - which you can use to manage messages backup and session verification. + We will generate a Security Key, which you can use to manage messages backup and + session verification. - {genWithPhrase !== false && } + {genWithPhrase !== false && ( + + )} {genWithPhrase === false && }
    OR @@ -133,9 +140,7 @@ function CrossSigningSetup() { onSubmit={(values) => setup(values.phrase)} validate={validator} > - {({ - values, errors, handleChange, handleSubmit, - }) => ( + {({ values, errors, handleChange, handleSubmit }) => (
    Alternatively you can also set a Security Phrase - so you don't have to remember long Security Key, - and optionally save the Key as backup. + so you don't have to remember long Security Key, and optionally save the Key as + backup. - {errors.phrase && {errors.phrase}} + {errors.phrase && ( + + {errors.phrase} + + )} - {errors.confirmPhrase && {errors.confirmPhrase}} - {genWithPhrase !== true && } + {errors.confirmPhrase && ( + + {errors.confirmPhrase} + + )} + {genWithPhrase !== true && ( + + )} {genWithPhrase === true && } )} @@ -177,31 +194,36 @@ function CrossSigningSetup() { const setupDialog = () => { openReusableDialog( - Setup cross signing, - () => , + + Setup cross signing + , + () => ); }; function CrossSigningReset() { return (
    - {twemojify('✋🧑‍🚒🤚')} + ✋🧑‍🚒🤚 Resetting cross-signing keys is permanent. - Anyone you have verified with will see security alerts and your message backup will be lost. - You almost certainly do not want to do this, - unless you have lost Security Key or Phrase and - every session you can cross-sign from. + Anyone you have verified with will see security alerts and your message backup will be lost. + You almost certainly do not want to do this, unless you have lost Security Key or{' '} + Phrase and every session you can cross-sign from. - +
    ); } const resetDialog = () => { openReusableDialog( - Reset cross signing, - () => , + + Reset cross signing + , + () => ); }; @@ -210,12 +232,23 @@ function CrossSignin() { return ( Setup to verify and keep track of all your sessions. Also required to backup encrypted message.} - options={( - isCSEnabled - ? - : - )} + content={ + + Setup to verify and keep track of all your sessions. Also required to backup encrypted + message. + + } + options={ + isCSEnabled ? ( + + ) : ( + + ) + } /> ); } diff --git a/src/app/organisms/settings/KeyBackup.jsx b/src/app/organisms/settings/KeyBackup.jsx index 75f032bc..b4f2125e 100644 --- a/src/app/organisms/settings/KeyBackup.jsx +++ b/src/app/organisms/settings/KeyBackup.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './KeyBackup.scss'; -import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; @@ -34,10 +33,7 @@ function CreateKeyBackupDialog({ keyData }) { let info; try { - info = await mx.prepareKeyBackupVersion( - null, - { secureSecretStorage: true }, - ); + info = await mx.prepareKeyBackupVersion(null, { secureSecretStorage: true }); info = await mx.createKeyBackupVersion(info); await mx.scheduleAllGroupSessionsForBackup(); if (!mountStore.getItem()) return; @@ -65,7 +61,7 @@ function CreateKeyBackupDialog({ keyData }) { )} {done === true && ( <> - {twemojify('✅')} + Successfully created backup )} @@ -104,12 +100,9 @@ function RestoreKeyBackupDialog({ keyData }) { try { const backupInfo = await mx.getKeyBackupVersion(); - const info = await mx.restoreKeyBackupWithSecretStorage( - backupInfo, - undefined, - undefined, - { progressCallback }, - ); + const info = await mx.restoreKeyBackupWithSecretStorage(backupInfo, undefined, undefined, { + progressCallback, + }); if (!mountStore.getItem()) return; setStatus({ done: `Successfully restored backup keys (${info.imported}/${info.total}).` }); } catch (e) { @@ -138,7 +131,7 @@ function RestoreKeyBackupDialog({ keyData }) { )} {status.done && ( <> - {twemojify('✅')} + {status.done} )} @@ -176,14 +169,16 @@ function DeleteKeyBackupDialog({ requestClose }) { return (
    - {twemojify('🗑')} + 🗑 Deleting key backup is permanent. All encrypted messages keys stored on server will be deleted. - { - isDeleting - ? - : - } + {isDeleting ? ( + + ) : ( + + )}
    ); } @@ -224,9 +219,11 @@ function KeyBackup() { if (keyData === null) return; openReusableDialog( - Create Key Backup, + + Create Key Backup + , () => , - () => fetchKeyBackupVersion(), + () => fetchKeyBackupVersion() ); }; @@ -235,29 +232,44 @@ function KeyBackup() { if (keyData === null) return; openReusableDialog( - Restore Key Backup, - () => , + + Restore Key Backup + , + () => ); }; - const openDeleteKeyBackup = () => openReusableDialog( - Delete Key Backup, - (requestClose) => ( - { - if (isDone) setKeyBackup(null); - requestClose(); - }} - /> - ), - ); + const openDeleteKeyBackup = () => + openReusableDialog( + + Delete Key Backup + , + (requestClose) => ( + { + if (isDone) setKeyBackup(null); + requestClose(); + }} + /> + ) + ); const renderOptions = () => { if (keyBackup === undefined) return ; - if (keyBackup === null) return ; + if (keyBackup === null) + return ( + + ); return ( <> - + ); @@ -266,9 +278,12 @@ function KeyBackup() { return ( - Online backup your encrypted messages keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key. + + Online backup your encrypted messages keys with your account data in case you lose + access to your sessions. Your keys will be secured with a unique Security Key. + {!isCSEnabled && ( )} - )} + } options={isCSEnabled ? renderOptions() : null} /> ); diff --git a/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx b/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx deleted file mode 100644 index 62ec76a3..00000000 --- a/src/app/organisms/shortcut-spaces/ShortcutSpaces.jsx +++ /dev/null @@ -1,169 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import './ShortcutSpaces.scss'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { createSpaceShortcut, deleteSpaceShortcut } from '../../../client/action/accountData'; -import { joinRuleToIconSrc } from '../../../util/matrixUtil'; -import { roomIdByAtoZ } from '../../../util/sort'; - -import Text from '../../atoms/text/Text'; -import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; -import Checkbox from '../../atoms/button/Checkbox'; -import Spinner from '../../atoms/spinner/Spinner'; -import RoomSelector from '../../molecules/room-selector/RoomSelector'; -import Dialog from '../../molecules/dialog/Dialog'; - -import PinIC from '../../../../public/res/ic/outlined/pin.svg'; -import PinFilledIC from '../../../../public/res/ic/filled/pin.svg'; -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; - -import { useSpaceShortcut } from '../../hooks/useSpaceShortcut'; - -function ShortcutSpacesContent() { - const mx = initMatrix.matrixClient; - const { spaces, roomIdToParents } = initMatrix.roomList; - - const [spaceShortcut] = useSpaceShortcut(); - const spaceWithoutShortcut = [...spaces].filter( - (spaceId) => !spaceShortcut.includes(spaceId), - ).sort(roomIdByAtoZ); - - const [process, setProcess] = useState(null); - const [selected, setSelected] = useState([]); - - useEffect(() => { - if (process !== null) { - setProcess(null); - setSelected([]); - } - }, [spaceShortcut]); - - const toggleSelection = (sId) => { - if (process !== null) return; - const newSelected = [...selected]; - const selectedIndex = newSelected.indexOf(sId); - - if (selectedIndex > -1) { - newSelected.splice(selectedIndex, 1); - setSelected(newSelected); - return; - } - newSelected.push(sId); - setSelected(newSelected); - }; - - const handleAdd = () => { - setProcess(`Pinning ${selected.length} spaces...`); - createSpaceShortcut(selected); - }; - - const renderSpace = (spaceId, isShortcut) => { - const room = mx.getRoom(spaceId); - if (!room) return null; - - const parentSet = roomIdToParents.get(spaceId); - const parentNames = parentSet - ? [...parentSet].map((parentId) => mx.getRoom(parentId).name) - : undefined; - const parents = parentNames ? parentNames.join(', ') : null; - - const toggleSelected = () => toggleSelection(spaceId); - const deleteShortcut = () => deleteSpaceShortcut(spaceId); - - return ( - - ) : ( - - )} - /> - ); - }; - - return ( - <> - Pinned spaces - {spaceShortcut.length === 0 && No pinned spaces} - {spaceShortcut.map((spaceId) => renderSpace(spaceId, true))} - Unpinned spaces - {spaceWithoutShortcut.length === 0 && No unpinned spaces} - {spaceWithoutShortcut.map((spaceId) => renderSpace(spaceId, false))} - {selected.length !== 0 && ( -
    - {process && } - {process || `${selected.length} spaces selected`} - { !process && ( - - )} -
    - )} - - ); -} - -function useVisibilityToggle() { - const [isOpen, setIsOpen] = useState(false); - - useEffect(() => { - const handleOpen = () => setIsOpen(true); - navigation.on(cons.events.navigation.SHORTCUT_SPACES_OPENED, handleOpen); - return () => { - navigation.removeListener(cons.events.navigation.SHORTCUT_SPACES_OPENED, handleOpen); - }; - }, []); - - const requestClose = () => setIsOpen(false); - - return [isOpen, requestClose]; -} - -function ShortcutSpaces() { - const [isOpen, requestClose] = useVisibilityToggle(); - - return ( - - Pin spaces - - )} - contentOptions={} - onRequestClose={requestClose} - > - { - isOpen - ? - :
    - } -
    - ); -} - -export default ShortcutSpaces; diff --git a/src/app/organisms/shortcut-spaces/ShortcutSpaces.scss b/src/app/organisms/shortcut-spaces/ShortcutSpaces.scss deleted file mode 100644 index 686c8cc0..00000000 --- a/src/app/organisms/shortcut-spaces/ShortcutSpaces.scss +++ /dev/null @@ -1,52 +0,0 @@ -@use '../../partials/dir'; -@use '../../partials/flex'; - -.shortcut-spaces { - height: 100%; - .dialog__content-container { - padding: 0; - padding-bottom: 80px; - @include dir.side(padding, var(--sp-extra-tight), 0); - - & > .text-b1 { - padding: 0 var(--sp-extra-tight); - } - } - - &__header { - margin-top: var(--sp-extra-tight); - padding: var(--sp-extra-tight); - text-transform: uppercase; - } - - .room-selector { - margin: 0 var(--sp-extra-tight); - } - .room-selector__options { - display: flex; - .checkbox { - margin: 0 6px; - } - } - - &__footer { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - padding: var(--sp-normal); - background-color: var(--bg-surface); - border-top: 1px solid var(--bg-surface-border); - display: flex; - align-items: center; - - & > .text { - @extend .cp-fx__item-one; - padding: 0 var(--sp-tight); - } - - & > button { - @include dir.side(margin, var(--sp-normal), 0); - } - } -} diff --git a/src/app/organisms/space-manage/SpaceManage.jsx b/src/app/organisms/space-manage/SpaceManage.jsx deleted file mode 100644 index 60f00ad3..00000000 --- a/src/app/organisms/space-manage/SpaceManage.jsx +++ /dev/null @@ -1,433 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import './SpaceManage.scss'; - -import { twemojify } from '../../../util/twemojify'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import colorMXID from '../../../util/colorMXID'; -import { selectRoom, selectTab } from '../../../client/action/navigation'; -import RoomsHierarchy from '../../../client/state/RoomsHierarchy'; -import { joinRuleToIconSrc } from '../../../util/matrixUtil'; -import { join } from '../../../client/action/room'; -import { Debounce } from '../../../util/common'; - -import Text from '../../atoms/text/Text'; -import RawIcon from '../../atoms/system-icons/RawIcon'; -import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; -import Checkbox from '../../atoms/button/Checkbox'; -import Avatar from '../../atoms/avatar/Avatar'; -import Spinner from '../../atoms/spinner/Spinner'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import PopupWindow from '../../molecules/popup-window/PopupWindow'; - -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; -import ChevronRightIC from '../../../../public/res/ic/outlined/chevron-right.svg'; -import InfoIC from '../../../../public/res/ic/outlined/info.svg'; - -import { useForceUpdate } from '../../hooks/useForceUpdate'; -import { useStore } from '../../hooks/useStore'; - -function SpaceManageBreadcrumb({ path, onSelect }) { - return ( -
    - -
    - { - path.map((item, index) => ( - - {index > 0 && } - - - )) - } -
    -
    -
    - ); -} -SpaceManageBreadcrumb.propTypes = { - path: PropTypes.arrayOf(PropTypes.exact({ - roomId: PropTypes.string, - name: PropTypes.string, - })).isRequired, - onSelect: PropTypes.func.isRequired, -}; - -function SpaceManageItem({ - parentId, roomInfo, onSpaceClick, requestClose, - isSelected, onSelect, roomHierarchy, -}) { - const [isExpand, setIsExpand] = useState(false); - const [isJoining, setIsJoining] = useState(false); - - const { directs } = initMatrix.roomList; - const mx = initMatrix.matrixClient; - const parentRoom = mx.getRoom(parentId); - const isSpace = roomInfo.room_type === 'm.space'; - const roomId = roomInfo.room_id; - const canManage = parentRoom?.currentState.maySendStateEvent('m.space.child', mx.getUserId()) || false; - const isSuggested = parentRoom?.currentState.getStateEvents('m.space.child', roomId)?.getContent().suggested === true; - - const room = mx.getRoom(roomId); - const isJoined = !!(room?.getMyMembership() === 'join' || null); - const name = room?.name || roomInfo.name || roomInfo.canonical_alias || roomId; - let imageSrc = mx.mxcUrlToHttp(roomInfo.avatar_url, 24, 24, 'crop') || null; - if (!imageSrc && room) { - imageSrc = room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - if (imageSrc === null) imageSrc = room.getAvatarUrl(mx.baseUrl, 24, 24, 'crop') || null; - } - const isDM = directs.has(roomId); - - const handleOpen = () => { - if (isSpace) selectTab(roomId); - else selectRoom(roomId); - requestClose(); - }; - const handleJoin = () => { - const viaSet = roomHierarchy.viaMap.get(roomId); - const via = viaSet ? [...viaSet] : undefined; - join(roomId, false, via); - setIsJoining(true); - }; - - const roomAvatarJSX = ( - - ); - const roomNameJSX = ( - - {twemojify(name)} - {` • ${roomInfo.num_joined_members} members`} - - ); - - const expandBtnJsx = ( - setIsExpand(!isExpand)} - /> - ); - - return ( -
    -
    - {canManage && onSelect(roomId)} variant="positive" />} - - {roomInfo.topic && expandBtnJsx} - { - isJoined - ? - : - } -
    - {isExpand && roomInfo.topic && {twemojify(roomInfo.topic, undefined, true)}} -
    - ); -} -SpaceManageItem.propTypes = { - parentId: PropTypes.string.isRequired, - roomHierarchy: PropTypes.shape({}).isRequired, - roomInfo: PropTypes.shape({}).isRequired, - onSpaceClick: PropTypes.func.isRequired, - requestClose: PropTypes.func.isRequired, - isSelected: PropTypes.bool.isRequired, - onSelect: PropTypes.func.isRequired, -}; - -function SpaceManageFooter({ parentId, selected }) { - const [process, setProcess] = useState(null); - const mx = initMatrix.matrixClient; - const room = mx.getRoom(parentId); - const { currentState } = room; - - const allSuggested = selected.every((roomId) => { - const sEvent = currentState.getStateEvents('m.space.child', roomId); - return !!sEvent?.getContent()?.suggested; - }); - - const handleRemove = () => { - setProcess(`Removing ${selected.length} items`); - selected.forEach((roomId) => { - mx.sendStateEvent(parentId, 'm.space.child', {}, roomId); - }); - }; - - const handleToggleSuggested = (isMark) => { - if (isMark) setProcess(`Marking as suggested ${selected.length} items`); - else setProcess(`Marking as not suggested ${selected.length} items`); - selected.forEach((roomId) => { - const sEvent = room.currentState.getStateEvents('m.space.child', roomId); - if (!sEvent) return; - const content = { ...sEvent.getContent() }; - if (isMark && content.suggested) return; - if (!isMark && !content.suggested) return; - content.suggested = isMark; - mx.sendStateEvent(parentId, 'm.space.child', content, roomId); - }); - }; - - return ( -
    - {process && } - {process || `${selected.length} item selected`} - { !process && ( - <> - - - - )} -
    - ); -} -SpaceManageFooter.propTypes = { - parentId: PropTypes.string.isRequired, - selected: PropTypes.arrayOf(PropTypes.string).isRequired, -}; - -function useSpacePath(roomId) { - const mx = initMatrix.matrixClient; - const room = mx.getRoom(roomId); - const [spacePath, setSpacePath] = useState([{ roomId, name: room.name }]); - - const addPathItem = (rId, name) => { - const newPath = [...spacePath]; - const itemIndex = newPath.findIndex((item) => item.roomId === rId); - if (itemIndex < 0) { - newPath.push({ roomId: rId, name }); - setSpacePath(newPath); - return; - } - newPath.splice(itemIndex + 1); - setSpacePath(newPath); - }; - - return [spacePath, addPathItem]; -} - -function useUpdateOnJoin(roomId) { - const [, forceUpdate] = useForceUpdate(); - const { roomList } = initMatrix; - - useEffect(() => { - const handleRoomList = () => forceUpdate(); - - roomList.on(cons.events.roomList.ROOM_JOINED, handleRoomList); - roomList.on(cons.events.roomList.ROOM_LEAVED, handleRoomList); - return () => { - roomList.removeListener(cons.events.roomList.ROOM_JOINED, handleRoomList); - roomList.removeListener(cons.events.roomList.ROOM_LEAVED, handleRoomList); - }; - }, [roomId]); -} - -function useChildUpdate(roomId, roomsHierarchy) { - const [, forceUpdate] = useForceUpdate(); - const [debounce] = useState(new Debounce()); - const mx = initMatrix.matrixClient; - - useEffect(() => { - let isMounted = true; - const handleStateEvent = (event) => { - if (event.getRoomId() !== roomId) return; - if (event.getType() !== 'm.space.child') return; - - debounce._(() => { - if (!isMounted) return; - roomsHierarchy.removeHierarchy(roomId); - forceUpdate(); - }, 500)(); - }; - mx.on('RoomState.events', handleStateEvent); - return () => { - isMounted = false; - mx.removeListener('RoomState.events', handleStateEvent); - }; - }, [roomId, roomsHierarchy]); -} - -function SpaceManageContent({ roomId, requestClose }) { - const mx = initMatrix.matrixClient; - useUpdateOnJoin(roomId); - const [, forceUpdate] = useForceUpdate(); - const [roomsHierarchy] = useState(new RoomsHierarchy(mx, 30)); - const [spacePath, addPathItem] = useSpacePath(roomId); - const [isLoading, setIsLoading] = useState(true); - const [selected, setSelected] = useState([]); - const mountStore = useStore(); - const currentPath = spacePath[spacePath.length - 1]; - useChildUpdate(currentPath.roomId, roomsHierarchy); - - const currentHierarchy = roomsHierarchy.getHierarchy(currentPath.roomId); - - useEffect(() => { - mountStore.setItem(true); - return () => { - mountStore.setItem(false); - }; - }, [roomId]); - - useEffect(() => { - setSelected([]); - }, [spacePath]); - - const handleSelected = (selectedRoomId) => { - const newSelected = [...selected]; - const selectedIndex = newSelected.indexOf(selectedRoomId); - - if (selectedIndex > -1) { - newSelected.splice(selectedIndex, 1); - setSelected(newSelected); - return; - } - newSelected.push(selectedRoomId); - setSelected(newSelected); - }; - - const loadRoomHierarchy = async () => { - if (!roomsHierarchy.canLoadMore(currentPath.roomId)) return; - if (!roomsHierarchy.getHierarchy(currentPath.roomId)) setSelected([]); - setIsLoading(true); - try { - await roomsHierarchy.load(currentPath.roomId); - if (!mountStore.getItem()) return; - setIsLoading(false); - forceUpdate(); - } catch { - if (!mountStore.getItem()) return; - setIsLoading(false); - forceUpdate(); - } - }; - - if (!currentHierarchy) loadRoomHierarchy(); - return ( -
    - {spacePath.length > 1 && ( - - )} - Rooms and spaces -
    - {!isLoading && currentHierarchy?.rooms?.length === 1 && ( - - Either the space contains private rooms or you need to join space to view it's rooms. - - )} - {currentHierarchy && (currentHierarchy.rooms?.map((roomInfo) => ( - roomInfo.room_id === currentPath.roomId - ? null - : ( - - ) - )))} - {!currentHierarchy && loading...} -
    - {currentHierarchy?.canLoadMore && !isLoading && ( - - )} - {isLoading && ( -
    - - Loading rooms... -
    - )} - {selected.length > 0 && ( - - )} -
    - ); -} -SpaceManageContent.propTypes = { - roomId: PropTypes.string.isRequired, - requestClose: PropTypes.func.isRequired, -}; - -function useWindowToggle() { - const [roomId, setRoomId] = useState(null); - - useEffect(() => { - const openSpaceManage = (rId) => { - setRoomId(rId); - }; - navigation.on(cons.events.navigation.SPACE_MANAGE_OPENED, openSpaceManage); - return () => { - navigation.removeListener(cons.events.navigation.SPACE_MANAGE_OPENED, openSpaceManage); - }; - }, []); - - const requestClose = () => setRoomId(null); - - return [roomId, requestClose]; -} -function SpaceManage() { - const mx = initMatrix.matrixClient; - const [roomId, requestClose] = useWindowToggle(); - const room = mx.getRoom(roomId); - - return ( - - {roomId && twemojify(room.name)} - — manage rooms - - )} - contentOptions={} - onRequestClose={requestClose} - > - { - roomId - ? - :
    - } - - ); -} - -export default SpaceManage; diff --git a/src/app/organisms/space-manage/SpaceManage.scss b/src/app/organisms/space-manage/SpaceManage.scss deleted file mode 100644 index b72c92d8..00000000 --- a/src/app/organisms/space-manage/SpaceManage.scss +++ /dev/null @@ -1,168 +0,0 @@ -@use '../../partials/text'; -@use '../../partials/dir'; -@use '../../partials/flex'; - -.space-manage { - & .pw__content-wrapper { - position: relative; - } - & .pw__content-container { - padding-top: 0; - padding-bottom: 73px; - } -} - -.space-manage__content { - margin-bottom: var(--sp-extra-loose); - - & > .text { - margin-top: var(--sp-extra-tight); - padding: var(--sp-extra-tight) var(--sp-normal); - text-transform: uppercase; - } - - &-items { - @include dir.side(padding, var(--sp-extra-tight), 0); - & > .text:first-child { - padding: var(--sp-extra-tight); - } - } - - & > button { - margin: var(--sp-normal); - } - - &-loading { - padding: var(--sp-loose); - display: flex; - justify-content: center; - align-items: center; - & .text { - margin: 0 var(--sp-normal); - } - } -} -.space-manage-breadcrumb { - display: flex; - align-items: center; - height: 100%; - margin: 0 var(--sp-extra-tight); - - &__wrapper { - height: var(--header-height); - position: sticky; - top: 0; - z-index: 99; - background-color: var(--bg-surface); - } - & > * { - flex-shrink: 0; - } - - & > .btn-surface { - min-width: 0; - padding: var(--sp-extra-tight) 10px; - white-space: nowrap; - box-shadow: none; - & p { - @extend .cp-txt__ellipsis; - max-width: 200px; - } - &:last-child { - box-shadow: var(--bs-surface-border) !important; - background-color: var(--bg-surface); - } - } - -} - -.space-manage-item { - margin: var(--sp-ultra-tight) var(--sp-extra-tight); - padding: 0 var(--sp-extra-tight); - border-radius: var(--bo-radius); - - & > div { - min-height: 40px; - display: flex; - align-items: center; - } - - &--space { - @extend .space-manage-item; - & .space-manage-item__btn { - cursor: pointer; - } - } - - &:hover { - background-color: var(--bg-surface-hover); - } - - & .checkbox { - @include dir.side(margin, 0, var(--sp-tight)); - } - - - &__btn { - @extend .cp-fx__item-one; - display: flex; - align-items: center; - - & .avatar__border--active { - box-shadow: none; - } - & > .text-b1 { - @extend .cp-fx__item-one; - @extend .cp-txt__ellipsis; - min-width: 0; - margin: 0 var(--sp-extra-tight); - } - & > .text-b2 { - margin: 0 var(--sp-extra-tight); - padding: 1px var(--sp-ultra-tight); - color: var(--bg-positive); - box-shadow: var(--bs-positive-border); - border-radius: 4px; - } - } - - & .ic-btn { - padding: 7px; - @include dir.side(margin, 0, var(--sp-extra-tight)); - opacity: 0.7; - } - - & .btn-surface, - & .btn-primary { - padding: var(--sp-ultra-tight) var(--sp-extra-tight); - min-width: 60px; - } - - & > .text { - padding: 32px; - padding-top: 0; - padding-bottom: var(--sp-normal); - white-space: pre-wrap; - } -} - -.space-manage__footer { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - padding: var(--sp-normal); - background-color: var(--bg-surface); - border-top: 1px solid var(--bg-surface-border); - display: flex; - align-items: center; - - & > .text { - @extend .cp-fx__item-one; - padding: 0 var(--sp-tight); - } - - & > button { - @include dir.side(margin, var(--sp-normal), 0); - } -} \ No newline at end of file diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index 46fe7b3f..ff6c1863 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -2,12 +2,9 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './SpaceSettings.scss'; -import { twemojify } from '../../../util/twemojify'; - import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { leave } from '../../../client/action/room'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; @@ -29,6 +26,7 @@ import LeaveArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; import EmojiIC from '../../../../public/res/ic/outlined/emoji.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const tabText = { GENERAL: 'General', @@ -62,6 +60,7 @@ const tabItems = [ function GeneralSettings({ roomId }) { const roomName = initMatrix.matrixClient.getRoom(roomId)?.name; + const mx = useMatrixClient(); return ( <> @@ -76,7 +75,7 @@ function GeneralSettings({ roomId }) { 'Leave', 'danger' ); - if (isConfirmed) leave(roomId); + if (isConfirmed) mx.leave(roomId); }} iconSrc={LeaveArrowIC} > @@ -138,7 +137,7 @@ function SpaceSettings() { className="space-settings" title={ - {isOpen && twemojify(room.name)} + {isOpen && room.name} — space settings } diff --git a/src/app/organisms/sticker-board/StickerBoard.jsx b/src/app/organisms/sticker-board/StickerBoard.jsx deleted file mode 100644 index 91e25918..00000000 --- a/src/app/organisms/sticker-board/StickerBoard.jsx +++ /dev/null @@ -1,115 +0,0 @@ -/* eslint-disable jsx-a11y/click-events-have-key-events */ -/* eslint-disable jsx-a11y/no-static-element-interactions */ -import React, { useRef } from 'react'; -import PropTypes from 'prop-types'; -import './StickerBoard.scss'; - -import initMatrix from '../../../client/initMatrix'; -import { getRelevantPacks } from '../emoji-board/custom-emoji'; - -import Text from '../../atoms/text/Text'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import IconButton from '../../atoms/button/IconButton'; - -function StickerBoard({ roomId, onSelect }) { - const mx = initMatrix.matrixClient; - const room = mx.getRoom(roomId); - const scrollRef = useRef(null); - - const parentIds = initMatrix.roomList.getAllParentSpaces(room.roomId); - const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); - - const packs = getRelevantPacks( - mx, - [room, ...parentRooms], - ).filter((pack) => pack.getStickers().length !== 0); - - function isTargetNotSticker(target) { - return target.classList.contains('sticker-board__sticker') === false; - } - function getStickerData(target) { - const mxc = target.getAttribute('data-mx-sticker'); - const body = target.getAttribute('title'); - const httpUrl = target.getAttribute('src'); - return { mxc, body, httpUrl }; - } - const handleOnSelect = (e) => { - if (isTargetNotSticker(e.target)) return; - - const stickerData = getStickerData(e.target); - onSelect(stickerData); - }; - - const openGroup = (groupIndex) => { - const scrollContent = scrollRef.current.firstElementChild; - scrollContent.children[groupIndex].scrollIntoView(); - }; - - const renderPack = (pack) => ( -
    - {pack.displayName ?? 'Unknown'} -
    - {pack.getStickers().map((sticker) => ( - {sticker.shortcode} - ))} -
    -
    - ); - - return ( -
    - {packs.length > 0 && ( - -
    - {packs.map((pack, index) => { - const src = mx.mxcUrlToHttp(pack.avatarUrl ?? pack.getStickers()[0].mxc); - return ( - openGroup(index)} - src={src} - tooltip={pack.displayName || 'Unknown'} - tooltipPlacement="left" - isImage - /> - ); - })} -
    -
    - )} -
    - -
    - { - packs.length > 0 - ? packs.map(renderPack) - : ( -
    - There is no sticker pack. -
    - ) - } -
    -
    -
    -
    -
    - ); -} -StickerBoard.propTypes = { - roomId: PropTypes.string.isRequired, - onSelect: PropTypes.func.isRequired, -}; - -export default StickerBoard; diff --git a/src/app/organisms/sticker-board/StickerBoard.scss b/src/app/organisms/sticker-board/StickerBoard.scss deleted file mode 100644 index b4e55130..00000000 --- a/src/app/organisms/sticker-board/StickerBoard.scss +++ /dev/null @@ -1,74 +0,0 @@ -@use '../../partials/dir'; - -.sticker-board { - --sticker-board-height: 390px; - --sticker-board-width: 286px; - display: flex; - height: var(--sticker-board-height); - display: flex; - - & > .scrollbar { - width: initial; - height: var(--sticker-board-height); - } - - &__sidebar { - display: flex; - flex-direction: column; - min-height: 100%; - padding: 4px 6px; - @include dir.side(border, none, 1px solid var(--bg-surface-border)); - } - - &__container { - flex-grow: 1; - min-width: 0; - width: var(--sticker-board-width); - display: flex; - } - - &__content { - min-height: 100%; - } - - &__pack { - margin-bottom: var(--sp-normal); - position: relative; - - &-header { - position: sticky; - top: 0; - z-index: 99; - background-color: var(--bg-surface); - - @include dir.side(margin, var(--sp-extra-tight), 0); - padding: var(--sp-extra-tight) var(--sp-ultra-tight); - text-transform: uppercase; - box-shadow: 0 -4px 0 0 var(--bg-surface); - border-bottom: 1px solid var(--bg-surface-border); - } - &-items { - margin: var(--sp-tight); - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - display: flex; - flex-wrap: wrap; - gap: var(--sp-normal) var(--sp-tight); - - img { - width: 76px; - height: 76px; - object-fit: contain; - cursor: pointer; - } - } - } - - &__empty { - width: 100%; - height: var(--sticker-board-height); - display: flex; - justify-content: center; - align-items: center; - text-align: center; - } -} \ No newline at end of file diff --git a/src/app/organisms/view-source/ViewSource.jsx b/src/app/organisms/view-source/ViewSource.jsx deleted file mode 100644 index 9bd3334f..00000000 --- a/src/app/organisms/view-source/ViewSource.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import PropTypes from 'prop-types'; -import './ViewSource.scss'; - -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; - -import IconButton from '../../atoms/button/IconButton'; -import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import PopupWindow from '../../molecules/popup-window/PopupWindow'; - -import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; - -function ViewSourceBlock({ title, json }) { - return ( -
    - {title} - -
    -          
    -            {JSON.stringify(json, null, 2)}
    -          
    -        
    -
    -
    - ); -} -ViewSourceBlock.propTypes = { - title: PropTypes.string.isRequired, - json: PropTypes.shape({}).isRequired, -}; - -function ViewSource() { - const [isOpen, setIsOpen] = useState(false); - const [event, setEvent] = useState(null); - - useEffect(() => { - const loadViewSource = (e) => { - setEvent(e); - setIsOpen(true); - }; - navigation.on(cons.events.navigation.VIEWSOURCE_OPENED, loadViewSource); - return () => { - navigation.removeListener(cons.events.navigation.VIEWSOURCE_OPENED, loadViewSource); - }; - }, []); - - const handleAfterClose = () => { - setEvent(null); - }; - - const renderViewSource = () => ( -
    - {event.isEncrypted() && } - -
    - ); - - return ( - setIsOpen(false)} - contentOptions={ setIsOpen(false)} tooltip="Close" />} - > - {event ? renderViewSource() :
    } - - ); -} - -export default ViewSource; diff --git a/src/app/organisms/view-source/ViewSource.scss b/src/app/organisms/view-source/ViewSource.scss deleted file mode 100644 index 9ceab8b0..00000000 --- a/src/app/organisms/view-source/ViewSource.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use '../../partials/dir'; - -.view-source { - @include dir.side(margin, var(--sp-normal), var(--sp-extra-tight)); - - & pre { - padding: var(--sp-extra-tight); - white-space: pre-wrap; - word-break: break-all; - } - - &__card { - margin: var(--sp-normal) 0; - background-color: var(--bg-surface-hover); - border-radius: var(--bo-radius); - box-shadow: var(--bs-surface-border); - overflow: hidden; - } -} diff --git a/src/app/organisms/welcome/Welcome.jsx b/src/app/organisms/welcome/Welcome.jsx deleted file mode 100644 index 6d135bee..00000000 --- a/src/app/organisms/welcome/Welcome.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import './Welcome.scss'; - -import Text from '../../atoms/text/Text'; - -import CinnySvg from '../../../../public/res/svg/cinny.svg'; - -function Welcome() { - return ( -
    -
    - Cinny logo - Welcome to Cinny - Yet another matrix client -
    -
    - ); -} - -export default Welcome; diff --git a/src/app/organisms/welcome/Welcome.scss b/src/app/organisms/welcome/Welcome.scss deleted file mode 100644 index e55bb8ed..00000000 --- a/src/app/organisms/welcome/Welcome.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use '../../partials/flex'; - -.app-welcome { - width: 100%; - height: 100%; - background-color: var(--bg-surface); - - & > div { - @extend .cp-fx__column--c-c; - max-width: 600px; - } - &__logo { - width: 64px; - height: 64px; - } - &__heading { - margin: var(--sp-extra-loose) 0 var(--sp-tight); - color: var(--tc-surface-high); - } - &__subheading { - color: var(--tc-surface-normal); - } -} \ No newline at end of file diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx index ffa20d4e..7d0f4fde 100644 --- a/src/app/pages/Router.tsx +++ b/src/app/pages/Router.tsx @@ -54,6 +54,7 @@ import { PageRoot } from '../components/page'; import { ScreenSize } from '../hooks/useScreenSize'; import { MobileFriendlyPageNav, MobileFriendlyClientNav } from './MobileFriendly'; import { ClientInitStorageAtom } from './client/ClientInitStorageAtom'; +import { ClientNonUIFeatures } from './client/ClientNonUIFeatures'; export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) => { const { hashRouter } = clientConfig; @@ -101,15 +102,17 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) - - - - } - > - - + + + + + } + > + + + diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx new file mode 100644 index 00000000..27d1ae40 --- /dev/null +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -0,0 +1,231 @@ +import { useAtomValue } from 'jotai'; +import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; +import { roomToUnreadAtom, unreadEqual, unreadInfoToUnread } from '../../state/room/roomToUnread'; +import LogoSVG from '../../../../public/res/svg/cinny.svg'; +import LogoUnreadSVG from '../../../../public/res/svg/cinny-unread.svg'; +import LogoHighlightSVG from '../../../../public/res/svg/cinny-highlight.svg'; +import { setFavicon } from '../../utils/dom'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; +import { allInvitesAtom } from '../../state/room-list/inviteList'; +import { usePreviousValue } from '../../hooks/usePreviousValue'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { getInboxInvitesPath, getInboxNotificationsPath } from '../pathUtils'; +import { + getMemberDisplayName, + getNotificationType, + getUnreadInfo, + isNotificationEvent, +} from '../../utils/room'; +import { NotificationType, UnreadInfo } from '../../../types/matrix/room'; +import { getMxIdLocalPart } from '../../utils/matrix'; +import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; +import { useInboxNotificationsSelected } from '../../hooks/router/useInbox'; + +function FaviconUpdater() { + const roomToUnread = useAtomValue(roomToUnreadAtom); + + useEffect(() => { + if (roomToUnread.size === 0) { + setFavicon(LogoSVG); + } else { + const highlight = Array.from(roomToUnread.entries()).find( + ([, unread]) => unread.highlight > 0 + ); + + setFavicon(highlight ? LogoHighlightSVG : LogoUnreadSVG); + } + }, [roomToUnread]); + + return null; +} + +function InviteNotifications() { + const audioRef = useRef(null); + const invites = useAtomValue(allInvitesAtom); + const perviousInviteLen = usePreviousValue(invites.length, 0); + const mx = useMatrixClient(); + + const navigate = useNavigate(); + const [notificationSound] = useSetting(settingsAtom, 'isNotificationSounds'); + + const notify = useCallback( + (count: number) => { + const noti = new window.Notification('Invitation', { + icon: LogoSVG, + badge: LogoSVG, + body: `You have ${count} new invitation request.`, + silent: true, + }); + + noti.onclick = () => { + if (!window.closed) navigate(getInboxInvitesPath()); + noti.close(); + }; + }, + [navigate] + ); + + const playSound = useCallback(() => { + const audioElement = audioRef.current; + audioElement?.play(); + }, []); + + useEffect(() => { + if (invites.length > perviousInviteLen && mx.getSyncState() === 'SYNCING') { + if (Notification.permission === 'granted') { + notify(invites.length - perviousInviteLen); + } + + if (notificationSound) { + playSound(); + } + } + }, [mx, invites, perviousInviteLen, notificationSound, notify, playSound]); + + return ( + // eslint-disable-next-line jsx-a11y/media-has-caption + + ); +} + +function MessageNotifications() { + const audioRef = useRef(null); + const notifRef = useRef(); + const unreadCacheRef = useRef>(new Map()); + const mx = useMatrixClient(); + const [showNotifications] = useSetting(settingsAtom, 'showNotifications'); + const [notificationSound] = useSetting(settingsAtom, 'isNotificationSounds'); + + const navigate = useNavigate(); + const notificationSelected = useInboxNotificationsSelected(); + const selectedRoomId = useSelectedRoom(); + + const notify = useCallback( + ({ + roomName, + roomAvatar, + username, + }: { + roomName: string; + roomAvatar?: string; + username: string; + roomId: string; + eventId: string; + }) => { + const noti = new window.Notification(roomName, { + icon: roomAvatar, + badge: roomAvatar, + body: `New inbox notification from ${username}`, + silent: true, + }); + + noti.onclick = () => { + if (!window.closed) navigate(getInboxNotificationsPath()); + noti.close(); + notifRef.current = undefined; + }; + + notifRef.current?.close(); + notifRef.current = noti; + }, + [navigate] + ); + + const playSound = useCallback(() => { + const audioElement = audioRef.current; + audioElement?.play(); + }, []); + + useEffect(() => { + const handleTimelineEvent: RoomEventHandlerMap[RoomEvent.Timeline] = ( + mEvent, + room, + toStartOfTimeline, + removed, + data + ) => { + if ( + mx.getSyncState() !== 'SYNCING' || + selectedRoomId === room?.roomId || + notificationSelected || + !room || + !data.liveEvent || + room.isSpaceRoom() || + !isNotificationEvent(mEvent) || + getNotificationType(mx, room.roomId) === NotificationType.Mute + ) + return; + + const sender = mEvent.getSender(); + const eventId = mEvent.getId(); + if (!sender || !eventId || mEvent.getSender() === mx.getUserId()) return; + const unreadInfo = getUnreadInfo(room); + const cachedUnreadInfo = unreadCacheRef.current.get(room.roomId); + unreadCacheRef.current.set(room.roomId, unreadInfo); + + if ( + cachedUnreadInfo && + unreadEqual(unreadInfoToUnread(cachedUnreadInfo), unreadInfoToUnread(unreadInfo)) + ) { + return; + } + + if (showNotifications && Notification.permission === 'granted') { + const avatarMxc = + room.getAvatarFallbackMember()?.getMxcAvatarUrl() ?? room.getMxcAvatarUrl(); + notify({ + roomName: room.name ?? 'Unknown', + roomAvatar: avatarMxc + ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined + : undefined, + username: getMemberDisplayName(room, sender) ?? getMxIdLocalPart(sender) ?? sender, + roomId: room.roomId, + eventId, + }); + } + + if (notificationSound) { + playSound(); + } + }; + mx.on(RoomEvent.Timeline, handleTimelineEvent); + return () => { + mx.removeListener(RoomEvent.Timeline, handleTimelineEvent); + }; + }, [ + mx, + notificationSound, + notificationSelected, + showNotifications, + playSound, + notify, + selectedRoomId, + ]); + + return ( + // eslint-disable-next-line jsx-a11y/media-has-caption + + ); +} + +type ClientNonUIFeaturesProps = { + children: ReactNode; +}; + +export function ClientNonUIFeatures({ children }: ClientNonUIFeaturesProps) { + return ( + <> + + + + {children} + + ); +} diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx index 1bb7855b..6a1dbcb1 100644 --- a/src/app/pages/client/ClientRoot.tsx +++ b/src/app/pages/client/ClientRoot.tsx @@ -2,7 +2,6 @@ import { Box, Spinner, Text } from 'folds'; import React, { ReactNode, useEffect, useState } from 'react'; import initMatrix from '../../../client/initMatrix'; import { initHotkeys } from '../../../client/event/hotkeys'; -import { initRoomListListener } from '../../../client/event/roomList'; import { getSecret } from '../../../client/state/auth'; import { SplashScreen } from '../../components/splash-screen'; import { CapabilitiesAndMediaConfigLoader } from '../../components/CapabilitiesAndMediaConfigLoader'; @@ -49,7 +48,6 @@ export function ClientRoot({ children }: ClientRootProps) { useEffect(() => { const handleStart = () => { initHotkeys(); - initRoomListListener(initMatrix.roomList); setLoading(false); }; initMatrix.once('init_loading_finished', handleStart); diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 1ab08f01..8b9d1847 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -31,13 +31,20 @@ import { InboxNotificationsPathSearchParams } from '../../paths'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { SequenceCard } from '../../../components/sequence-card'; import { RoomAvatar, RoomIcon } from '../../../components/room-avatar'; -import { getMemberAvatarMxc, getMemberDisplayName, getRoomAvatarUrl } from '../../../utils/room'; +import { + getEditedEvent, + getMemberAvatarMxc, + getMemberDisplayName, + getRoomAvatarUrl, +} from '../../../utils/room'; import { ScrollTopContainer } from '../../../components/scroll-top-container'; import { useInterval } from '../../../hooks/useInterval'; import { AvatarBase, ImageContent, MSticker, + MessageNotDecryptedContent, + MessageUnsupportedContent, ModernLayout, RedactedContent, Reply, @@ -62,6 +69,7 @@ import { markAsRead } from '../../../../client/action/notifications'; import { ContainerColor } from '../../../styles/ContainerColor.css'; import { VirtualTile } from '../../../components/virtualizer'; import { UserAvatar } from '../../../components/user-avatar'; +import { EncryptedContent } from '../../../features/room/message'; type RoomNotificationsGroup = { roomId: string; @@ -225,6 +233,78 @@ function RoomNotificationsGroupComp({ /> ); }, + [MessageEvent.RoomMessageEncrypted]: (evt, displayName) => { + const evtTimeline = room.getTimelineForEvent(evt.event_id); + + const mEvent = evtTimeline?.getEvents().find((e) => e.getId() === evt.event_id); + + if (!mEvent || !evtTimeline) { + return ( + + + {evt.type} + {' event'} + + + ); + } + + return ( + + {() => { + if (mEvent.isRedacted()) return ; + if (mEvent.getType() === MessageEvent.Sticker) + return ( + ( + } + renderViewer={(p) => } + /> + )} + /> + ); + if (mEvent.getType() === MessageEvent.RoomMessage) { + const editedEvent = getEditedEvent( + evt.event_id, + mEvent, + evtTimeline.getTimelineSet() + ); + const getContent = (() => + editedEvent?.getContent()['m.new_content'] ?? + mEvent.getContent()) as GetContentCallback; + + return ( + + ); + } + if (mEvent.getType() === MessageEvent.RoomMessageEncrypted) + return ( + + + + ); + return ( + + + + ); + }} + + ); + }, [MessageEvent.Sticker]: (event, displayName, getContent) => { if (event.unsigned?.redacted_because) { return ; @@ -398,7 +478,7 @@ const useNotificationsSearchParams = ( [searchParams] ); -const DEFAULT_REFRESH_MS = 10000; +const DEFAULT_REFRESH_MS = 7000; export function Notifications() { const mx = useMatrixClient(); @@ -441,9 +521,7 @@ export function Notifications() { useInterval( useCallback(() => { - if (document.hasFocus()) { - silentReloadTimeline(); - } + silentReloadTimeline(); }, [silentReloadTimeline]), refreshIntervalTime ); diff --git a/src/app/state/room/roomToUnread.ts b/src/app/state/room/roomToUnread.ts index 4ac391fe..5a009405 100644 --- a/src/app/state/room/roomToUnread.ts +++ b/src/app/state/room/roomToUnread.ts @@ -45,7 +45,7 @@ export type RoomToUnreadAction = roomId: string; }; -const unreadInfoToUnread = (unreadInfo: UnreadInfo): Unread => ({ +export const unreadInfoToUnread = (unreadInfo: UnreadInfo): Unread => ({ highlight: unreadInfo.highlight, total: unreadInfo.total, from: null, diff --git a/src/app/state/typingMembers.ts b/src/app/state/typingMembers.ts index 88d4687c..55bf8f62 100644 --- a/src/app/state/typingMembers.ts +++ b/src/app/state/typingMembers.ts @@ -1,6 +1,5 @@ import produce from 'immer'; import { atom, useSetAtom } from 'jotai'; -import { selectAtom } from 'jotai/utils'; import { MatrixClient, RoomMemberEvent, RoomMemberEventHandlerMap } from 'matrix-js-sdk'; import { useEffect } from 'react'; @@ -148,8 +147,3 @@ export const useBindRoomIdToTypingMembersAtom = ( }; }, [mx, setTypingMembers]); }; - -export const selectRoomTypingMembersAtom = ( - roomId: string, - typingMembersAtom: typeof roomIdToTypingMembersAtom -) => selectAtom(typingMembersAtom, (atoms) => atoms.get(roomId) ?? []); diff --git a/src/app/templates/auth/Auth.jsx b/src/app/templates/auth/Auth.jsx deleted file mode 100644 index 7c211736..00000000 --- a/src/app/templates/auth/Auth.jsx +++ /dev/null @@ -1,684 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { useState, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import './Auth.scss'; -import ReCAPTCHA from 'react-google-recaptcha'; -import { Formik } from 'formik'; - -import * as auth from '../../../client/action/auth'; -import cons from '../../../client/state/cons'; -import { Debounce, getUrlPrams } from '../../../util/common'; -import { getBaseUrl } from '../../../util/matrixUtil'; - -import Text from '../../atoms/text/Text'; -import Button from '../../atoms/button/Button'; -import IconButton from '../../atoms/button/IconButton'; -import Input from '../../atoms/input/Input'; -import Spinner from '../../atoms/spinner/Spinner'; -import ScrollView from '../../atoms/scroll/ScrollView'; -import Header, { TitleWrapper } from '../../atoms/header/Header'; -import Avatar from '../../atoms/avatar/Avatar'; -import ContextMenu, { MenuItem, MenuHeader } from '../../atoms/context-menu/ContextMenu'; - -import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; -import EyeIC from '../../../../public/res/ic/outlined/eye.svg'; -import EyeBlindIC from '../../../../public/res/ic/outlined/eye-blind.svg'; -import CinnySvg from '../../../../public/res/svg/cinny.svg'; -import SSOButtons from '../../molecules/sso-buttons/SSOButtons'; - -const LOCALPART_SIGNUP_REGEX = /^[a-z0-9_\-.=/]+$/; -const BAD_LOCALPART_ERROR = 'Username can only contain characters a-z, 0-9, or \'=_-./\''; -const USER_ID_TOO_LONG_ERROR = 'Your user ID, including the hostname, can\'t be more than 255 characters long.'; - -const PASSWORD_STRENGHT_REGEX = /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[^\w\d\s:])([^\s]){8,127}$/; -const BAD_PASSWORD_ERROR = 'Password must contain at least 1 lowercase, 1 uppercase, 1 number, 1 non-alphanumeric character, 8-127 characters with no space.'; -const CONFIRM_PASSWORD_ERROR = 'Passwords don\'t match.'; - -const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; -const BAD_EMAIL_ERROR = 'Invalid email address'; - -function isValidInput(value, regex) { - if (typeof regex === 'string') return regex === value; - return regex.test(value); -} -function normalizeUsername(rawUsername) { - const noLeadingAt = rawUsername.indexOf('@') === 0 ? rawUsername.substr(1) : rawUsername; - return noLeadingAt.trim(); -} - -let searchingHs = null; -function Homeserver({ onChange }) { - const [hs, setHs] = useState(null); - const [debounce] = useState(new Debounce()); - const [process, setProcess] = useState({ isLoading: true, message: 'Loading homeserver list...' }); - const hsRef = useRef(); - - const setupHsConfig = async (servername) => { - setProcess({ isLoading: true, message: 'Looking for homeserver...' }); - let baseUrl = null; - baseUrl = await getBaseUrl(servername); - - if (searchingHs !== servername) return; - setProcess({ isLoading: true, message: `Connecting to ${baseUrl}...` }); - const tempClient = auth.createTemporaryClient(baseUrl); - - Promise.allSettled([tempClient.loginFlows(), tempClient.register()]) - .then((values) => { - const loginFlow = values[0].status === 'fulfilled' ? values[0]?.value : undefined; - const registerFlow = values[1].status === 'rejected' ? values[1]?.reason?.data : undefined; - if (loginFlow === undefined || registerFlow === undefined) throw new Error(); - - if (searchingHs !== servername) return; - onChange({ baseUrl, login: loginFlow, register: registerFlow }); - setProcess({ isLoading: false }); - }).catch(() => { - if (searchingHs !== servername) return; - onChange(null); - setProcess({ isLoading: false, error: 'Unable to connect. Please check your input.' }); - }); - }; - - useEffect(() => { - onChange(null); - if (hs === null || hs?.selected.trim() === '') return; - searchingHs = hs.selected; - setupHsConfig(hs.selected); - }, [hs]); - - useEffect(async () => { - const link = window.location.href; - const configFileUrl = `${link}${link[link.length - 1] === '/' ? '' : '/'}config.json`; - try { - const result = await (await fetch(configFileUrl, { method: 'GET' })).json(); - const selectedHs = result?.defaultHomeserver; - const hsList = result?.homeserverList; - const allowCustom = result?.allowCustomHomeservers ?? true; - if (!hsList?.length > 0 || selectedHs < 0 || selectedHs >= hsList?.length) { - throw new Error(); - } - setHs({ selected: hsList[selectedHs], list: hsList, allowCustom }); - } catch { - setHs({ selected: 'matrix.org', list: ['matrix.org'], allowCustom: true }); - } - }, []); - - const handleHsInput = (e) => { - const { value } = e.target; - setProcess({ isLoading: false }); - debounce._(async () => { - setHs({ ...hs, selected: value.trim() }); - }, 700)(); - }; - - return ( - <> -
    - - ( - <> - Homeserver list - { - hs?.list.map((hsName) => ( - { - hideMenu(); - hsRef.current.value = hsName; - setHs({ ...hs, selected: hsName }); - }} - > - {hsName} - - )) - } - - )} - render={(toggleMenu) => } - /> -
    - {process.error !== undefined && {process.error}} - {process.isLoading && ( -
    - - {process.message} -
    - )} - - ); -} -Homeserver.propTypes = { - onChange: PropTypes.func.isRequired, -}; - -function Login({ loginFlow, baseUrl }) { - const [typeIndex, setTypeIndex] = useState(0); - const [passVisible, setPassVisible] = useState(false); - const loginTypes = ['Username', 'Email']; - const isPassword = loginFlow?.filter((flow) => flow.type === 'm.login.password')[0]; - const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0]; - - const initialValues = { - username: '', password: '', email: '', other: '', - }; - - const validator = (values) => { - const errors = {}; - if (typeIndex === 1 && values.email.length > 0 && !isValidInput(values.email, EMAIL_REGEX)) { - errors.email = BAD_EMAIL_ERROR; - } - return errors; - }; - const submitter = async (values, actions) => { - let userBaseUrl = baseUrl; - let { username } = values; - const mxIdMatch = username.match(/^@(.+):(.+\..+)$/); - if (typeIndex === 0 && mxIdMatch) { - [, username, userBaseUrl] = mxIdMatch; - userBaseUrl = await getBaseUrl(userBaseUrl); - } - - return auth.login( - userBaseUrl, - typeIndex === 0 ? normalizeUsername(username) : undefined, - typeIndex === 1 ? values.email : undefined, - values.password, - ).then(() => { - actions.setSubmitting(true); - window.location.reload(); - }).catch((error) => { - let msg = error.message; - if (msg === 'Unknown message') msg = 'Please check your credentials'; - actions.setErrors({ - password: msg === 'Invalid password' ? msg : undefined, - other: msg !== 'Invalid password' ? msg : undefined, - }); - actions.setSubmitting(false); - }); - }; - - return ( - <> -
    - Login - {isPassword && ( - ( - loginTypes.map((type, index) => ( - { - hideMenu(); - setTypeIndex(index); - }} - > - {type} - - )) - )} - render={(toggleMenu) => ( - - )} - /> - )} -
    - {isPassword && ( - - {({ - values, errors, handleChange, handleSubmit, isSubmitting, - }) => ( - <> - {isSubmitting && } -
    - {typeIndex === 0 && } - {errors.username && {errors.username}} - {typeIndex === 1 && } - {errors.email && {errors.email}} -
    - - setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" /> -
    - {errors.password && {errors.password}} - {errors.other && {errors.other}} -
    - -
    -
    - - )} -
    - )} - {ssoProviders && isPassword && OR} - {ssoProviders && ( - - )} - - ); -} -Login.propTypes = { - loginFlow: PropTypes.arrayOf( - PropTypes.shape({}), - ).isRequired, - baseUrl: PropTypes.string.isRequired, -}; - -let sid; -let clientSecret; -function Register({ registerInfo, loginFlow, baseUrl }) { - const [process, setProcess] = useState({}); - const [passVisible, setPassVisible] = useState(false); - const [cPassVisible, setCPassVisible] = useState(false); - const formRef = useRef(); - - const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0]; - const isDisabled = registerInfo.errcode !== undefined; - const { flows, params, session } = registerInfo; - - let isEmail = false; - let isEmailRequired = true; - let isRecaptcha = false; - let isTerms = false; - let isDummy = false; - - flows?.forEach((flow) => { - if (isEmailRequired && flow.stages.indexOf('m.login.email.identity') === -1) isEmailRequired = false; - if (!isEmail) isEmail = flow.stages.indexOf('m.login.email.identity') > -1; - if (!isRecaptcha) isRecaptcha = flow.stages.indexOf('m.login.recaptcha') > -1; - if (!isTerms) isTerms = flow.stages.indexOf('m.login.terms') > -1; - if (!isDummy) isDummy = flow.stages.indexOf('m.login.dummy') > -1; - }); - - const initialValues = { - username: '', password: '', confirmPassword: '', email: '', other: '', - }; - - const validator = (values) => { - const errors = {}; - if (values.username.list > 255) errors.username = USER_ID_TOO_LONG_ERROR; - if (values.username.length > 0 && !isValidInput(values.username, LOCALPART_SIGNUP_REGEX)) { - errors.username = BAD_LOCALPART_ERROR; - } - if (values.password.length > 0 && !isValidInput(values.password, PASSWORD_STRENGHT_REGEX)) { - errors.password = BAD_PASSWORD_ERROR; - } - if (values.confirmPassword.length > 0 - && !isValidInput(values.confirmPassword, values.password)) { - errors.confirmPassword = CONFIRM_PASSWORD_ERROR; - } - if (values.email.length > 0 && !isValidInput(values.email, EMAIL_REGEX)) { - errors.email = BAD_EMAIL_ERROR; - } - return errors; - }; - const submitter = (values, actions) => { - const tempClient = auth.createTemporaryClient(baseUrl); - clientSecret = tempClient.generateClientSecret(); - return tempClient.isUsernameAvailable(values.username) - .then(async (isAvail) => { - if (!isAvail) { - actions.setErrors({ username: 'Username is already taken' }); - actions.setSubmitting(false); - return; - } - if (isEmail && values.email.length > 0) { - const result = await auth.verifyEmail(baseUrl, values.email, clientSecret, 1); - if (result.errcode) { - if (result.errcode === 'M_THREEPID_IN_USE') actions.setErrors({ email: result.error }); - else actions.setErrors({ others: result.error || result.message }); - actions.setSubmitting(false); - return; - } - sid = result.sid; - } - setProcess({ type: 'processing', message: 'Registration in progress....' }); - actions.setSubmitting(false); - }).catch((err) => { - const msg = err.message || err.error; - if (['M_USER_IN_USE', 'M_INVALID_USERNAME', 'M_EXCLUSIVE'].indexOf(err.errcode) > -1) { - actions.setErrors({ username: err.errcode === 'M_USER_IN_USE' ? 'Username is already taken' : msg }); - } else if (msg) actions.setErrors({ other: msg }); - - actions.setSubmitting(false); - }); - }; - - const refreshWindow = () => window.location.reload(); - - const getInputs = () => { - const f = formRef.current; - return [f.username.value, f.password.value, f?.email?.value]; - }; - - useEffect(() => { - if (process.type !== 'processing') return; - const asyncProcess = async () => { - const [username, password, email] = getInputs(); - const d = await auth.completeRegisterStage(baseUrl, username, password, { session }); - - if (isRecaptcha && !d.completed.includes('m.login.recaptcha')) { - const sitekey = params['m.login.recaptcha'].public_key; - setProcess({ type: 'm.login.recaptcha', sitekey }); - return; - } - if (isTerms && !d.completed.includes('m.login.terms')) { - const pp = params['m.login.terms'].policies.privacy_policy; - const url = pp?.en.url || pp[Object.keys(pp)[0]].url; - setProcess({ type: 'm.login.terms', url }); - return; - } - if (isEmail && email.length > 0) { - setProcess({ type: 'm.login.email.identity', email }); - return; - } - if (isDummy) { - const data = await auth.completeRegisterStage(baseUrl, username, password, { - type: 'm.login.dummy', - session, - }); - if (data.done) refreshWindow(); - } - }; - asyncProcess(); - }, [process]); - - const handleRecaptcha = async (value) => { - if (typeof value !== 'string') return; - const [username, password] = getInputs(); - const d = await auth.completeRegisterStage(baseUrl, username, password, { - type: 'm.login.recaptcha', - response: value, - session, - }); - if (d.done) refreshWindow(); - else setProcess({ type: 'processing', message: 'Registration in progress...' }); - }; - const handleTerms = async () => { - const [username, password] = getInputs(); - const d = await auth.completeRegisterStage(baseUrl, username, password, { - type: 'm.login.terms', - session, - }); - if (d.done) refreshWindow(); - else setProcess({ type: 'processing', message: 'Registration in progress...' }); - }; - const handleEmailVerify = async () => { - const [username, password] = getInputs(); - const d = await auth.completeRegisterStage(baseUrl, username, password, { - type: 'm.login.email.identity', - threepidCreds: { sid, client_secret: clientSecret }, - threepid_creds: { sid, client_secret: clientSecret }, - session, - }); - if (d.done) refreshWindow(); - else setProcess({ type: 'processing', message: 'Registration in progress...' }); - }; - - return ( - <> - {process.type === 'processing' && } - {process.type === 'm.login.recaptcha' && } - {process.type === 'm.login.terms' && } - {process.type === 'm.login.email.identity' && } -
    - {!isDisabled && Register} - {isDisabled && {registerInfo.error}} -
    - {!isDisabled && ( - - {({ - values, errors, handleChange, handleSubmit, isSubmitting, - }) => ( - <> - {process.type === undefined && isSubmitting && } -
    - - {errors.username && {errors.username}} -
    - - setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" /> -
    - {errors.password && {errors.password}} -
    - - setCPassVisible(!cPassVisible)} src={cPassVisible ? EyeIC : EyeBlindIC} size="extra-small" /> -
    - {errors.confirmPassword && {errors.confirmPassword}} - {isEmail && } - {errors.email && {errors.email}} - {errors.other && {errors.other}} -
    - -
    -
    - - )} -
    - )} - {isDisabled && ssoProviders && ( - - )} - - ); -} -Register.propTypes = { - registerInfo: PropTypes.shape({}).isRequired, - loginFlow: PropTypes.arrayOf( - PropTypes.shape({}), - ).isRequired, - baseUrl: PropTypes.string.isRequired, -}; - -function AuthCard() { - const [hsConfig, setHsConfig] = useState(null); - const [type, setType] = useState('login'); - - const handleHsChange = (info) => { - console.log(info); - setHsConfig(info); - }; - - return ( - <> - - { hsConfig !== null && ( - type === 'login' - ? - : ( - - ) - )} - { hsConfig !== null && ( - - {`${(type === 'login' ? 'Don\'t have' : 'Already have')} an account?`} - - - )} - - ); -} - -function Auth() { - const [loginToken, setLoginToken] = useState(getUrlPrams('loginToken')); - - useEffect(async () => { - if (!loginToken) return; - if (localStorage.getItem(cons.secretKey.BASE_URL) === undefined) { - setLoginToken(null); - return; - } - const baseUrl = localStorage.getItem(cons.secretKey.BASE_URL); - try { - await auth.loginWithToken(baseUrl, loginToken); - - const { href } = window.location; - window.location.replace(href.slice(0, href.indexOf('?'))); - } catch { - setLoginToken(null); - } - }, []); - - return ( - -
    -
    - {loginToken && } - {!loginToken && ( -
    -
    - - - Cinny - -
    -
    - -
    -
    - )} -
    - - -
    -
    - ); -} - -function LoadingScreen({ message }) { - return ( - - -
    - {message} -
    -
    - ); -} -LoadingScreen.propTypes = { - message: PropTypes.string.isRequired, -}; - -function Recaptcha({ message, sitekey, onChange }) { - return ( - -
    - {message} -
    - -
    - ); -} -Recaptcha.propTypes = { - message: PropTypes.string.isRequired, - sitekey: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, -}; - -function Terms({ url, onSubmit }) { - return ( - -
    { e.preventDefault(); onSubmit(); }}> -
    - Agree with terms -
    - In order to complete registration, you need to agree to the terms and conditions. -
    - - - {'I accept '} - Terms and Conditions - -
    - -
    - - - ); -} -Terms.propTypes = { - url: PropTypes.string.isRequired, - onSubmit: PropTypes.func.isRequired, -}; - -function EmailVerify({ email, onContinue }) { - return ( - -
    - Verify email -
    - - {'Please check your email '} - {`(${email})`} - {' and validate before continuing further.'} - -
    - -
    -
    - ); -} -EmailVerify.propTypes = { - email: PropTypes.string.isRequired, -}; - -function ProcessWrapper({ children }) { - return ( -
    - {children} -
    - ); -} -ProcessWrapper.propTypes = { - children: PropTypes.node.isRequired, -}; - -export default Auth; diff --git a/src/app/templates/auth/Auth.scss b/src/app/templates/auth/Auth.scss deleted file mode 100644 index 956a2700..00000000 --- a/src/app/templates/auth/Auth.scss +++ /dev/null @@ -1,173 +0,0 @@ -@use '../../partials/flex'; -@use '../../partials/dir'; - -.auth__base { - --pattern-size: 48px; - min-height: 100%; - background-color: var(--bg-surface-low); - - background-image: radial-gradient(rgba(0, 0, 0, 6%) 2px, rgba(0, 0, 0, 0%) 2px); - background-size: var(--pattern-size) var(--pattern-size); - - display: flex; - flex-direction: column; -} -.auth__wrapper { - flex: 1; - padding: var(--sp-loose); - padding-bottom: 0; - display: flex; - justify-content: center; - align-items: flex-start; -} -.auth-footer { - padding: var(--sp-normal) 0; - display: flex; - justify-content: center; - align-items: center; - - & > *:nth-child(2n) { - margin: 0 var(--sp-loose); - } - & a { - color: var(--tc-surface-normal); - &:hover { text-decoration: underline; } - } -} -.auth-card { - width: 462px; - background-color: var(--bg-surface); - border-radius: var(--bo-radius); - box-shadow: var(--bs-popup); - overflow: hidden; - - &__content { - padding: var(--sp-extra-loose) calc(var(--sp-normal) + var(--sp-extra-loose)); - } - &__switch { - margin-top: var(--sp-loose) !important; - } -} - -.homeserver-form, -.auth-form__heading { - & .context-menu__item .text { - margin: 0 !important; - } -} - -.homeserver-form { - display: flex; - margin-bottom: var(--sp-extra-tight); - align-items: flex-end; - & > .input-container { - flex: 1; - & .input { - background-color: var(--bg-surface); - @include dir.prop(border-right-width, 0, 1px); - @include dir.prop(border-left-width, 1px, 0 ); - @include dir.prop(border-radius, - var(--bo-radius) 0 0 var(--bo-radius), - 0 var(--bo-radius) var(--bo-radius) 0, - ); - } - } - & .ic-btn { - height: 46px; - border: 1px solid var(--bg-surface-border); - @include dir.prop(border-radius, - 0 var(--bo-radius) var(--bo-radius) 0, - var(--bo-radius) 0 0 var(--bo-radius), - ); - } - - &__status { - margin-top: var(--sp-normal); - & .donut-spinner { - min-width: 28px; - } - & .text { - margin: 0 var(--sp-tight); - } - } - &__error { - margin-bottom: var(--sp-normal) !important; - color: var(--tc-danger-normal) !important; - } -} - -.auth-form { - & > .input-container, - &__pass-eye-wrapper { - margin: var(--sp-tight) 0 var(--sp-ultra-tight); - } - - &__heading { - display: flex; - justify-content: space-between; - margin-top: calc(var(--sp-extra-loose) + var(--sp-tight)); - } - - &__pass-eye-wrapper { - position: relative; - & .ic-btn { - position: absolute; - @include dir.prop(right, 6px, unset); - @include dir.prop(left, unset, 6px ); - bottom: 6px; - border-radius: 4px; - } - & input { - @include dir.side(padding, var(--sp-normal), 46px); - } - } - - &__btns { - padding-top: var(--sp-loose); - margin-bottom: var(--sp-extra-loose); - display: flex; - justify-content: flex-end; - } - - &__error { - color: var(--tc-danger-normal) !important; - } -} -.sso__divider { - margin-bottom: var(--sp-tight); - display: flex; - align-items: center; - - &::before, - &::after { - flex: 1; - content: ''; - margin: var(--sp-tight); - border-bottom: 1px solid var(--bg-surface-border); - } -} - -@media (max-width: 462px) { - .auth__wrapper { - padding: var(--sp-tight); - } - .auth-card { - &__content { - padding: var(--sp-loose) var(--sp-normal); - } - } -} - -.process-wrapper { - @extend .cp-fx__column--c-c; - - min-height: 100%; - width: 100%; - background-color: var(--bg-surface-low); - opacity: .96; - - position: fixed; - top: 0; - left: 0; - z-index: 999; -} \ No newline at end of file diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx deleted file mode 100644 index f6ef2b9e..00000000 --- a/src/app/templates/client/Client.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import './Client.scss'; - -import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; -import Windows from '../../organisms/pw/Windows'; -import Dialogs from '../../organisms/pw/Dialogs'; - -import navigation from '../../../client/state/navigation'; -import cons from '../../../client/state/cons'; - -import { ClientContent } from './ClientContent'; -import { useSetting } from '../../state/hooks/settings'; -import { settingsAtom } from '../../state/settings'; - -function SystemEmojiFeature() { - const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); - - if (twitterEmoji) { - document.documentElement.style.setProperty('--font-emoji', 'Twemoji'); - } else { - document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); - } - - return null; -} - -function Client() { - const classNameHidden = 'client__item-hidden'; - - const navWrapperRef = useRef(null); - const roomWrapperRef = useRef(null); - - function onRoomSelected() { - navWrapperRef.current?.classList.add(classNameHidden); - roomWrapperRef.current?.classList.remove(classNameHidden); - } - function onNavigationSelected() { - navWrapperRef.current?.classList.remove(classNameHidden); - roomWrapperRef.current?.classList.add(classNameHidden); - } - - useEffect(() => { - navigation.on(cons.events.navigation.ROOM_SELECTED, onRoomSelected); - navigation.on(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); - - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SELECTED, onRoomSelected); - navigation.removeListener(cons.events.navigation.NAVIGATION_OPENED, onNavigationSelected); - }; - }, []); - - return ( -
    - {/*
    - -
    */} -
    - -
    - - - - -
    - ); -} - -export default Client; diff --git a/src/app/templates/client/Client.scss b/src/app/templates/client/Client.scss deleted file mode 100644 index bad5fc93..00000000 --- a/src/app/templates/client/Client.scss +++ /dev/null @@ -1,57 +0,0 @@ -@use '../../partials/screen'; - -.client-container { - display: flex; - height: 100%; - flex-grow: 1; -} - -.navigation__wrapper { - width: var(--navigation-width); - - @include screen.smallerThan(mobileBreakpoint) { - width: 100%; - } -} - -.room__wrapper { - flex: 1; - min-width: 0; -} - -@include screen.smallerThan(mobileBreakpoint) { - .client__item-hidden { - display: none; - } -} - -.loading-display { - position: absolute; - top: 0; - left: 0; - width: 100vw; - height: 100%; - - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} -.loading__message { - margin-top: var(--sp-normal); - max-width: 350px; - text-align: center; -} -.loading__appname { - position: absolute; - bottom: var(--sp-normal); -} -.loading__menu { - position: absolute; - top: var(--sp-extra-tight); - right: var(--sp-extra-tight); - cursor: pointer; - .context-menu__item .text { - margin: 0 !important; - } -} diff --git a/src/app/templates/client/ClientContent.jsx b/src/app/templates/client/ClientContent.jsx deleted file mode 100644 index cebe012c..00000000 --- a/src/app/templates/client/ClientContent.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useState, useEffect } from 'react'; - -import initMatrix from '../../../client/initMatrix'; -import cons from '../../../client/state/cons'; -import navigation from '../../../client/state/navigation'; -import { openNavigation } from '../../../client/action/navigation'; - -import Welcome from '../../organisms/welcome/Welcome'; -import { RoomBaseView } from '../../features/room/Room'; - -export function ClientContent() { - const [roomInfo, setRoomInfo] = useState({ - room: null, - eventId: null, - }); - - const mx = initMatrix.matrixClient; - - useEffect(() => { - const handleRoomSelected = (rId, pRoomId, eId) => { - roomInfo.roomTimeline?.removeInternalListeners(); - const r = mx.getRoom(rId); - if (r) { - setRoomInfo({ - room: r, - eventId: eId ?? null, - }); - } else { - setRoomInfo({ - room: null, - eventId: null, - }); - } - }; - - navigation.on(cons.events.navigation.ROOM_SELECTED, handleRoomSelected); - return () => { - navigation.removeListener(cons.events.navigation.ROOM_SELECTED, handleRoomSelected); - }; - }, [roomInfo, mx]); - - const { room, eventId } = roomInfo; - if (!room) { - setTimeout(() => openNavigation()); - return ; - } - - return ; -} diff --git a/src/app/utils/disposable.ts b/src/app/utils/disposable.ts index 7840fe49..74424154 100644 --- a/src/app/utils/disposable.ts +++ b/src/app/utils/disposable.ts @@ -1,8 +1,16 @@ -export type DisposeCallback = (...args: Q) => R; -export type DisposableContext

    = ( - ...args: P -) => DisposeCallback; +export type DisposeCallback = ( + ...args: DisposeArgs +) => DisposeReturn; +export type DisposableContext< + DisposableArgs extends unknown[] = [], + DisposeArgs extends unknown[] = [], + DisposeReturn = void +> = (...args: DisposableArgs) => DisposeCallback; -export const disposable =

    ( - context: DisposableContext +export const disposable = < + DisposableArgs extends unknown[], + DisposeArgs extends unknown[] = [], + DisposeReturn = void +>( + context: DisposableContext ) => context; diff --git a/src/app/utils/dom.ts b/src/app/utils/dom.ts index f39fe623..1aea6754 100644 --- a/src/app/utils/dom.ts +++ b/src/app/utils/dom.ts @@ -190,3 +190,9 @@ export const copyToClipboard = (text: string) => { copyInput.remove(); } }; + +export const setFavicon = (url: string): void => { + const favicon = document.querySelector('#favicon'); + if (!favicon) return; + favicon.setAttribute('href', url); +}; diff --git a/src/client/action/accountData.js b/src/client/action/accountData.js deleted file mode 100644 index 1fb49fbf..00000000 --- a/src/client/action/accountData.js +++ /dev/null @@ -1,41 +0,0 @@ -import appDispatcher from '../dispatcher'; -import cons from '../state/cons'; - -/** - * @param {string | string[]} roomId - room id or array of them to add into shortcuts - */ -export function createSpaceShortcut(roomId) { - appDispatcher.dispatch({ - type: cons.actions.accountData.CREATE_SPACE_SHORTCUT, - roomId, - }); -} - -export function deleteSpaceShortcut(roomId) { - appDispatcher.dispatch({ - type: cons.actions.accountData.DELETE_SPACE_SHORTCUT, - roomId, - }); -} - -export function moveSpaceShortcut(roomId, toIndex) { - appDispatcher.dispatch({ - type: cons.actions.accountData.MOVE_SPACE_SHORTCUTS, - roomId, - toIndex, - }); -} - -export function categorizeSpace(roomId) { - appDispatcher.dispatch({ - type: cons.actions.accountData.CATEGORIZE_SPACE, - roomId, - }); -} - -export function unCategorizeSpace(roomId) { - appDispatcher.dispatch({ - type: cons.actions.accountData.UNCATEGORIZE_SPACE, - roomId, - }); -} diff --git a/src/client/action/auth.js b/src/client/action/auth.js deleted file mode 100644 index f04306b8..00000000 --- a/src/client/action/auth.js +++ /dev/null @@ -1,104 +0,0 @@ -import * as sdk from 'matrix-js-sdk'; -import cons from '../state/cons'; - -function updateLocalStore(accessToken, deviceId, userId, baseUrl) { - localStorage.setItem(cons.secretKey.ACCESS_TOKEN, accessToken); - localStorage.setItem(cons.secretKey.DEVICE_ID, deviceId); - localStorage.setItem(cons.secretKey.USER_ID, userId); - localStorage.setItem(cons.secretKey.BASE_URL, baseUrl); -} - -function createTemporaryClient(baseUrl) { - return sdk.createClient({ baseUrl }); -} - -async function startSsoLogin(baseUrl, type, idpId) { - const client = createTemporaryClient(baseUrl); - localStorage.setItem(cons.secretKey.BASE_URL, client.baseUrl); - window.location.href = client.getSsoLoginUrl(window.location.href, type, idpId); -} - -async function login(baseUrl, username, email, password) { - const identifier = {}; - if (username) { - identifier.type = 'm.id.user'; - identifier.user = username; - } else if (email) { - identifier.type = 'm.id.thirdparty'; - identifier.medium = 'email'; - identifier.address = email; - } else throw new Error('Bad Input'); - - const client = createTemporaryClient(baseUrl); - const res = await client.login('m.login.password', { - identifier, - password, - initial_device_display_name: cons.DEVICE_DISPLAY_NAME, - }); - - const myBaseUrl = res?.well_known?.['m.homeserver']?.base_url || client.baseUrl; - updateLocalStore(res.access_token, res.device_id, res.user_id, myBaseUrl); -} - -async function loginWithToken(baseUrl, token) { - const client = createTemporaryClient(baseUrl); - - const res = await client.login('m.login.token', { - token, - initial_device_display_name: cons.DEVICE_DISPLAY_NAME, - }); - - const myBaseUrl = res?.well_known?.['m.homeserver']?.base_url || client.baseUrl; - updateLocalStore(res.access_token, res.device_id, res.user_id, myBaseUrl); -} - -// eslint-disable-next-line camelcase -async function verifyEmail(baseUrl, email, client_secret, send_attempt, next_link) { - const res = await fetch(`${baseUrl}/_matrix/client/r0/register/email/requestToken`, { - method: 'POST', - body: JSON.stringify({ - email, client_secret, send_attempt, next_link, - }), - headers: { - 'Content-Type': 'application/json; charset=utf-8', - }, - credentials: 'same-origin', - }); - const data = await res.json(); - return data; -} - -async function completeRegisterStage( - baseUrl, username, password, auth, -) { - const tempClient = createTemporaryClient(baseUrl); - - try { - const result = await tempClient.registerRequest({ - username, - password, - auth, - initial_device_display_name: cons.DEVICE_DISPLAY_NAME, - }); - const data = { completed: result.completed || [] }; - if (result.access_token) { - data.done = true; - updateLocalStore(result.access_token, result.device_id, result.user_id, baseUrl); - } - return data; - } catch (e) { - const result = e.data; - const data = { completed: result.completed || [] }; - if (result.access_token) { - data.done = true; - updateLocalStore(result.access_token, result.device_id, result.user_id, baseUrl); - } - return data; - } -} - -export { - updateLocalStore, createTemporaryClient, login, verifyEmail, - loginWithToken, startSsoLogin, - completeRegisterStage, -}; diff --git a/src/client/action/auth.ts b/src/client/action/auth.ts new file mode 100644 index 00000000..dbe9baac --- /dev/null +++ b/src/client/action/auth.ts @@ -0,0 +1,13 @@ +import cons from '../state/cons'; + +export function updateLocalStore( + accessToken: string, + deviceId: string, + userId: string, + baseUrl: string +) { + localStorage.setItem(cons.secretKey.ACCESS_TOKEN, accessToken); + localStorage.setItem(cons.secretKey.DEVICE_ID, deviceId); + localStorage.setItem(cons.secretKey.USER_ID, userId); + localStorage.setItem(cons.secretKey.BASE_URL, baseUrl); +} diff --git a/src/client/action/navigation.js b/src/client/action/navigation.js index e48e839b..1967a463 100644 --- a/src/client/action/navigation.js +++ b/src/client/action/navigation.js @@ -1,35 +1,6 @@ import appDispatcher from '../dispatcher'; import cons from '../state/cons'; -export function selectTab(tabId) { - appDispatcher.dispatch({ - type: cons.actions.navigation.SELECT_TAB, - tabId, - }); -} - -export function selectSpace(roomId) { - appDispatcher.dispatch({ - type: cons.actions.navigation.SELECT_SPACE, - roomId, - }); -} - -export function selectRoom(roomId, eventId) { - appDispatcher.dispatch({ - type: cons.actions.navigation.SELECT_ROOM, - roomId, - eventId, - }); -} - -// Open navigation on compact screen sizes -export function openNavigation() { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_NAVIGATION, - }); -} - export function openSpaceSettings(roomId, tabText) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SPACE_SETTINGS, @@ -38,13 +9,6 @@ export function openSpaceSettings(roomId, tabText) { }); } -export function openSpaceManage(roomId) { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_SPACE_MANAGE, - roomId, - }); -} - export function openSpaceAddExisting(roomId, spaces = false) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SPACE_ADDEXISTING, @@ -61,24 +25,6 @@ export function toggleRoomSettings(roomId, tabText) { }); } -export function openShortcutSpaces() { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_SHORTCUT_SPACES, - }); -} - -export function openInviteList() { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_INVITE_LIST, - }); -} - -export function openPublicRooms(searchTerm) { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_PUBLIC_ROOMS, - searchTerm, - }); -} export function openCreateRoom(isSpace = false, parentId = null) { appDispatcher.dispatch({ @@ -118,39 +64,6 @@ export function openSettings(tabText) { }); } -export function openEmojiBoard(cords, requestEmojiCallback) { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_EMOJIBOARD, - cords, - requestEmojiCallback, - }); -} - -export function openReadReceipts(roomId, userIds) { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_READRECEIPTS, - roomId, - userIds, - }); -} - -export function openViewSource(event) { - appDispatcher.dispatch({ - type: cons.actions.navigation.OPEN_VIEWSOURCE, - event, - }); -} - -export function replyTo(userId, eventId, body, formattedBody) { - appDispatcher.dispatch({ - type: cons.actions.navigation.CLICK_REPLY_TO, - userId, - eventId, - body, - formattedBody, - }); -} - export function openSearch(term) { appDispatcher.dispatch({ type: cons.actions.navigation.OPEN_SEARCH, diff --git a/src/client/action/notifications.js b/src/client/action/notifications.js index a869632a..579c7c3c 100644 --- a/src/client/action/notifications.js +++ b/src/client/action/notifications.js @@ -5,7 +5,6 @@ export async function markAsRead(roomId) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); if (!room) return; - initMatrix.notifications.deleteNoti(roomId); const timeline = room.getLiveTimeline().getEvents(); const readEventId = room.getEventReadUpTo(mx.getUserId()); diff --git a/src/client/action/room.js b/src/client/action/room.js index 996c2680..c2d11438 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -107,37 +107,12 @@ async function join(roomIdOrAlias, isDM = false, via = undefined) { const targetUserId = guessDMRoomTargetId(mx.getRoom(resultRoom.roomId), mx.getUserId()); await addRoomToMDirect(resultRoom.roomId, targetUserId); } - appDispatcher.dispatch({ - type: cons.actions.room.JOIN, - roomId: resultRoom.roomId, - isDM, - }); return resultRoom.roomId; } catch (e) { throw new Error(e); } } -/** - * - * @param {string} roomId - * @param {boolean} isDM - */ -async function leave(roomId) { - const mx = initMatrix.matrixClient; - const isDM = initMatrix.roomList.directs.has(roomId); - try { - await mx.leave(roomId); - appDispatcher.dispatch({ - type: cons.actions.room.LEAVE, - roomId, - isDM, - }); - } catch { - console.error('Unable to leave room.'); - } -} - async function create(options, isDM = false) { const mx = initMatrix.matrixClient; try { @@ -145,11 +120,6 @@ async function create(options, isDM = false) { if (isDM && typeof options.invite?.[0] === 'string') { await addRoomToMDirect(result.room_id, options.invite[0]); } - appDispatcher.dispatch({ - type: cons.actions.room.CREATE, - roomId: result.room_id, - isDM, - }); return result; } catch (e) { const errcodes = ['M_UNKNOWN', 'M_BAD_JSON', 'M_ROOM_IN_USE', 'M_INVALID_ROOM_STATE', 'M_UNSUPPORTED_ROOM_VERSION']; @@ -348,7 +318,7 @@ async function setMyRoomAvatar(roomId, mxc) { export { convertToDm, convertToRoom, - join, leave, + join, createDM, createRoom, invite, kick, ban, unban, ignore, unignore, diff --git a/src/client/action/roomTimeline.js b/src/client/action/roomTimeline.js deleted file mode 100644 index 41c62d4f..00000000 --- a/src/client/action/roomTimeline.js +++ /dev/null @@ -1,34 +0,0 @@ -import initMatrix from '../initMatrix'; - -async function redactEvent(roomId, eventId, reason) { - const mx = initMatrix.matrixClient; - - try { - await mx.redactEvent(roomId, eventId, undefined, typeof reason === 'undefined' ? undefined : { reason }); - return true; - } catch (e) { - throw new Error(e); - } -} - -async function sendReaction(roomId, toEventId, reaction, shortcode) { - const mx = initMatrix.matrixClient; - const content = { - 'm.relates_to': { - event_id: toEventId, - key: reaction, - rel_type: 'm.annotation', - }, - }; - if (typeof shortcode === 'string') content.shortcode = shortcode; - try { - await mx.sendEvent(roomId, 'm.reaction', content); - } catch (e) { - throw new Error(e); - } -} - -export { - redactEvent, - sendReaction, -}; diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js index 076d3794..856fcadc 100644 --- a/src/client/event/hotkeys.js +++ b/src/client/event/hotkeys.js @@ -1,31 +1,5 @@ import { openSearch } from '../action/navigation'; import navigation from '../state/navigation'; -import { markAsRead } from '../action/notifications'; - -function shouldFocusMessageField(code) { - // do not focus on F keys - if (/^F\d+$/.test(code)) return false; - - // do not focus on numlock/scroll lock - if ( - code.metaKey - || code.startsWith('OS') - || code.startsWith('Meta') - || code.startsWith('Shift') - || code.startsWith('Alt') - || code.startsWith('Control') - || code.startsWith('Arrow') - || code === 'Tab' - || code === 'Space' - || code === 'Enter' - || code === 'NumLock' - || code === 'ScrollLock' - ) { - return false; - } - - return true; -} function listenKeyboard(event) { // Ctrl/Cmd + @@ -36,39 +10,6 @@ function listenKeyboard(event) { if (navigation.isRawModalVisible) return; openSearch(); } - - // focus message field on paste - if (event.key === 'v') { - if (navigation.isRawModalVisible) return; - const msgTextarea = document.getElementById('message-textarea'); - const { activeElement } = document; - if (activeElement !== msgTextarea - && ['input', 'textarea'].includes(activeElement.tagName.toLowerCase()) - ) return; - msgTextarea?.focus(); - } - } - - if (!event.ctrlKey && !event.altKey && !event.metaKey) { - if (navigation.isRawModalVisible) return; - - if (event.key === 'Escape') { - if (navigation.selectedRoomId) { - markAsRead(navigation.selectedRoomId); - return; - } - } - - if (['input', 'textarea'].includes(document.activeElement.tagName.toLowerCase())) { - return; - } - - // focus the text field on most keypresses - if (shouldFocusMessageField(event.code)) { - // press any key to focus and type in message field - const msgTextarea = document.getElementById('message-textarea'); - msgTextarea?.focus(); - } } } diff --git a/src/client/event/roomList.js b/src/client/event/roomList.js deleted file mode 100644 index 6592d67f..00000000 --- a/src/client/event/roomList.js +++ /dev/null @@ -1,38 +0,0 @@ -import cons from '../state/cons'; -import navigation from '../state/navigation'; -import { selectTab, selectSpace, selectRoom } from '../action/navigation'; - -function initRoomListListener(roomList) { - const listenRoomLeave = (roomId) => { - const parents = roomList.roomIdToParents.get(roomId); - - if (parents) { - [...parents].forEach((pId) => { - const data = navigation.spaceToRoom.get(pId); - if (data?.roomId === roomId) { - navigation.spaceToRoom.delete(pId); - } - }); - } - - if (navigation.selectedRoomId === roomId) { - selectRoom(null); - } - - if (navigation.selectedSpacePath.includes(roomId)) { - const idIndex = navigation.selectedSpacePath.indexOf(roomId); - if (idIndex === 0) selectTab(cons.tabs.HOME); - else selectSpace(navigation.selectedSpacePath[idIndex - 1]); - } - - navigation.removeRecentRoom(roomId); - }; - - roomList.on(cons.events.roomList.ROOM_LEAVED, listenRoomLeave); - return () => { - roomList.removeListener(cons.events.roomList.ROOM_LEAVED, listenRoomLeave); - }; -} - -// eslint-disable-next-line import/prefer-default-export -export { initRoomListListener }; diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js index 835982f8..0352ff36 100644 --- a/src/client/initMatrix.js +++ b/src/client/initMatrix.js @@ -4,12 +4,7 @@ import Olm from '@matrix-org/olm'; import { logger } from 'matrix-js-sdk/lib/logger'; import { getSecret } from './state/auth'; -import RoomList from './state/RoomList'; -import AccountData from './state/AccountData'; -import RoomsInput from './state/RoomsInput'; -import Notifications from './state/Notifications'; import { cryptoCallbacks } from './state/secretStorageKeys'; -import navigation from './state/navigation'; global.Olm = Olm; @@ -18,12 +13,6 @@ if (import.meta.env.PROD) { } class InitMatrix extends EventEmitter { - constructor() { - super(); - - navigation.initMatrix = this; - } - async init() { if (this.matrixClient || this.initializing) { console.warn('Client is already initialized!') @@ -84,17 +73,9 @@ class InitMatrix extends EventEmitter { PREPARED: (prevState) => { console.log('PREPARED state'); console.log('Previous state: ', prevState); - // TODO: remove global.initMatrix at end global.initMatrix = this; if (prevState === null) { - this.roomList = new RoomList(this.matrixClient); - this.accountData = new AccountData(this.roomList); - this.roomsInput = new RoomsInput(this.matrixClient, this.roomList); - this.notifications = new Notifications(this.roomList); this.emit('init_loading_finished'); - this.notifications._initNoti(); - } else { - this.notifications?._initNoti(); } }, RECONNECTING: () => { diff --git a/src/client/state/AccountData.js b/src/client/state/AccountData.js deleted file mode 100644 index 6fc811a3..00000000 --- a/src/client/state/AccountData.js +++ /dev/null @@ -1,144 +0,0 @@ -import EventEmitter from 'events'; -import appDispatcher from '../dispatcher'; -import cons from './cons'; - -class AccountData extends EventEmitter { - constructor(roomList) { - super(); - - this.matrixClient = roomList.matrixClient; - this.roomList = roomList; - this.spaces = roomList.spaces; - - this.spaceShortcut = new Set(); - this._populateSpaceShortcut(); - - this.categorizedSpaces = new Set(); - this._populateCategorizedSpaces(); - - this._listenEvents(); - - appDispatcher.register(this.accountActions.bind(this)); - } - - _getAccountData() { - return this.matrixClient.getAccountData(cons.IN_CINNY_SPACES)?.getContent() || {}; - } - - _populateSpaceShortcut() { - this.spaceShortcut.clear(); - const spacesContent = this._getAccountData(); - - if (spacesContent?.shortcut === undefined) return; - - spacesContent.shortcut.forEach((shortcut) => { - if (this.spaces.has(shortcut)) this.spaceShortcut.add(shortcut); - }); - if (spacesContent.shortcut.length !== this.spaceShortcut.size) { - // update shortcut list from account data if shortcut space doesn't exist. - // TODO: we can wait for sync to complete or else we may end up removing valid space id - this._updateSpaceShortcutData([...this.spaceShortcut]); - } - } - - _updateSpaceShortcutData(shortcutList) { - const spaceContent = this._getAccountData(); - spaceContent.shortcut = shortcutList; - this.matrixClient.setAccountData(cons.IN_CINNY_SPACES, spaceContent); - } - - _populateCategorizedSpaces() { - this.categorizedSpaces.clear(); - const spaceContent = this._getAccountData(); - - if (spaceContent?.categorized === undefined) return; - - spaceContent.categorized.forEach((spaceId) => { - if (this.spaces.has(spaceId)) this.categorizedSpaces.add(spaceId); - }); - if (spaceContent.categorized.length !== this.categorizedSpaces.size) { - // TODO: we can wait for sync to complete or else we may end up removing valid space id - this._updateCategorizedSpacesData([...this.categorizedSpaces]); - } - } - - _updateCategorizedSpacesData(categorizedSpaceList) { - const spaceContent = this._getAccountData(); - spaceContent.categorized = categorizedSpaceList; - this.matrixClient.setAccountData(cons.IN_CINNY_SPACES, spaceContent); - } - - accountActions(action) { - const actions = { - [cons.actions.accountData.CREATE_SPACE_SHORTCUT]: () => { - const addRoomId = (id) => { - if (this.spaceShortcut.has(id)) return; - this.spaceShortcut.add(id); - }; - if (Array.isArray(action.roomId)) { - action.roomId.forEach(addRoomId); - } else { - addRoomId(action.roomId); - } - this._updateSpaceShortcutData([...this.spaceShortcut]); - this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, action.roomId); - }, - [cons.actions.accountData.DELETE_SPACE_SHORTCUT]: () => { - if (!this.spaceShortcut.has(action.roomId)) return; - this.spaceShortcut.delete(action.roomId); - this._updateSpaceShortcutData([...this.spaceShortcut]); - this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, action.roomId); - }, - [cons.actions.accountData.MOVE_SPACE_SHORTCUTS]: () => { - const { roomId, toIndex } = action; - if (!this.spaceShortcut.has(roomId)) return; - this.spaceShortcut.delete(roomId); - const ssList = [...this.spaceShortcut]; - if (toIndex >= ssList.length) ssList.push(roomId); - else ssList.splice(toIndex, 0, roomId); - this.spaceShortcut = new Set(ssList); - this._updateSpaceShortcutData(ssList); - this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, roomId); - }, - [cons.actions.accountData.CATEGORIZE_SPACE]: () => { - if (this.categorizedSpaces.has(action.roomId)) return; - this.categorizedSpaces.add(action.roomId); - this._updateCategorizedSpacesData([...this.categorizedSpaces]); - this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, action.roomId); - }, - [cons.actions.accountData.UNCATEGORIZE_SPACE]: () => { - if (!this.categorizedSpaces.has(action.roomId)) return; - this.categorizedSpaces.delete(action.roomId); - this._updateCategorizedSpacesData([...this.categorizedSpaces]); - this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, action.roomId); - }, - }; - actions[action.type]?.(); - } - - _listenEvents() { - this.matrixClient.on('accountData', (event) => { - if (event.getType() !== cons.IN_CINNY_SPACES) return; - this._populateSpaceShortcut(); - this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED); - this._populateCategorizedSpaces(); - this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED); - }); - - this.roomList.on(cons.events.roomList.ROOM_LEAVED, (roomId) => { - if (this.spaceShortcut.has(roomId)) { - // if deleted space has shortcut remove it. - this.spaceShortcut.delete(roomId); - this._updateSpaceShortcutData([...this.spaceShortcut]); - this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, roomId); - } - if (this.categorizedSpaces.has(roomId)) { - this.categorizedSpaces.delete(roomId); - this._updateCategorizedSpacesData([...this.categorizedSpaces]); - this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, roomId); - } - }); - } -} - -export default AccountData; diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js deleted file mode 100644 index 09fa240e..00000000 --- a/src/client/state/Notifications.js +++ /dev/null @@ -1,412 +0,0 @@ -import EventEmitter from 'events'; -import renderAvatar from '../../app/atoms/avatar/render'; -import { cssColorMXID } from '../../util/colorMXID'; -import { selectRoom } from '../action/navigation'; -import cons from './cons'; -import navigation from './navigation'; -import settings from './settings'; -import { setFavicon } from '../../util/common'; - -import LogoSVG from '../../../public/res/svg/cinny.svg'; -import LogoUnreadSVG from '../../../public/res/svg/cinny-unread.svg'; -import LogoHighlightSVG from '../../../public/res/svg/cinny-highlight.svg'; -import { html, plain } from '../../util/markdown'; - -function isNotifEvent(mEvent) { - const eType = mEvent.getType(); - if (!cons.supportEventTypes.includes(eType)) return false; - if (eType === 'm.room.member') return false; - - if (mEvent.isRedacted()) return false; - if (mEvent.getRelation()?.rel_type === 'm.replace') return false; - - return true; -} - -function isMutedRule(rule) { - return rule.actions[0] === 'dont_notify' && rule.conditions[0].kind === 'event_match'; -} - -function findMutedRule(overrideRules, roomId) { - return overrideRules.find((rule) => ( - rule.rule_id === roomId - && isMutedRule(rule) - )); -} - -class Notifications extends EventEmitter { - constructor(roomList) { - super(); - - this.initialized = false; - this.favicon = LogoSVG; - this.matrixClient = roomList.matrixClient; - this.roomList = roomList; - - this.roomIdToNoti = new Map(); - this.roomIdToPopupNotis = new Map(); - this.eventIdToPopupNoti = new Map(); - - // this._initNoti(); - this._listenEvents(); - - // Ask for permission by default after loading - window.Notification?.requestPermission(); - } - - async _initNoti() { - this.initialized = false; - this.roomIdToNoti = new Map(); - - const addNoti = (roomId) => { - const room = this.matrixClient.getRoom(roomId); - if (this.getNotiType(room.roomId) === cons.notifs.MUTE) return; - if (this.doesRoomHaveUnread(room) === false) return; - - const total = room.getUnreadNotificationCount('total'); - const highlight = room.getUnreadNotificationCount('highlight'); - this._setNoti(room.roomId, total ?? 0, highlight ?? 0); - }; - [...this.roomList.rooms].forEach(addNoti); - [...this.roomList.directs].forEach(addNoti); - - this.initialized = true; - this._updateFavicon(); - } - - doesRoomHaveUnread(room) { - const userId = this.matrixClient.getUserId(); - const readUpToId = room.getEventReadUpTo(userId); - const liveEvents = room.getLiveTimeline().getEvents(); - - if (liveEvents[liveEvents.length - 1]?.getSender() === userId) { - return false; - } - - for (let i = liveEvents.length - 1; i >= 0; i -= 1) { - const event = liveEvents[i]; - if (event.getId() === readUpToId) return false; - if (isNotifEvent(event)) return true; - } - return true; - } - - getNotiType(roomId) { - const mx = this.matrixClient; - let pushRule; - try { - pushRule = mx.getRoomPushRule('global', roomId); - } catch { - pushRule = undefined; - } - - if (pushRule === undefined) { - const overrideRules = mx.getAccountData('m.push_rules')?.getContent()?.global?.override; - if (overrideRules === undefined) return cons.notifs.DEFAULT; - - const isMuted = findMutedRule(overrideRules, roomId); - - return isMuted ? cons.notifs.MUTE : cons.notifs.DEFAULT; - } - if (pushRule.actions[0] === 'notify') return cons.notifs.ALL_MESSAGES; - return cons.notifs.MENTIONS_AND_KEYWORDS; - } - - getNoti(roomId) { - return this.roomIdToNoti.get(roomId) || { total: 0, highlight: 0, from: null }; - } - - getTotalNoti(roomId) { - const { total } = this.getNoti(roomId); - return total; - } - - getHighlightNoti(roomId) { - const { highlight } = this.getNoti(roomId); - return highlight; - } - - getFromNoti(roomId) { - const { from } = this.getNoti(roomId); - return from; - } - - hasNoti(roomId) { - return this.roomIdToNoti.has(roomId); - } - - deleteNoti(roomId) { - if (this.hasNoti(roomId)) { - const noti = this.getNoti(roomId); - this._deleteNoti(roomId, noti.total, noti.highlight); - } - } - - async _updateFavicon() { - if (!this.initialized) return; - let unread = false; - let highlight = false; - [...this.roomIdToNoti.values()].find((noti) => { - if (!unread) { - unread = noti.total > 0 || noti.highlight > 0; - } - highlight = noti.highlight > 0; - if (unread && highlight) return true; - return false; - }); - let newFavicon = LogoSVG; - if (unread && !highlight) { - newFavicon = LogoUnreadSVG; - } - if (unread && highlight) { - newFavicon = LogoHighlightSVG; - } - if (newFavicon === this.favicon) return; - this.favicon = newFavicon; - setFavicon(this.favicon); - } - - _setNoti(roomId, total, highlight) { - const addNoti = (id, t, h, fromId) => { - const prevTotal = this.roomIdToNoti.get(id)?.total ?? null; - const noti = this.getNoti(id); - - noti.total += t; - noti.highlight += h; - - if (fromId) { - if (noti.from === null) noti.from = new Set(); - noti.from.add(fromId); - } - this.roomIdToNoti.set(id, noti); - this.emit(cons.events.notifications.NOTI_CHANGED, id, noti.total, prevTotal); - }; - - const noti = this.getNoti(roomId); - const addT = (highlight > total ? highlight : total) - noti.total; - const addH = highlight - noti.highlight; - if (addT < 0 || addH < 0) return; - - addNoti(roomId, addT, addH); - const allParentSpaces = this.roomList.getAllParentSpaces(roomId); - allParentSpaces.forEach((spaceId) => { - addNoti(spaceId, addT, addH, roomId); - }); - this._updateFavicon(); - } - - _deleteNoti(roomId, total, highlight) { - const removeNoti = (id, t, h, fromId) => { - if (this.roomIdToNoti.has(id) === false) return; - - const noti = this.getNoti(id); - const prevTotal = noti.total; - noti.total -= t; - noti.highlight -= h; - if (noti.total < 0) { - noti.total = 0; - noti.highlight = 0; - } - if (fromId && noti.from !== null) { - if (!this.hasNoti(fromId)) noti.from.delete(fromId); - } - if (noti.from === null || noti.from.size === 0) { - this.roomIdToNoti.delete(id); - this.emit(cons.events.notifications.FULL_READ, id); - this.emit(cons.events.notifications.NOTI_CHANGED, id, null, prevTotal); - } else { - this.roomIdToNoti.set(id, noti); - this.emit(cons.events.notifications.NOTI_CHANGED, id, noti.total, prevTotal); - } - }; - - removeNoti(roomId, total, highlight); - const allParentSpaces = this.roomList.getAllParentSpaces(roomId); - allParentSpaces.forEach((spaceId) => { - removeNoti(spaceId, total, highlight, roomId); - }); - this._updateFavicon(); - } - - async _displayPopupNoti(mEvent, room) { - if (!settings.showNotifications && !settings.isNotificationSounds) return; - - const actions = this.matrixClient.getPushActionsForEvent(mEvent); - if (!actions?.notify) return; - - if (navigation.selectedRoomId === room.roomId && document.hasFocus()) return; - - if (mEvent.isEncrypted()) { - await mEvent.attemptDecryption(this.matrixClient.crypto); - } - - if (settings.showNotifications) { - let title; - if (!mEvent.sender || room.name === mEvent.sender.name) { - title = room.name; - } else if (mEvent.sender) { - title = `${mEvent.sender.name} (${room.name})`; - } - - const iconSize = 36; - const icon = await renderAvatar({ - text: mEvent.sender.name, - bgColor: cssColorMXID(mEvent.getSender()), - imageSrc: mEvent.sender?.getAvatarUrl(this.matrixClient.baseUrl, iconSize, iconSize, 'crop'), - size: iconSize, - borderRadius: 8, - scale: 8, - }); - - const content = mEvent.getContent(); - - const state = { kind: 'notification', onlyPlain: true }; - let body; - if (content.format === 'org.matrix.custom.html') { - body = html(content.formatted_body, state); - } else { - body = plain(content.body, state); - } - - const noti = new window.Notification(title, { - body: body.plain, - icon, - tag: mEvent.getId(), - silent: settings.isNotificationSounds, - }); - if (settings.isNotificationSounds) { - noti.onshow = () => this._playNotiSound(); - } - noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); - - this.eventIdToPopupNoti.set(mEvent.getId(), noti); - if (this.roomIdToPopupNotis.has(room.roomId)) { - this.roomIdToPopupNotis.get(room.roomId).push(noti); - } else { - this.roomIdToPopupNotis.set(room.roomId, [noti]); - } - } else { - this._playNotiSound(); - } - } - - _deletePopupNoti(eventId) { - this.eventIdToPopupNoti.get(eventId)?.close(); - this.eventIdToPopupNoti.delete(eventId); - } - - _deletePopupRoomNotis(roomId) { - this.roomIdToPopupNotis.get(roomId)?.forEach((n) => { - this.eventIdToPopupNoti.delete(n.tag); - n.close(); - }); - this.roomIdToPopupNotis.delete(roomId); - } - - _playNotiSound() { - if (!this._notiAudio) { - this._notiAudio = document.getElementById('notificationSound'); - } - this._notiAudio.play(); - } - - _playInviteSound() { - if (!this._inviteAudio) { - this._inviteAudio = document.getElementById('inviteSound'); - } - this._inviteAudio.play(); - } - - _listenEvents() { - this.matrixClient.on('Room.timeline', (mEvent, room) => { - if (mEvent.isRedaction()) this._deletePopupNoti(mEvent.event.redacts); - - if (room.isSpaceRoom()) return; - if (!isNotifEvent(mEvent)) return; - - const liveEvents = room.getLiveTimeline().getEvents(); - - const lastTimelineEvent = liveEvents[liveEvents.length - 1]; - if (lastTimelineEvent.getId() !== mEvent.getId()) return; - if (mEvent.getSender() === this.matrixClient.getUserId()) return; - - const total = room.getUnreadNotificationCount('total'); - const highlight = room.getUnreadNotificationCount('highlight'); - - if (this.getNotiType(room.roomId) === cons.notifs.MUTE) { - this.deleteNoti(room.roomId, total ?? 0, highlight ?? 0); - return; - } - - this._setNoti(room.roomId, total ?? 0, highlight ?? 0); - - if (this.matrixClient.getSyncState() === 'SYNCING') { - this._displayPopupNoti(mEvent, room); - } - }); - - this.matrixClient.on('accountData', (mEvent, oldMEvent) => { - if (mEvent.getType() === 'm.push_rules') { - const override = mEvent?.getContent()?.global?.override; - const oldOverride = oldMEvent?.getContent()?.global?.override; - if (!override || !oldOverride) return; - - const isMuteToggled = (rule, otherOverride) => { - const roomId = rule.rule_id; - const room = this.matrixClient.getRoom(roomId); - if (room === null) return false; - if (room.isSpaceRoom()) return false; - - const isMuted = isMutedRule(rule); - if (!isMuted) return false; - const isOtherMuted = findMutedRule(otherOverride, roomId); - if (isOtherMuted) return false; - return true; - }; - - const mutedRules = override.filter((rule) => isMuteToggled(rule, oldOverride)); - const unMutedRules = oldOverride.filter((rule) => isMuteToggled(rule, override)); - - mutedRules.forEach((rule) => { - this.emit(cons.events.notifications.MUTE_TOGGLED, rule.rule_id, true); - this.deleteNoti(rule.rule_id); - }); - unMutedRules.forEach((rule) => { - this.emit(cons.events.notifications.MUTE_TOGGLED, rule.rule_id, false); - const room = this.matrixClient.getRoom(rule.rule_id); - if (!this.doesRoomHaveUnread(room)) return; - const total = room.getUnreadNotificationCount('total'); - const highlight = room.getUnreadNotificationCount('highlight'); - this._setNoti(room.roomId, total ?? 0, highlight ?? 0); - }); - } - }); - - this.matrixClient.on('Room.receipt', (mEvent, room) => { - if (mEvent.getType() !== 'm.receipt' || room.isSpaceRoom()) return; - const content = mEvent.getContent(); - const userId = this.matrixClient.getUserId(); - - Object.keys(content).forEach((eventId) => { - Object.entries(content[eventId]).forEach(([receiptType, receipt]) => { - if (!cons.supportReceiptTypes.includes(receiptType)) return; - if (Object.keys(receipt || {}).includes(userId)) { - this.deleteNoti(room.roomId); - this._deletePopupRoomNotis(room.roomId); - } - }); - }); - }); - - this.matrixClient.on('Room.myMembership', (room, membership) => { - if (membership === 'leave' && this.hasNoti(room.roomId)) { - this.deleteNoti(room.roomId); - } - if (membership === 'invite') { - this._playInviteSound(); - } - }); - } -} - -export default Notifications; diff --git a/src/client/state/RoomList.js b/src/client/state/RoomList.js deleted file mode 100644 index fc137ae2..00000000 --- a/src/client/state/RoomList.js +++ /dev/null @@ -1,383 +0,0 @@ -import EventEmitter from 'events'; -import appDispatcher from '../dispatcher'; -import cons from './cons'; - -function isMEventSpaceChild(mEvent) { - return mEvent.getType() === 'm.space.child' && Object.keys(mEvent.getContent()).length > 0; -} - -/** - * @param {() => boolean} callback if return true wait will over else callback will be called again. - * @param {number} timeout timeout to callback - * @param {number} maxTry maximum callback try > 0. -1 means no limit - */ -async function waitFor(callback, timeout = 400, maxTry = -1) { - if (maxTry === 0) return false; - const isOver = async () => new Promise((resolve) => { - setTimeout(() => resolve(callback()), timeout); - }); - - if (await isOver()) return true; - return waitFor(callback, timeout, maxTry - 1); -} - -class RoomList extends EventEmitter { - constructor(matrixClient) { - super(); - this.matrixClient = matrixClient; - this.mDirects = this.getMDirects(); - - // Contains roomId to parent spaces roomId mapping of all spaces children. - // No matter if you have joined those children rooms or not. - this.roomIdToParents = new Map(); - - this.inviteDirects = new Set(); - this.inviteSpaces = new Set(); - this.inviteRooms = new Set(); - - this.directs = new Set(); - this.spaces = new Set(); - this.rooms = new Set(); - - this.processingRooms = new Map(); - - this._populateRooms(); - this._listenEvents(); - - appDispatcher.register(this.roomActions.bind(this)); - } - - isOrphan(roomId) { - return !this.roomIdToParents.has(roomId); - } - - getOrphanSpaces() { - return [...this.spaces].filter((roomId) => !this.roomIdToParents.has(roomId)); - } - - getOrphanRooms() { - return [...this.rooms].filter((roomId) => !this.roomIdToParents.has(roomId)); - } - - getOrphans() { - const rooms = [...this.spaces].concat([...this.rooms]); - return rooms.filter((roomId) => !this.roomIdToParents.has(roomId)); - } - - getSpaceChildren(roomId) { - const space = this.matrixClient.getRoom(roomId); - if (space === null) return null; - const mSpaceChild = space?.currentState.getStateEvents('m.space.child'); - - const children = []; - mSpaceChild.forEach((mEvent) => { - const childId = mEvent.event.state_key; - if (isMEventSpaceChild(mEvent)) children.push(childId); - }); - return children; - } - - getCategorizedSpaces(spaceIds) { - const categorized = new Map(); - - const categorizeSpace = (spaceId) => { - if (categorized.has(spaceId)) return; - const mappedChild = new Set(); - categorized.set(spaceId, mappedChild); - - const child = this.getSpaceChildren(spaceId); - - child.forEach((childId) => { - const room = this.matrixClient.getRoom(childId); - if (room === null || room.getMyMembership() !== 'join') return; - if (room.isSpaceRoom()) categorizeSpace(childId); - else mappedChild.add(childId); - }); - }; - spaceIds.forEach(categorizeSpace); - - return categorized; - } - - addToRoomIdToParents(roomId, parentRoomId) { - if (!this.roomIdToParents.has(roomId)) { - this.roomIdToParents.set(roomId, new Set()); - } - const parents = this.roomIdToParents.get(roomId); - parents.add(parentRoomId); - } - - removeFromRoomIdToParents(roomId, parentRoomId) { - if (!this.roomIdToParents.has(roomId)) return; - const parents = this.roomIdToParents.get(roomId); - parents.delete(parentRoomId); - if (parents.size === 0) this.roomIdToParents.delete(roomId); - } - - getAllParentSpaces(roomId) { - const allParents = new Set(); - - const addAllParentIds = (rId) => { - if (allParents.has(rId)) return; - allParents.add(rId); - - const parents = this.roomIdToParents.get(rId); - if (parents === undefined) return; - - parents.forEach((id) => addAllParentIds(id)); - }; - addAllParentIds(roomId); - allParents.delete(roomId); - return allParents; - } - - addToSpaces(roomId) { - this.spaces.add(roomId); - - const allParentSpaces = this.getAllParentSpaces(roomId); - const spaceChildren = this.getSpaceChildren(roomId); - spaceChildren?.forEach((childId) => { - if (allParentSpaces.has(childId)) return; - this.addToRoomIdToParents(childId, roomId); - }); - } - - deleteFromSpaces(roomId) { - this.spaces.delete(roomId); - - const spaceChildren = this.getSpaceChildren(roomId); - spaceChildren?.forEach((childId) => { - this.removeFromRoomIdToParents(childId, roomId); - }); - } - - roomActions(action) { - const addRoom = (roomId, isDM) => { - const myRoom = this.matrixClient.getRoom(roomId); - if (myRoom === null) return false; - - if (isDM) this.directs.add(roomId); - else if (myRoom.isSpaceRoom()) this.addToSpaces(roomId); - else this.rooms.add(roomId); - return true; - }; - const actions = { - [cons.actions.room.JOIN]: () => { - if (addRoom(action.roomId, action.isDM)) { - setTimeout(() => { - this.emit(cons.events.roomList.ROOM_JOINED, action.roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - }, 100); - } else { - this.processingRooms.set(action.roomId, { - roomId: action.roomId, - isDM: action.isDM, - task: 'JOIN', - }); - } - }, - [cons.actions.room.CREATE]: () => { - if (addRoom(action.roomId, action.isDM)) { - setTimeout(() => { - this.emit(cons.events.roomList.ROOM_CREATED, action.roomId); - this.emit(cons.events.roomList.ROOM_JOINED, action.roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - }, 100); - } else { - this.processingRooms.set(action.roomId, { - roomId: action.roomId, - isDM: action.isDM, - task: 'CREATE', - }); - } - }, - }; - actions[action.type]?.(); - } - - getMDirects() { - const mDirectsId = new Set(); - const mDirect = this.matrixClient - .getAccountData('m.direct') - ?.getContent(); - - if (typeof mDirect === 'undefined') return mDirectsId; - - Object.keys(mDirect).forEach((direct) => { - mDirect[direct].forEach((directId) => mDirectsId.add(directId)); - }); - - return mDirectsId; - } - - _populateRooms() { - this.directs.clear(); - this.roomIdToParents.clear(); - this.spaces.clear(); - this.rooms.clear(); - this.inviteDirects.clear(); - this.inviteSpaces.clear(); - this.inviteRooms.clear(); - this.matrixClient.getRooms().forEach((room) => { - const { roomId } = room; - - if (room.getMyMembership() === 'invite') { - if (this._isDMInvite(room)) this.inviteDirects.add(roomId); - else if (room.isSpaceRoom()) this.inviteSpaces.add(roomId); - else this.inviteRooms.add(roomId); - return; - } - - if (room.getMyMembership() !== 'join') return; - - if (this.mDirects.has(roomId)) this.directs.add(roomId); - else if (room.isSpaceRoom()) this.addToSpaces(roomId); - else this.rooms.add(roomId); - }); - } - - _isDMInvite(room) { - if (this.mDirects.has(room.roomId)) return true; - const me = room.getMember(this.matrixClient.getUserId()); - const myEventContent = me.events.member.getContent(); - return myEventContent.membership === 'invite' && myEventContent.is_direct; - } - - _listenEvents() { - // Update roomList when m.direct changes - this.matrixClient.on('accountData', (event) => { - if (event.getType() !== 'm.direct') return; - - const latestMDirects = this.getMDirects(); - - latestMDirects.forEach((directId) => { - if (this.mDirects.has(directId)) return; - this.mDirects.add(directId); - - const myRoom = this.matrixClient.getRoom(directId); - if (myRoom === null) return; - if (myRoom.getMyMembership() === 'join') { - this.directs.add(directId); - this.rooms.delete(directId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - } - }); - - [...this.directs].forEach((directId) => { - if (latestMDirects.has(directId)) return; - this.mDirects.delete(directId); - - const myRoom = this.matrixClient.getRoom(directId); - if (myRoom === null) return; - if (myRoom.getMyMembership() === 'join') { - this.directs.delete(directId); - this.rooms.add(directId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - } - }); - }); - - this.matrixClient.on('Room.name', (room) => { - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - this.emit(cons.events.roomList.ROOM_PROFILE_UPDATED, room.roomId); - }); - - this.matrixClient.on('RoomState.events', (mEvent, state) => { - if (mEvent.getType() === 'm.space.child') { - const roomId = mEvent.event.room_id; - const childId = mEvent.event.state_key; - if (isMEventSpaceChild(mEvent)) { - const allParentSpaces = this.getAllParentSpaces(roomId); - // only add if it doesn't make a cycle - if (!allParentSpaces.has(childId)) { - this.addToRoomIdToParents(childId, roomId); - } - } else { - this.removeFromRoomIdToParents(childId, roomId); - } - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - return; - } - if (mEvent.getType() === 'm.room.join_rules') { - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - return; - } - if (['m.room.avatar', 'm.room.topic'].includes(mEvent.getType())) { - if (mEvent.getType() === 'm.room.avatar') { - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - } - this.emit(cons.events.roomList.ROOM_PROFILE_UPDATED, state.roomId); - } - }); - - this.matrixClient.on('Room.myMembership', async (room, membership, prevMembership) => { - // room => prevMembership = null | invite | join | leave | kick | ban | unban - // room => membership = invite | join | leave | kick | ban | unban - const { roomId } = room; - const isRoomReady = () => this.matrixClient.getRoom(roomId) !== null; - if (['join', 'invite'].includes(membership) && isRoomReady() === false) { - if (await waitFor(isRoomReady, 200, 100) === false) return; - } - - if (membership === 'unban') return; - - if (membership === 'invite') { - if (this._isDMInvite(room)) this.inviteDirects.add(roomId); - else if (room.isSpaceRoom()) this.inviteSpaces.add(roomId); - else this.inviteRooms.add(roomId); - - this.emit(cons.events.roomList.INVITELIST_UPDATED, roomId); - return; - } - - if (prevMembership === 'invite') { - if (this.inviteDirects.has(roomId)) this.inviteDirects.delete(roomId); - else if (this.inviteSpaces.has(roomId)) this.inviteSpaces.delete(roomId); - else this.inviteRooms.delete(roomId); - - this.emit(cons.events.roomList.INVITELIST_UPDATED, roomId); - } - - if (['leave', 'kick', 'ban'].includes(membership)) { - if (this.directs.has(roomId)) this.directs.delete(roomId); - else if (this.spaces.has(roomId)) this.deleteFromSpaces(roomId); - else this.rooms.delete(roomId); - this.emit(cons.events.roomList.ROOM_LEAVED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - return; - } - - // when user create room/DM OR accept room/dm invite from this client. - // we will update this.rooms/this.directs with user action - if (membership === 'join' && this.processingRooms.has(roomId)) { - const procRoomInfo = this.processingRooms.get(roomId); - - if (procRoomInfo.isDM) this.directs.add(roomId); - else if (room.isSpaceRoom()) this.addToSpaces(roomId); - else this.rooms.add(roomId); - - if (procRoomInfo.task === 'CREATE') this.emit(cons.events.roomList.ROOM_CREATED, roomId); - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - - this.processingRooms.delete(roomId); - return; - } - - if (this.mDirects.has(roomId) && membership === 'join') { - this.directs.add(roomId); - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - return; - } - - if (membership === 'join') { - if (room.isSpaceRoom()) this.addToSpaces(roomId); - else this.rooms.add(roomId); - this.emit(cons.events.roomList.ROOM_JOINED, roomId); - this.emit(cons.events.roomList.ROOMLIST_UPDATED); - } - }); - } -} -export default RoomList; diff --git a/src/client/state/RoomTimeline.js b/src/client/state/RoomTimeline.js deleted file mode 100644 index 57d91c14..00000000 --- a/src/client/state/RoomTimeline.js +++ /dev/null @@ -1,407 +0,0 @@ -import EventEmitter from 'events'; -import initMatrix from '../initMatrix'; -import cons from './cons'; - -import settings from './settings'; - -function isEdited(mEvent) { - return mEvent.getRelation()?.rel_type === 'm.replace'; -} - -function isReaction(mEvent) { - return mEvent.getType() === 'm.reaction'; -} - -function hideMemberEvents(mEvent) { - const content = mEvent.getContent(); - const prevContent = mEvent.getPrevContent(); - const { membership } = content; - if (settings.hideMembershipEvents) { - if (membership === 'invite' || membership === 'ban' || membership === 'leave') return true; - if (prevContent.membership !== 'join') return true; - } - if (settings.hideNickAvatarEvents) { - if (membership === 'join' && prevContent.membership === 'join') return true; - } - return false; -} - -function getRelateToId(mEvent) { - const relation = mEvent.getRelation(); - return relation && relation.event_id; -} - -function addToMap(myMap, mEvent) { - const relateToId = getRelateToId(mEvent); - if (relateToId === null) return null; - const mEventId = mEvent.getId(); - - if (typeof myMap.get(relateToId) === 'undefined') myMap.set(relateToId, []); - const mEvents = myMap.get(relateToId); - if (mEvents.find((ev) => ev.getId() === mEventId)) return mEvent; - mEvents.push(mEvent); - return mEvent; -} - -function getFirstLinkedTimeline(timeline) { - let tm = timeline; - while (tm.prevTimeline) { - tm = tm.prevTimeline; - } - return tm; -} -function getLastLinkedTimeline(timeline) { - let tm = timeline; - while (tm.nextTimeline) { - tm = tm.nextTimeline; - } - return tm; -} - -function iterateLinkedTimelines(timeline, backwards, callback) { - let tm = timeline; - while (tm) { - callback(tm); - if (backwards) tm = tm.prevTimeline; - else tm = tm.nextTimeline; - } -} - -function isTimelineLinked(tm1, tm2) { - let tm = getFirstLinkedTimeline(tm1); - while (tm) { - if (tm === tm2) return true; - tm = tm.nextTimeline; - } - return false; -} - -class RoomTimeline extends EventEmitter { - constructor(roomId) { - super(); - // These are local timelines - this.timeline = []; - this.editedTimeline = new Map(); - this.reactionTimeline = new Map(); - this.typingMembers = new Set(); - - this.matrixClient = initMatrix.matrixClient; - this.roomId = roomId; - this.room = this.matrixClient.getRoom(roomId); - - this.liveTimeline = this.room.getLiveTimeline(); - this.activeTimeline = this.liveTimeline; - - this.isOngoingPagination = false; - this.ongoingDecryptionCount = 0; - this.initialized = false; - - setTimeout(() => this.room.loadMembersIfNeeded()); - - // TODO: remove below line - window.selectedRoom = this; - } - - isServingLiveTimeline() { - return getLastLinkedTimeline(this.activeTimeline) === this.liveTimeline; - } - - canPaginateBackward() { - if (this.timeline[0]?.getType() === 'm.room.create') return false; - const tm = getFirstLinkedTimeline(this.activeTimeline); - return tm.getPaginationToken('b') !== null; - } - - canPaginateForward() { - return !this.isServingLiveTimeline(); - } - - isEncrypted() { - return this.matrixClient.isRoomEncrypted(this.roomId); - } - - clearLocalTimelines() { - this.timeline = []; - } - - addToTimeline(mEvent) { - if (mEvent.getType() === 'm.room.member' && hideMemberEvents(mEvent)) { - return; - } - if (mEvent.isRedacted()) return; - if (isReaction(mEvent)) { - addToMap(this.reactionTimeline, mEvent); - return; - } - if (!cons.supportEventTypes.includes(mEvent.getType())) return; - if (isEdited(mEvent)) { - addToMap(this.editedTimeline, mEvent); - return; - } - this.timeline.push(mEvent); - } - - _populateAllLinkedEvents(timeline) { - const firstTimeline = getFirstLinkedTimeline(timeline); - iterateLinkedTimelines(firstTimeline, false, (tm) => { - tm.getEvents().forEach((mEvent) => this.addToTimeline(mEvent)); - }); - } - - _populateTimelines() { - this.clearLocalTimelines(); - this._populateAllLinkedEvents(this.activeTimeline); - } - - async _reset() { - if (this.isEncrypted()) await this.decryptAllEventsOfTimeline(this.activeTimeline); - this._populateTimelines(); - if (!this.initialized) { - this.initialized = true; - this._listenEvents(); - } - } - - async loadLiveTimeline() { - this.activeTimeline = this.liveTimeline; - await this._reset(); - this.emit(cons.events.roomTimeline.READY, null); - return true; - } - - async loadEventTimeline(eventId) { - // we use first unfiltered EventTimelineSet for room pagination. - const timelineSet = this.getUnfilteredTimelineSet(); - try { - const eventTimeline = await this.matrixClient.getEventTimeline(timelineSet, eventId); - this.activeTimeline = eventTimeline; - await this._reset(); - this.emit(cons.events.roomTimeline.READY, eventId); - return true; - } catch { - return false; - } - } - - async paginateTimeline(backwards = false, limit = 30) { - if (this.initialized === false) return false; - if (this.isOngoingPagination) return false; - - this.isOngoingPagination = true; - - const timelineToPaginate = backwards - ? getFirstLinkedTimeline(this.activeTimeline) - : getLastLinkedTimeline(this.activeTimeline); - - if (timelineToPaginate.getPaginationToken(backwards ? 'b' : 'f') === null) { - this.emit(cons.events.roomTimeline.PAGINATED, backwards, 0); - this.isOngoingPagination = false; - return false; - } - - const oldSize = this.timeline.length; - try { - await this.matrixClient.paginateEventTimeline(timelineToPaginate, { backwards, limit }); - - if (this.isEncrypted()) await this.decryptAllEventsOfTimeline(this.activeTimeline); - this._populateTimelines(); - - const loaded = this.timeline.length - oldSize; - this.emit(cons.events.roomTimeline.PAGINATED, backwards, loaded); - this.isOngoingPagination = false; - return true; - } catch { - this.emit(cons.events.roomTimeline.PAGINATED, backwards, 0); - this.isOngoingPagination = false; - return false; - } - } - - decryptAllEventsOfTimeline(eventTimeline) { - const decryptionPromises = eventTimeline - .getEvents() - .filter((event) => event.isEncrypted() && !event.clearEvent) - .reverse() - .map((event) => event.attemptDecryption(this.matrixClient.crypto, { isRetry: true })); - - return Promise.allSettled(decryptionPromises); - } - - hasEventInTimeline(eventId, timeline = this.activeTimeline) { - const timelineSet = this.getUnfilteredTimelineSet(); - const eventTimeline = timelineSet.getTimelineForEvent(eventId); - if (!eventTimeline) return false; - return isTimelineLinked(eventTimeline, timeline); - } - - getUnfilteredTimelineSet() { - return this.room.getUnfilteredTimelineSet(); - } - - getEventReaders(mEvent) { - const liveEvents = this.liveTimeline.getEvents(); - const readers = []; - if (!mEvent) return []; - - for (let i = liveEvents.length - 1; i >= 0; i -= 1) { - readers.splice(readers.length, 0, ...this.room.getUsersReadUpTo(liveEvents[i])); - if (mEvent === liveEvents[i]) break; - } - - return [...new Set(readers)]; - } - - getLiveReaders() { - const liveEvents = this.liveTimeline.getEvents(); - const getLatestVisibleEvent = () => { - for (let i = liveEvents.length - 1; i >= 0; i -= 1) { - const mEvent = liveEvents[i]; - if (mEvent.getType() === 'm.room.member' && hideMemberEvents(mEvent)) { - // eslint-disable-next-line no-continue - continue; - } - if (!mEvent.isRedacted() - && !isReaction(mEvent) - && !isEdited(mEvent) - && cons.supportEventTypes.includes(mEvent.getType()) - ) return mEvent; - } - return liveEvents[liveEvents.length - 1]; - }; - - return this.getEventReaders(getLatestVisibleEvent()); - } - - getUnreadEventIndex(readUpToEventId) { - if (!this.hasEventInTimeline(readUpToEventId)) return -1; - - const readUpToEvent = this.findEventByIdInTimelineSet(readUpToEventId); - if (!readUpToEvent) return -1; - const rTs = readUpToEvent.getTs(); - - const tLength = this.timeline.length; - - for (let i = 0; i < tLength; i += 1) { - const mEvent = this.timeline[i]; - if (mEvent.getTs() > rTs) return i; - } - return -1; - } - - getReadUpToEventId() { - return this.room.getEventReadUpTo(this.matrixClient.getUserId()); - } - - getEventIndex(eventId) { - return this.timeline.findIndex((mEvent) => mEvent.getId() === eventId); - } - - findEventByIdInTimelineSet(eventId, eventTimelineSet = this.getUnfilteredTimelineSet()) { - return eventTimelineSet.findEventById(eventId); - } - - findEventById(eventId) { - return this.timeline[this.getEventIndex(eventId)] ?? null; - } - - deleteFromTimeline(eventId) { - const i = this.getEventIndex(eventId); - if (i === -1) return undefined; - return this.timeline.splice(i, 1)[0]; - } - - _listenEvents() { - this._listenRoomTimeline = (event, room, toStartOfTimeline, removed, data) => { - if (room.roomId !== this.roomId) return; - if (this.isOngoingPagination) return; - - // User is currently viewing the old events probably - // no need to add new event and emit changes. - // only add reactions and edited messages - if (this.isServingLiveTimeline() === false) { - if (!isReaction(event) && !isEdited(event)) return; - } - - // We only process live events here - if (!data.liveEvent) return; - - if (event.isEncrypted()) { - // We will add this event after it is being decrypted. - this.ongoingDecryptionCount += 1; - return; - } - - // FIXME: An unencrypted plain event can come - // while previous event is still decrypting - // and has not been added to timeline - // causing unordered timeline view. - - this.addToTimeline(event); - this.emit(cons.events.roomTimeline.EVENT, event); - }; - - this._listenDecryptEvent = (event) => { - if (event.getRoomId() !== this.roomId) return; - if (this.isOngoingPagination) return; - - // Not a live event. - // so we don't need to process it here - if (this.ongoingDecryptionCount === 0) return; - - if (this.ongoingDecryptionCount > 0) { - this.ongoingDecryptionCount -= 1; - } - this.addToTimeline(event); - this.emit(cons.events.roomTimeline.EVENT, event); - }; - - this._listenRedaction = (mEvent, room) => { - if (room.roomId !== this.roomId) return; - const rEvent = this.deleteFromTimeline(mEvent.event.redacts); - this.editedTimeline.delete(mEvent.event.redacts); - this.reactionTimeline.delete(mEvent.event.redacts); - this.emit(cons.events.roomTimeline.EVENT_REDACTED, rEvent, mEvent); - }; - - this._listenTypingEvent = (event, member) => { - if (member.roomId !== this.roomId) return; - - const isTyping = member.typing; - if (isTyping) this.typingMembers.add(member.userId); - else this.typingMembers.delete(member.userId); - this.emit(cons.events.roomTimeline.TYPING_MEMBERS_UPDATED, new Set([...this.typingMembers])); - }; - this._listenReciptEvent = (event, room) => { - // we only process receipt for latest message here. - if (room.roomId !== this.roomId) return; - const receiptContent = event.getContent(); - - const mEvents = this.liveTimeline.getEvents(); - const lastMEvent = mEvents[mEvents.length - 1]; - const lastEventId = lastMEvent.getId(); - const lastEventRecipt = receiptContent[lastEventId]; - - if (typeof lastEventRecipt === 'undefined') return; - if (lastEventRecipt['m.read']) { - this.emit(cons.events.roomTimeline.LIVE_RECEIPT); - } - }; - - this.matrixClient.on('Room.timeline', this._listenRoomTimeline); - this.matrixClient.on('Room.redaction', this._listenRedaction); - this.matrixClient.on('Event.decrypted', this._listenDecryptEvent); - this.matrixClient.on('RoomMember.typing', this._listenTypingEvent); - this.matrixClient.on('Room.receipt', this._listenReciptEvent); - } - - removeInternalListeners() { - if (!this.initialized) return; - this.matrixClient.removeListener('Room.timeline', this._listenRoomTimeline); - this.matrixClient.removeListener('Room.redaction', this._listenRedaction); - this.matrixClient.removeListener('Event.decrypted', this._listenDecryptEvent); - this.matrixClient.removeListener('RoomMember.typing', this._listenTypingEvent); - this.matrixClient.removeListener('Room.receipt', this._listenReciptEvent); - } -} - -export default RoomTimeline; diff --git a/src/client/state/RoomsHierarchy.js b/src/client/state/RoomsHierarchy.js deleted file mode 100644 index f3ffb1fc..00000000 --- a/src/client/state/RoomsHierarchy.js +++ /dev/null @@ -1,49 +0,0 @@ -import { RoomHierarchy } from 'matrix-js-sdk/lib/room-hierarchy'; - -class RoomsHierarchy { - constructor(matrixClient, limit = 20, maxDepth = 1, suggestedOnly = false) { - this.matrixClient = matrixClient; - this._maxDepth = maxDepth; - this._suggestedOnly = suggestedOnly; - this._limit = limit; - - this.roomIdToHierarchy = new Map(); - } - - getHierarchy(roomId) { - return this.roomIdToHierarchy.get(roomId); - } - - removeHierarchy(roomId) { - return this.roomIdToHierarchy.delete(roomId); - } - - canLoadMore(roomId) { - const roomHierarchy = this.getHierarchy(roomId); - if (!roomHierarchy) return true; - return roomHierarchy.canLoadMore; - } - - async load(roomId, limit = this._limit) { - let roomHierarchy = this.getHierarchy(roomId); - - if (!roomHierarchy) { - roomHierarchy = new RoomHierarchy( - { roomId, client: this.matrixClient }, - limit, - this._maxDepth, - this._suggestedOnly, - ); - this.roomIdToHierarchy.set(roomId, roomHierarchy); - } - - try { - await roomHierarchy.load(limit); - return roomHierarchy.rooms; - } catch { - return roomHierarchy.rooms; - } - } -} - -export default RoomsHierarchy; diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js deleted file mode 100644 index d1e0aedb..00000000 --- a/src/client/state/RoomsInput.js +++ /dev/null @@ -1,423 +0,0 @@ -import EventEmitter from 'events'; -import encrypt from 'browser-encrypt-attachment'; -import { encode } from 'blurhash'; -import { getShortcodeToEmoji } from '../../app/organisms/emoji-board/custom-emoji'; -import { getBlobSafeMimeType } from '../../util/mimetypes'; -import { sanitizeText } from '../../util/sanitize'; -import cons from './cons'; -import settings from './settings'; -import { markdown, plain } from '../../util/markdown'; - -const blurhashField = 'xyz.amorgan.blurhash'; - -function encodeBlurhash(img) { - const canvas = document.createElement('canvas'); - canvas.width = 100; - canvas.height = 100; - const context = canvas.getContext('2d'); - context.drawImage(img, 0, 0, canvas.width, canvas.height); - const data = context.getImageData(0, 0, canvas.width, canvas.height); - return encode(data.data, data.width, data.height, 4, 4); -} - -function loadImage(url) { - return new Promise((resolve, reject) => { - const img = new Image(); - img.onload = () => resolve(img); - img.onerror = (err) => reject(err); - img.src = url; - }); -} - -function loadVideo(videoFile) { - return new Promise((resolve, reject) => { - const video = document.createElement('video'); - video.preload = 'metadata'; - video.playsInline = true; - video.muted = true; - - const reader = new FileReader(); - - reader.onload = (ev) => { - // Wait until we have enough data to thumbnail the first frame. - video.onloadeddata = async () => { - resolve(video); - video.pause(); - }; - video.onerror = (e) => { - reject(e); - }; - - video.src = ev.target.result; - video.load(); - video.play(); - }; - reader.onerror = (e) => { - reject(e); - }; - if (videoFile.type === 'video/quicktime') { - const quicktimeVideoFile = new File([videoFile], videoFile.name, { type: 'video/mp4' }); - reader.readAsDataURL(quicktimeVideoFile); - } else { - reader.readAsDataURL(videoFile); - } - }); -} -function getVideoThumbnail(video, width, height, mimeType) { - return new Promise((resolve) => { - const MAX_WIDTH = 800; - const MAX_HEIGHT = 600; - let targetWidth = width; - let targetHeight = height; - if (targetHeight > MAX_HEIGHT) { - targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight)); - targetHeight = MAX_HEIGHT; - } - if (targetWidth > MAX_WIDTH) { - targetHeight = Math.floor(targetHeight * (MAX_WIDTH / targetWidth)); - targetWidth = MAX_WIDTH; - } - - const canvas = document.createElement('canvas'); - canvas.width = targetWidth; - canvas.height = targetHeight; - const context = canvas.getContext('2d'); - context.drawImage(video, 0, 0, targetWidth, targetHeight); - - canvas.toBlob((thumbnail) => { - resolve({ - thumbnail, - info: { - w: targetWidth, - h: targetHeight, - mimetype: thumbnail.type, - size: thumbnail.size, - }, - }); - }, mimeType); - }); -} - -class RoomsInput extends EventEmitter { - constructor(mx, roomList) { - super(); - - this.matrixClient = mx; - this.roomList = roomList; - this.roomIdToInput = new Map(); - } - - cleanEmptyEntry(roomId) { - const input = this.getInput(roomId); - const isEmpty = typeof input.attachment === 'undefined' - && typeof input.replyTo === 'undefined' - && (typeof input.message === 'undefined' || input.message === ''); - if (isEmpty) { - this.roomIdToInput.delete(roomId); - } - } - - getInput(roomId) { - return this.roomIdToInput.get(roomId) || {}; - } - - setMessage(roomId, message) { - const input = this.getInput(roomId); - input.message = message; - this.roomIdToInput.set(roomId, input); - if (message === '') this.cleanEmptyEntry(roomId); - } - - getMessage(roomId) { - const input = this.getInput(roomId); - if (typeof input.message === 'undefined') return ''; - return input.message; - } - - setReplyTo(roomId, replyTo) { - const input = this.getInput(roomId); - input.replyTo = replyTo; - this.roomIdToInput.set(roomId, input); - } - - getReplyTo(roomId) { - const input = this.getInput(roomId); - if (typeof input.replyTo === 'undefined') return null; - return input.replyTo; - } - - cancelReplyTo(roomId) { - const input = this.getInput(roomId); - if (typeof input.replyTo === 'undefined') return; - delete input.replyTo; - this.roomIdToInput.set(roomId, input); - } - - setAttachment(roomId, file) { - const input = this.getInput(roomId); - input.attachment = { - file, - }; - this.roomIdToInput.set(roomId, input); - } - - getAttachment(roomId) { - const input = this.getInput(roomId); - if (typeof input.attachment === 'undefined') return null; - return input.attachment.file; - } - - cancelAttachment(roomId) { - const input = this.getInput(roomId); - if (typeof input.attachment === 'undefined') return; - - const { uploadingPromise } = input.attachment; - - if (uploadingPromise) { - this.matrixClient.cancelUpload(uploadingPromise); - delete input.attachment.uploadingPromise; - } - delete input.attachment; - delete input.isSending; - this.roomIdToInput.set(roomId, input); - this.emit(cons.events.roomsInput.ATTACHMENT_CANCELED, roomId); - } - - isSending(roomId) { - return this.roomIdToInput.get(roomId)?.isSending || false; - } - - getContent(roomId, options, message, reply, edit) { - const msgType = options?.msgType || 'm.text'; - const autoMarkdown = options?.autoMarkdown ?? true; - - const room = this.matrixClient.getRoom(roomId); - - const userNames = room.currentState.userIdsToDisplayNames; - const parentIds = this.roomList.getAllParentSpaces(room.roomId); - const parentRooms = [...parentIds].map((id) => this.matrixClient.getRoom(id)); - const emojis = getShortcodeToEmoji(this.matrixClient, [room, ...parentRooms]); - - const output = settings.isMarkdown && autoMarkdown ? markdown : plain; - const body = output(message, { userNames, emojis }); - - const content = { - body: body.plain, - msgtype: msgType, - }; - - if (!body.onlyPlain || reply) { - content.format = 'org.matrix.custom.html'; - content.formatted_body = body.html; - } - - if (edit) { - content['m.new_content'] = { ...content }; - content['m.relates_to'] = { - event_id: edit.getId(), - rel_type: 'm.replace', - }; - - const isReply = edit.getWireContent()['m.relates_to']?.['m.in_reply_to']; - if (isReply) { - content.format = 'org.matrix.custom.html'; - content.formatted_body = body.html; - } - - content.body = ` * ${content.body}`; - if (content.formatted_body) content.formatted_body = ` * ${content.formatted_body}`; - - if (isReply) { - const eBody = edit.getContent().body; - const replyHead = eBody.substring(0, eBody.indexOf('\n\n')); - if (replyHead) content.body = `${replyHead}\n\n${content.body}`; - - const eFBody = edit.getContent().formatted_body; - const fReplyHead = eFBody.substring(0, eFBody.indexOf('')); - if (fReplyHead) content.formatted_body = `${fReplyHead}${content.formatted_body}`; - } - } - - if (reply) { - content['m.relates_to'] = { - 'm.in_reply_to': { - event_id: reply.eventId, - }, - }; - - content.body = `> <${reply.userId}> ${reply.body.replace(/\n/g, '\n> ')}\n\n${content.body}`; - - const replyToLink = `In reply to`; - const userLink = `${sanitizeText(reply.userId)}`; - const fallback = `

    ${replyToLink}${userLink}
    ${reply.formattedBody || sanitizeText(reply.body)}
    `; - content.formatted_body = fallback + content.formatted_body; - } - - return content; - } - - async sendInput(roomId, options) { - const input = this.getInput(roomId); - input.isSending = true; - this.roomIdToInput.set(roomId, input); - if (input.attachment) { - await this.sendFile(roomId, input.attachment.file); - if (!this.isSending(roomId)) return; - } - - if (this.getMessage(roomId).trim() !== '') { - const content = this.getContent(roomId, options, input.message, input.replyTo); - this.matrixClient.sendMessage(roomId, content); - } - - if (this.isSending(roomId)) this.roomIdToInput.delete(roomId); - this.emit(cons.events.roomsInput.MESSAGE_SENT, roomId); - } - - async sendSticker(roomId, data) { - const { mxc: url, body, httpUrl } = data; - const info = {}; - - const img = new Image(); - img.src = httpUrl; - - try { - const res = await fetch(httpUrl); - const blob = await res.blob(); - info.w = img.width; - info.h = img.height; - info.mimetype = blob.type; - info.size = blob.size; - info.thumbnail_info = { ...info }; - info.thumbnail_url = url; - } catch { - // send sticker without info - } - - this.matrixClient.sendEvent(roomId, 'm.sticker', { - body, - url, - info, - }); - this.emit(cons.events.roomsInput.MESSAGE_SENT, roomId); - } - - async sendFile(roomId, file) { - const fileType = getBlobSafeMimeType(file.type).slice(0, file.type.indexOf('/')); - const info = { - mimetype: file.type, - size: file.size, - }; - const content = { info }; - let uploadData = null; - - if (fileType === 'image') { - const img = await loadImage(URL.createObjectURL(file)); - - info.w = img.width; - info.h = img.height; - info[blurhashField] = encodeBlurhash(img); - - content.msgtype = 'm.image'; - content.body = file.name || 'Image'; - } else if (fileType === 'video') { - content.msgtype = 'm.video'; - content.body = file.name || 'Video'; - - try { - const video = await loadVideo(file); - - info.w = video.videoWidth; - info.h = video.videoHeight; - info[blurhashField] = encodeBlurhash(video); - - const thumbnailData = await getVideoThumbnail(video, video.videoWidth, video.videoHeight, 'image/jpeg'); - const thumbnailUploadData = await this.uploadFile(roomId, thumbnailData.thumbnail); - info.thumbnail_info = thumbnailData.info; - if (this.matrixClient.isRoomEncrypted(roomId)) { - info.thumbnail_file = thumbnailUploadData.file; - } else { - info.thumbnail_url = thumbnailUploadData.url; - } - } catch (e) { - this.emit(cons.events.roomsInput.FILE_UPLOAD_CANCELED, roomId); - return; - } - } else if (fileType === 'audio') { - content.msgtype = 'm.audio'; - content.body = file.name || 'Audio'; - } else { - content.msgtype = 'm.file'; - content.body = file.name || 'File'; - } - - try { - uploadData = await this.uploadFile(roomId, file, (data) => { - // data have two properties: data.loaded, data.total - this.emit(cons.events.roomsInput.UPLOAD_PROGRESS_CHANGES, roomId, data); - }); - this.emit(cons.events.roomsInput.FILE_UPLOADED, roomId); - } catch (e) { - this.emit(cons.events.roomsInput.FILE_UPLOAD_CANCELED, roomId); - return; - } - if (this.matrixClient.isRoomEncrypted(roomId)) { - content.file = uploadData.file; - await this.matrixClient.sendMessage(roomId, content); - } else { - content.url = uploadData.url; - await this.matrixClient.sendMessage(roomId, content); - } - } - - async uploadFile(roomId, file, progressHandler) { - const isEncryptedRoom = this.matrixClient.isRoomEncrypted(roomId); - - let encryptInfo = null; - let encryptBlob = null; - - if (isEncryptedRoom) { - const dataBuffer = await file.arrayBuffer(); - if (typeof this.getInput(roomId).attachment === 'undefined') throw new Error('Attachment canceled'); - const encryptedResult = await encrypt.encryptAttachment(dataBuffer); - if (typeof this.getInput(roomId).attachment === 'undefined') throw new Error('Attachment canceled'); - encryptInfo = encryptedResult.info; - encryptBlob = new Blob([encryptedResult.data]); - } - - const uploadingPromise = this.matrixClient.uploadContent(isEncryptedRoom ? encryptBlob : file, { - // don't send filename if room is encrypted. - includeFilename: !isEncryptedRoom, - progressHandler, - }); - - const input = this.getInput(roomId); - input.attachment.uploadingPromise = uploadingPromise; - this.roomIdToInput.set(roomId, input); - - const { content_uri: url } = await uploadingPromise; - - delete input.attachment.uploadingPromise; - this.roomIdToInput.set(roomId, input); - - if (isEncryptedRoom) { - encryptInfo.url = url; - if (file.type) encryptInfo.mimetype = file.type; - return { file: encryptInfo }; - } - return { url }; - } - - async sendEditedMessage(roomId, mEvent, editedBody) { - const content = this.getContent( - roomId, - { msgType: mEvent.getWireContent().msgtype }, - editedBody, - null, - mEvent, - ); - this.matrixClient.sendMessage(roomId, content); - } -} - -export default RoomsInput; diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 62c0cacc..523e871a 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -8,10 +8,6 @@ const cons = { }, DEVICE_DISPLAY_NAME: 'Cinny Web', IN_CINNY_SPACES: 'in.cinny.spaces', - tabs: { - HOME: 'home', - DIRECTS: 'dm', - }, supportEventTypes: [ 'm.room.create', 'm.room.message', @@ -37,43 +33,19 @@ const cons = { }, actions: { navigation: { - SELECT_TAB: 'SELECT_TAB', - SELECT_SPACE: 'SELECT_SPACE', - SELECT_ROOM: 'SELECT_ROOM', OPEN_SPACE_SETTINGS: 'OPEN_SPACE_SETTINGS', - OPEN_SPACE_MANAGE: 'OPEN_SPACE_MANAGE', OPEN_SPACE_ADDEXISTING: 'OPEN_SPACE_ADDEXISTING', TOGGLE_ROOM_SETTINGS: 'TOGGLE_ROOM_SETTINGS', - OPEN_SHORTCUT_SPACES: 'OPEN_SHORTCUT_SPACES', - OPEN_INVITE_LIST: 'OPEN_INVITE_LIST', - OPEN_PUBLIC_ROOMS: 'OPEN_PUBLIC_ROOMS', OPEN_CREATE_ROOM: 'OPEN_CREATE_ROOM', OPEN_JOIN_ALIAS: 'OPEN_JOIN_ALIAS', OPEN_INVITE_USER: 'OPEN_INVITE_USER', OPEN_PROFILE_VIEWER: 'OPEN_PROFILE_VIEWER', OPEN_SETTINGS: 'OPEN_SETTINGS', - OPEN_EMOJIBOARD: 'OPEN_EMOJIBOARD', - OPEN_READRECEIPTS: 'OPEN_READRECEIPTS', - OPEN_VIEWSOURCE: 'OPEN_VIEWSOURCE', - CLICK_REPLY_TO: 'CLICK_REPLY_TO', OPEN_SEARCH: 'OPEN_SEARCH', OPEN_REUSABLE_CONTEXT_MENU: 'OPEN_REUSABLE_CONTEXT_MENU', - OPEN_NAVIGATION: 'OPEN_NAVIGATION', OPEN_REUSABLE_DIALOG: 'OPEN_REUSABLE_DIALOG', OPEN_EMOJI_VERIFICATION: 'OPEN_EMOJI_VERIFICATION', }, - room: { - JOIN: 'JOIN', - LEAVE: 'LEAVE', - CREATE: 'CREATE', - }, - accountData: { - CREATE_SPACE_SHORTCUT: 'CREATE_SPACE_SHORTCUT', - DELETE_SPACE_SHORTCUT: 'DELETE_SPACE_SHORTCUT', - MOVE_SPACE_SHORTCUTS: 'MOVE_SPACE_SHORTCUTS', - CATEGORIZE_SPACE: 'CATEGORIZE_SPACE', - UNCATEGORIZE_SPACE: 'UNCATEGORIZE_SPACE', - }, settings: { TOGGLE_SYSTEM_THEME: 'TOGGLE_SYSTEM_THEME', TOGGLE_MARKDOWN: 'TOGGLE_MARKDOWN', @@ -86,66 +58,23 @@ const cons = { }, events: { navigation: { - TAB_SELECTED: 'TAB_SELECTED', - SPACE_SELECTED: 'SPACE_SELECTED', - ROOM_SELECTED: 'ROOM_SELECTED', SPACE_SETTINGS_OPENED: 'SPACE_SETTINGS_OPENED', - SPACE_MANAGE_OPENED: 'SPACE_MANAGE_OPENED', SPACE_ADDEXISTING_OPENED: 'SPACE_ADDEXISTING_OPENED', ROOM_SETTINGS_TOGGLED: 'ROOM_SETTINGS_TOGGLED', - SHORTCUT_SPACES_OPENED: 'SHORTCUT_SPACES_OPENED', - INVITE_LIST_OPENED: 'INVITE_LIST_OPENED', - PUBLIC_ROOMS_OPENED: 'PUBLIC_ROOMS_OPENED', CREATE_ROOM_OPENED: 'CREATE_ROOM_OPENED', JOIN_ALIAS_OPENED: 'JOIN_ALIAS_OPENED', INVITE_USER_OPENED: 'INVITE_USER_OPENED', SETTINGS_OPENED: 'SETTINGS_OPENED', - PROFILE_VIEWER_OPENED: 'PROFILE_VIEWER_OPENED', - EMOJIBOARD_OPENED: 'EMOJIBOARD_OPENED', - READRECEIPTS_OPENED: 'READRECEIPTS_OPENED', - VIEWSOURCE_OPENED: 'VIEWSOURCE_OPENED', - REPLY_TO_CLICKED: 'REPLY_TO_CLICKED', SEARCH_OPENED: 'SEARCH_OPENED', REUSABLE_CONTEXT_MENU_OPENED: 'REUSABLE_CONTEXT_MENU_OPENED', - NAVIGATION_OPENED: 'NAVIGATION_OPENED', REUSABLE_DIALOG_OPENED: 'REUSABLE_DIALOG_OPENED', EMOJI_VERIFICATION_OPENED: 'EMOJI_VERIFICATION_OPENED', }, - roomList: { - ROOMLIST_UPDATED: 'ROOMLIST_UPDATED', - INVITELIST_UPDATED: 'INVITELIST_UPDATED', - ROOM_JOINED: 'ROOM_JOINED', - ROOM_LEAVED: 'ROOM_LEAVED', - ROOM_CREATED: 'ROOM_CREATED', - ROOM_PROFILE_UPDATED: 'ROOM_PROFILE_UPDATED', - }, - accountData: { - SPACE_SHORTCUT_UPDATED: 'SPACE_SHORTCUT_UPDATED', - CATEGORIZE_SPACE_UPDATED: 'CATEGORIZE_SPACE_UPDATED', - }, notifications: { NOTI_CHANGED: 'NOTI_CHANGED', FULL_READ: 'FULL_READ', MUTE_TOGGLED: 'MUTE_TOGGLED', }, - roomTimeline: { - READY: 'READY', - EVENT: 'EVENT', - PAGINATED: 'PAGINATED', - TYPING_MEMBERS_UPDATED: 'TYPING_MEMBERS_UPDATED', - LIVE_RECEIPT: 'LIVE_RECEIPT', - EVENT_REDACTED: 'EVENT_REDACTED', - AT_BOTTOM: 'AT_BOTTOM', - SCROLL_TO_LIVE: 'SCROLL_TO_LIVE', - }, - roomsInput: { - MESSAGE_SENT: 'MESSAGE_SENT', - ATTACHMENT_SET: 'ATTACHMENT_SET', - FILE_UPLOADED: 'FILE_UPLOADED', - UPLOAD_PROGRESS_CHANGES: 'UPLOAD_PROGRESS_CHANGES', - FILE_UPLOAD_CANCELED: 'FILE_UPLOAD_CANCELED', - ATTACHMENT_CANCELED: 'ATTACHMENT_CANCELED', - }, settings: { SYSTEM_THEME_TOGGLED: 'SYSTEM_THEME_TOGGLED', MARKDOWN_TOGGLED: 'MARKDOWN_TOGGLED', diff --git a/src/client/state/navigation.js b/src/client/state/navigation.js index ddac4dda..5f28f232 100644 --- a/src/client/state/navigation.js +++ b/src/client/state/navigation.js @@ -5,268 +5,9 @@ import cons from './cons'; class Navigation extends EventEmitter { constructor() { super(); - // this will attached by initMatrix - this.initMatrix = {}; - - this.selectedTab = cons.tabs.HOME; - this.selectedSpaceId = null; - this.selectedSpacePath = [cons.tabs.HOME]; - - this.selectedRoomId = null; - this.recentRooms = []; - - this.spaceToRoom = new Map(); - this.rawModelStack = []; } - _addToSpacePath(roomId, asRoot) { - if (typeof roomId !== 'string') { - this.selectedSpacePath = [cons.tabs.HOME]; - return; - } - if (asRoot) { - this.selectedSpacePath = [roomId]; - return; - } - if (this.selectedSpacePath.includes(roomId)) { - const spIndex = this.selectedSpacePath.indexOf(roomId); - this.selectedSpacePath = this.selectedSpacePath.slice(0, spIndex + 1); - return; - } - this.selectedSpacePath.push(roomId); - } - - _mapRoomToSpace(roomId) { - const { roomList, accountData } = this.initMatrix; - if ( - this.selectedTab === cons.tabs.HOME - && roomList.rooms.has(roomId) - && !roomList.roomIdToParents.has(roomId) - ) { - this.spaceToRoom.set(cons.tabs.HOME, { - roomId, - timestamp: Date.now(), - }); - return; - } - if (this.selectedTab === cons.tabs.DIRECTS && roomList.directs.has(roomId)) { - this.spaceToRoom.set(cons.tabs.DIRECTS, { - roomId, - timestamp: Date.now(), - }); - return; - } - - const parents = roomList.roomIdToParents.get(roomId); - if (!parents) return; - if (parents.has(this.selectedSpaceId)) { - this.spaceToRoom.set(this.selectedSpaceId, { - roomId, - timestamp: Date.now(), - }); - } else if (accountData.categorizedSpaces.has(this.selectedSpaceId)) { - const categories = roomList.getCategorizedSpaces([this.selectedSpaceId]); - const parent = [...parents].find((pId) => categories.has(pId)); - if (parent) { - this.spaceToRoom.set(parent, { - roomId, - timestamp: Date.now(), - }); - } - } - } - - _selectRoom(roomId, eventId) { - const prevSelectedRoomId = this.selectedRoomId; - this.selectedRoomId = roomId; - if (prevSelectedRoomId !== roomId) this._mapRoomToSpace(roomId); - this.removeRecentRoom(prevSelectedRoomId); - this.addRecentRoom(prevSelectedRoomId); - this.removeRecentRoom(this.selectedRoomId); - this.emit( - cons.events.navigation.ROOM_SELECTED, - this.selectedRoomId, - prevSelectedRoomId, - eventId, - ); - } - - _selectTabWithRoom(roomId) { - const { roomList, accountData } = this.initMatrix; - const { categorizedSpaces } = accountData; - - if (roomList.isOrphan(roomId)) { - if (roomList.directs.has(roomId)) { - this._selectSpace(null, true, false); - this._selectTab(cons.tabs.DIRECTS, false); - return; - } - this._selectSpace(null, true, false); - this._selectTab(cons.tabs.HOME, false); - return; - } - - const parents = roomList.roomIdToParents.get(roomId); - - if (parents.has(this.selectedSpaceId)) { - return; - } - - if (categorizedSpaces.has(this.selectedSpaceId)) { - const categories = roomList.getCategorizedSpaces([this.selectedSpaceId]); - if ([...parents].find((pId) => categories.has(pId))) { - // No need to select tab - // As one of parent is child of selected categorized space. - return; - } - } - - const spaceInPath = [...this.selectedSpacePath].reverse().find((sId) => parents.has(sId)); - if (spaceInPath) { - this._selectSpace(spaceInPath, false, false); - return; - } - - if (roomList.directs.has(roomId)) { - this._selectSpace(null, true, false); - this._selectTab(cons.tabs.DIRECTS, false); - return; - } - - if (parents.size > 0) { - const sortedParents = [...parents].sort((p1, p2) => { - const t1 = this.spaceToRoom.get(p1)?.timestamp ?? 0; - const t2 = this.spaceToRoom.get(p2)?.timestamp ?? 0; - return t2 - t1; - }); - this._selectSpace(sortedParents[0], true, false); - this._selectTab(sortedParents[0], false); - } - } - - _getLatestActiveRoomId(roomIds) { - const mx = this.initMatrix.matrixClient; - - let ts = 0; - let roomId = null; - roomIds.forEach((childId) => { - const room = mx.getRoom(childId); - if (!room) return; - const newTs = room.getLastActiveTimestamp(); - if (newTs > ts) { - ts = newTs; - roomId = childId; - } - }); - return roomId; - } - - _getLatestSelectedRoomId(spaceIds) { - let ts = 0; - let roomId = null; - - spaceIds.forEach((sId) => { - const data = this.spaceToRoom.get(sId); - if (!data) return; - const newTs = data.timestamp; - if (newTs > ts) { - ts = newTs; - roomId = data.roomId; - } - }); - return roomId; - } - - _selectTab(tabId, selectRoom = true) { - this.selectedTab = tabId; - if (selectRoom) this._selectRoomWithTab(this.selectedTab); - this.emit(cons.events.navigation.TAB_SELECTED, this.selectedTab); - } - - _selectSpace(roomId, asRoot, selectRoom = true) { - this._addToSpacePath(roomId, asRoot); - this.selectedSpaceId = roomId; - if (!asRoot && selectRoom) this._selectRoomWithSpace(this.selectedSpaceId); - this.emit(cons.events.navigation.SPACE_SELECTED, this.selectedSpaceId); - } - - _selectRoomWithSpace(spaceId) { - if (!spaceId) return; - const { roomList, accountData, matrixClient } = this.initMatrix; - const { categorizedSpaces } = accountData; - - const data = this.spaceToRoom.get(spaceId); - if (data && !categorizedSpaces.has(spaceId)) { - this._selectRoom(data.roomId); - return; - } - - const children = []; - - if (categorizedSpaces.has(spaceId)) { - const categories = roomList.getCategorizedSpaces([spaceId]); - - const latestSelectedRoom = this._getLatestSelectedRoomId([...categories.keys()]); - - if (latestSelectedRoom) { - this._selectRoom(latestSelectedRoom); - return; - } - - categories?.forEach((categoryId) => { - categoryId?.forEach((childId) => { - children.push(childId); - }); - }); - } else { - roomList.getSpaceChildren(spaceId).forEach((id) => { - if (matrixClient.getRoom(id)?.isSpaceRoom() === false) { - children.push(id); - } - }); - } - - if (!children) { - this._selectRoom(null); - return; - } - - this._selectRoom(this._getLatestActiveRoomId(children)); - } - - _selectRoomWithTab(tabId) { - const { roomList } = this.initMatrix; - if (tabId === cons.tabs.HOME || tabId === cons.tabs.DIRECTS) { - const data = this.spaceToRoom.get(tabId); - if (data) { - this._selectRoom(data.roomId); - return; - } - const children = tabId === cons.tabs.HOME ? roomList.getOrphanRooms() : [...roomList.directs]; - this._selectRoom(this._getLatestActiveRoomId(children)); - return; - } - this._selectRoomWithSpace(tabId); - } - - removeRecentRoom(roomId) { - if (typeof roomId !== 'string') return; - const roomIdIndex = this.recentRooms.indexOf(roomId); - if (roomIdIndex >= 0) { - this.recentRooms.splice(roomIdIndex, 1); - } - } - - addRecentRoom(roomId) { - if (typeof roomId !== 'string') return; - - this.recentRooms.push(roomId); - if (this.recentRooms.length > 10) { - this.recentRooms.splice(0, 1); - } - } - get isRawModalVisible() { return this.rawModelStack.length > 0; } @@ -278,27 +19,9 @@ class Navigation extends EventEmitter { navigate(action) { const actions = { - [cons.actions.navigation.SELECT_TAB]: () => { - const roomId = ( - action.tabId !== cons.tabs.HOME && action.tabId !== cons.tabs.DIRECTS - ) ? action.tabId : null; - - this._selectSpace(roomId, true); - this._selectTab(action.tabId); - }, - [cons.actions.navigation.SELECT_SPACE]: () => { - this._selectSpace(action.roomId, false); - }, - [cons.actions.navigation.SELECT_ROOM]: () => { - if (action.roomId) this._selectTabWithRoom(action.roomId); - this._selectRoom(action.roomId, action.eventId); - }, [cons.actions.navigation.OPEN_SPACE_SETTINGS]: () => { this.emit(cons.events.navigation.SPACE_SETTINGS_OPENED, action.roomId, action.tabText); }, - [cons.actions.navigation.OPEN_SPACE_MANAGE]: () => { - this.emit(cons.events.navigation.SPACE_MANAGE_OPENED, action.roomId); - }, [cons.actions.navigation.OPEN_SPACE_ADDEXISTING]: () => { this.emit(cons.events.navigation.SPACE_ADDEXISTING_OPENED, action.roomId, action.spaces); }, @@ -309,15 +32,6 @@ class Navigation extends EventEmitter { action.tabText ); }, - [cons.actions.navigation.OPEN_SHORTCUT_SPACES]: () => { - this.emit(cons.events.navigation.SHORTCUT_SPACES_OPENED); - }, - [cons.actions.navigation.OPEN_INVITE_LIST]: () => { - this.emit(cons.events.navigation.INVITE_LIST_OPENED); - }, - [cons.actions.navigation.OPEN_PUBLIC_ROOMS]: () => { - this.emit(cons.events.navigation.PUBLIC_ROOMS_OPENED, action.searchTerm); - }, [cons.actions.navigation.OPEN_CREATE_ROOM]: () => { this.emit( cons.events.navigation.CREATE_ROOM_OPENED, @@ -340,38 +54,6 @@ class Navigation extends EventEmitter { [cons.actions.navigation.OPEN_SETTINGS]: () => { this.emit(cons.events.navigation.SETTINGS_OPENED, action.tabText); }, - [cons.actions.navigation.OPEN_NAVIGATION]: () => { - this.emit(cons.events.navigation.NAVIGATION_OPENED); - }, - [cons.actions.navigation.OPEN_EMOJIBOARD]: () => { - this.emit( - cons.events.navigation.EMOJIBOARD_OPENED, - action.cords, - action.requestEmojiCallback, - ); - }, - [cons.actions.navigation.OPEN_READRECEIPTS]: () => { - this.emit( - cons.events.navigation.READRECEIPTS_OPENED, - action.roomId, - action.userIds, - ); - }, - [cons.actions.navigation.OPEN_VIEWSOURCE]: () => { - this.emit( - cons.events.navigation.VIEWSOURCE_OPENED, - action.event, - ); - }, - [cons.actions.navigation.CLICK_REPLY_TO]: () => { - this.emit( - cons.events.navigation.REPLY_TO_CLICKED, - action.userId, - action.eventId, - action.body, - action.formattedBody, - ); - }, [cons.actions.navigation.OPEN_SEARCH]: () => { this.emit( cons.events.navigation.SEARCH_OPENED, diff --git a/src/util/Postie.js b/src/util/Postie.js deleted file mode 100644 index 73c8f9e8..00000000 --- a/src/util/Postie.js +++ /dev/null @@ -1,97 +0,0 @@ -class Postie { - constructor() { - this._topics = new Map(); - } - - _getSubscribers(topic) { - const subscribers = this._topics.get(topic); - if (subscribers === undefined) { - throw new Error(`Topic:"${topic}" doesn't exist.`); - } - return subscribers; - } - - _getInboxes(topic, address) { - const subscribers = this._getSubscribers(topic); - const inboxes = subscribers.get(address); - if (inboxes === undefined) { - throw new Error(`Inbox on topic:"${topic}" at address:"${address}" doesn't exist.`); - } - return inboxes; - } - - hasTopic(topic) { - return this._topics.get(topic) !== undefined; - } - - hasSubscriber(topic, address) { - const subscribers = this._getSubscribers(topic); - return subscribers.get(address) !== undefined; - } - - hasTopicAndSubscriber(topic, address) { - return (this.hasTopic(topic)) - ? this.hasSubscriber(topic, address) - : false; - } - - /** - * @param {string} topic - Subscription topic - * @param {string} address - Address of subscriber - * @param {function} inbox - The inbox function to receive post data - */ - subscribe(topic, address, inbox) { - if (typeof inbox !== 'function') { - throw new TypeError('Inbox must be a function.'); - } - - if (this._topics.has(topic) === false) { - this._topics.set(topic, new Map()); - } - const subscribers = this._topics.get(topic); - - const inboxes = subscribers.get(address) ?? new Set(); - inboxes.add(inbox); - subscribers.set(address, inboxes); - - return () => this.unsubscribe(topic, address, inbox); - } - - unsubscribe(topic, address, inbox) { - const subscribers = this._getSubscribers(topic); - if (!subscribers) throw new Error(`Unable to unsubscribe. Topic: "${topic}" doesn't exist.`); - - const inboxes = subscribers.get(address); - if (!inboxes) throw new Error(`Unable to unsubscribe. Subscriber on topic:"${topic}" at address:"${address}" doesn't exist`); - - if (!inboxes.delete(inbox)) throw new Error('Unable to unsubscribe. Inbox doesn\'t exist'); - - if (inboxes.size === 0) subscribers.delete(address); - if (subscribers.size === 0) this._topics.delete(topic); - } - - /** - * @param {string} topic - Subscription topic - * @param {string|string[]} address - Address of subscriber - * @param {*} data - Data to deliver to subscriber - */ - post(topic, address, data) { - const sendPost = (inboxes, addr) => { - if (inboxes === undefined) { - throw new Error(`Unable to post on topic:"${topic}" at address:"${addr}". Subscriber doesn't exist.`); - } - inboxes.forEach((inbox) => inbox(data)); - }; - - if (typeof address === 'string') { - sendPost(this._getInboxes(topic, address), address); - return; - } - const subscribers = this._getSubscribers(topic); - address.forEach((addr) => { - sendPost(subscribers.get(addr), addr); - }); - } -} - -export default Postie; diff --git a/src/util/colorMXID.js b/src/util/colorMXID.js index 4d303aae..95600d29 100644 --- a/src/util/colorMXID.js +++ b/src/util/colorMXID.js @@ -1,6 +1,6 @@ // https://github.com/cloudrac3r/cadencegq/blob/master/pug/mxid.pug -export function hashCode(str) { +function hashCode(str) { let hash = 0; let i; let chr; diff --git a/src/util/markdown.js b/src/util/markdown.js deleted file mode 100644 index c6c1a490..00000000 --- a/src/util/markdown.js +++ /dev/null @@ -1,515 +0,0 @@ -/* eslint-disable no-param-reassign */ -/* eslint-disable no-use-before-define */ -import SimpleMarkdown from '@khanacademy/simple-markdown'; -import { idRegex, parseIdUri } from './common'; - -const { - defaultRules, parserFor, outputFor, anyScopeRegex, blockRegex, inlineRegex, - sanitizeText, sanitizeUrl, -} = SimpleMarkdown; - -function htmlTag(tagName, content, attributes, isClosed) { - let s = ''; - Object.entries(attributes || {}).forEach(([k, v]) => { - if (v !== undefined) { - s += ` ${sanitizeText(k)}`; - if (v !== null) s += `="${sanitizeText(v)}"`; - } - }); - - s = `<${tagName}${s}>`; - - if (isClosed === false) { - return s; - } - return `${s}${content}`; -} - -function mathHtml(wrap, node) { - return htmlTag(wrap, htmlTag('code', sanitizeText(node.content)), { 'data-mx-maths': node.content }); -} - -const emojiRegex = /^:([\w-]+):/; - -const plainRules = { - Array: { - ...defaultRules.Array, - plain: defaultRules.Array.html, - }, - userMention: { - order: defaultRules.em.order - 0.9, - match: inlineRegex(idRegex('@', undefined, '^')), - parse: (capture, _, state) => ({ - type: 'mention', - content: state.userNames[capture[1]] ? `@${state.userNames[capture[1]]}` : capture[1], - id: capture[1], - }), - }, - roomMention: { - order: defaultRules.em.order - 0.8, - match: inlineRegex(idRegex('#', undefined, '^')), - parse: (capture) => ({ type: 'mention', content: capture[1], id: capture[1] }), - }, - mention: { - plain: (node, _, state) => (state.kind === 'edit' ? node.id : node.content), - html: (node) => htmlTag('a', sanitizeText(node.content), { - href: `https://matrix.to/#/${encodeURIComponent(node.id)}`, - }), - }, - emoji: { - order: defaultRules.em.order - 0.1, - match: (source, state) => { - if (!state.inline) return null; - const capture = emojiRegex.exec(source); - if (!capture) return null; - const emoji = state.emojis.get(capture[1]); - if (emoji) return capture; - return null; - }, - parse: (capture, _, state) => ({ content: capture[1], emoji: state.emojis.get(capture[1]) }), - plain: ({ emoji }) => (emoji.mxc - ? `:${emoji.shortcode}:` - : emoji.unicode), - html: ({ emoji }) => (emoji.mxc - ? htmlTag('img', null, { - 'data-mx-emoticon': null, - src: emoji.mxc, - alt: `:${emoji.shortcode}:`, - title: `:${emoji.shortcode}:`, - height: 32, - }, false) - : emoji.unicode), - }, - newline: { - ...defaultRules.newline, - plain: () => '\n', - }, - paragraph: { - ...defaultRules.paragraph, - plain: (node, output, state) => `${output(node.content, state)}\n\n`, - html: (node, output, state) => htmlTag('p', output(node.content, state)), - }, - escape: { - ...defaultRules.escape, - plain: (node, output, state) => `\\${output(node.content, state)}`, - }, - br: { - ...defaultRules.br, - match: anyScopeRegex(/^ *\n/), - plain: () => '\n', - }, - text: { - ...defaultRules.text, - match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]| *\n|\w+:\S|$)/), - plain: (node, _, state) => (state.kind === 'edit' - ? node.content.replace(/(\*|_|!\[|\[|\|\||\$\$?)/g, '\\$1') - : node.content), - }, -}; - -const markdownRules = { - ...defaultRules, - ...plainRules, - heading: { - ...defaultRules.heading, - match: blockRegex(/^ *(#{1,6})([^\n:]*?(?: [^\n]*?)?)#* *(?:\n *)*\n/), - plain: (node, output, state) => { - const out = output(node.content, state); - if (state.kind === 'edit' || state.kind === 'notification' || node.level > 2) { - return `${'#'.repeat(node.level)} ${out}\n\n`; - } - return `${out}\n${(node.level === 1 ? '=' : '-').repeat(out.length)}\n\n`; - }, - }, - hr: { - ...defaultRules.hr, - plain: () => '---\n\n', - }, - codeBlock: { - ...defaultRules.codeBlock, - plain: (node) => `\`\`\`${node.lang || ''}\n${node.content}\n\`\`\`\n`, - html: (node) => htmlTag('pre', htmlTag('code', sanitizeText(node.content), { - class: node.lang ? `language-${node.lang}` : undefined, - })), - }, - fence: { - ...defaultRules.fence, - match: blockRegex(/^ *(`{3,}|~{3,}) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)*\n/), - }, - blockQuote: { - ...defaultRules.blockQuote, - plain: (node, output, state) => `> ${output(node.content, state).trim().replace(/\n/g, '\n> ')}\n\n`, - }, - list: { - ...defaultRules.list, - plain: (node, output, state) => { - const oldList = state._list; - state._list = true; - - let items = node.items.map((item, i) => { - const prefix = node.ordered ? `${node.start + i}. ` : '* '; - return prefix + output(item, state).replace(/\n/g, `\n${' '.repeat(prefix.length)}`); - }).join('\n'); - - state._list = oldList; - - if (!state._list) { - items += '\n\n'; - } - return items; - }, - }, - def: undefined, - table: { - ...defaultRules.table, - plain: (node, output, state) => { - const header = node.header.map((content) => output(content, state)); - - const colWidth = node.align.map((align) => { - switch (align) { - case 'left': - case 'right': - return 2; - case 'center': - return 3; - default: - return 1; - } - }); - header.forEach((s, i) => { - if (s.length > colWidth[i])colWidth[i] = s.length; - }); - - const cells = node.cells.map((row) => row.map((content, i) => { - const s = output(content, state); - if (colWidth[i] === undefined || s.length > colWidth[i]) { - colWidth[i] = s.length; - } - return s; - })); - - function pad(s, i) { - switch (node.align[i]) { - case 'right': - return s.padStart(colWidth[i]); - case 'center': - return s - .padStart(s.length + Math.floor((colWidth[i] - s.length) / 2)) - .padEnd(colWidth[i]); - default: - return s.padEnd(colWidth[i]); - } - } - - const line = colWidth.map((len, i) => { - switch (node.align[i]) { - case 'left': - return `:${'-'.repeat(len - 1)}`; - case 'center': - return `:${'-'.repeat(len - 2)}:`; - case 'right': - return `${'-'.repeat(len - 1)}:`; - default: - return '-'.repeat(len); - } - }); - - const table = [ - header.map(pad), - line, - ...cells.map((row) => row.map(pad))]; - - return table.map((row) => `| ${row.join(' | ')} |\n`).join(''); - }, - }, - displayMath: { - order: defaultRules.table.order + 0.1, - match: blockRegex(/^ *\$\$ *\n?([\s\S]+?)\n?\$\$ *(?:\n *)*\n/), - parse: (capture) => ({ content: capture[1] }), - plain: (node) => (node.content.includes('\n') - ? `$$\n${node.content}\n$$\n` - : `$$${node.content}$$\n`), - html: (node) => mathHtml('div', node), - }, - shrug: { - order: defaultRules.escape.order - 0.1, - match: inlineRegex(/^¯\\_\(ツ\)_\/¯/), - parse: (capture) => ({ type: 'text', content: capture[0] }), - }, - tableSeparator: { - ...defaultRules.tableSeparator, - plain: () => ' | ', - }, - link: { - ...defaultRules.link, - plain: (node, output, state) => { - const out = output(node.content, state); - const target = sanitizeUrl(node.target) || ''; - if (out !== target || node.title) { - return `[${out}](${target}${node.title ? ` "${node.title}"` : ''})`; - } - return out; - }, - html: (node, output, state) => { - const out = output(node.content, state); - const target = sanitizeUrl(node.target) || ''; - if (out !== target || node.title) { - return htmlTag('a', out, { - href: target, - title: node.title, - }); - } - return target; - }, - }, - image: { - ...defaultRules.image, - plain: (node) => `![${node.alt}](${sanitizeUrl(node.target) || ''}${node.title ? ` "${node.title}"` : ''})`, - html: (node) => htmlTag('img', '', { - src: sanitizeUrl(node.target) || '', - alt: node.alt, - title: node.title, - }, false), - }, - reflink: undefined, - refimage: undefined, - em: { - ...defaultRules.em, - plain: (node, output, state) => `_${output(node.content, state)}_`, - }, - strong: { - ...defaultRules.strong, - plain: (node, output, state) => `**${output(node.content, state)}**`, - }, - u: { - ...defaultRules.u, - plain: (node, output, state) => `__${output(node.content, state)}__`, - }, - del: { - ...defaultRules.del, - plain: (node, output, state) => `~~${output(node.content, state)}~~`, - }, - inlineCode: { - ...defaultRules.inlineCode, - match: inlineRegex(/^(`+)([^\n]*?[^`\n])\1(?!`)/), - plain: (node) => `\`${node.content}\``, - }, - spoiler: { - order: defaultRules.inlineCode.order + 0.1, - match: inlineRegex(/^\|\|([\s\S]+?)\|\|(?:\(([\s\S]+?)\))?/), - parse: (capture, parse, state) => ({ - content: parse(capture[1], state), - reason: capture[2], - }), - plain: (node, output, state) => { - const warning = `spoiler${node.reason ? `: ${node.reason}` : ''}`; - switch (state.kind) { - case 'edit': - return `||${output(node.content, state)}||${node.reason ? `(${node.reason})` : ''}`; - case 'notification': - return `<${warning}>`; - default: - return `[${warning}](${output(node.content, state)})`; - } - }, - html: (node, output, state) => htmlTag( - 'span', - output(node.content, state), - { 'data-mx-spoiler': node.reason || null }, - ), - }, - inlineMath: { - order: defaultRules.del.order + 0.2, - match: inlineRegex(/^\$(\S[\s\S]+?\S|\S)\$(?!\d)/), - parse: (capture) => ({ content: capture[1] }), - plain: (node) => `$${node.content}$`, - html: (node) => mathHtml('span', node), - }, -}; - -function mapElement(el) { - switch (el.tagName) { - case 'MX-REPLY': - return []; - - case 'P': - return [{ type: 'paragraph', content: mapChildren(el) }]; - case 'BR': - return [{ type: 'br' }]; - - case 'H1': - case 'H2': - case 'H3': - case 'H4': - case 'H5': - case 'H6': - return [{ type: 'heading', level: Number(el.tagName[1]), content: mapChildren(el) }]; - case 'HR': - return [{ type: 'hr' }]; - case 'PRE': { - let lang; - if (el.firstChild) { - Array.from(el.firstChild.classList).some((c) => { - const langPrefix = 'language-'; - if (c.startsWith(langPrefix)) { - lang = c.slice(langPrefix.length); - return true; - } - return false; - }); - } - return [{ type: 'codeBlock', lang, content: el.innerText }]; - } - case 'BLOCKQUOTE': - return [{ type: 'blockQuote', content: mapChildren(el) }]; - case 'UL': - return [{ type: 'list', items: Array.from(el.childNodes).map(mapNode) }]; - case 'OL': - return [{ - type: 'list', - ordered: true, - start: Number(el.getAttribute('start')), - items: Array.from(el.childNodes).map(mapNode), - }]; - case 'TABLE': { - const headerEl = Array.from(el.querySelector('thead > tr').childNodes); - const align = headerEl.map((childE) => childE.style['text-align']); - return [{ - type: 'table', - header: headerEl.map(mapChildren), - align, - cells: Array.from(el.querySelectorAll('tbody > tr')).map((rowEl) => Array.from(rowEl.childNodes).map((childEl, i) => { - if (align[i] === undefined) align[i] = childEl.style['text-align']; - return mapChildren(childEl); - })), - }]; - } - case 'A': { - const href = el.getAttribute('href'); - - const id = parseIdUri(href); - if (id) return [{ type: 'mention', content: el.innerText, id }]; - - return [{ - type: 'link', - target: el.getAttribute('href'), - title: el.getAttribute('title'), - content: mapChildren(el), - }]; - } - case 'IMG': { - const src = el.getAttribute('src'); - let title = el.getAttribute('title'); - if (el.hasAttribute('data-mx-emoticon')) { - if (title.length > 2 && title.startsWith(':') && title.endsWith(':')) { - title = title.slice(1, -1); - } - return [{ - type: 'emoji', - content: title, - emoji: { - mxc: src, - shortcode: title, - }, - }]; - } - - return [{ - type: 'image', - alt: el.getAttribute('alt'), - target: src, - title, - }]; - } - case 'EM': - case 'I': - return [{ type: 'em', content: mapChildren(el) }]; - case 'STRONG': - case 'B': - return [{ type: 'strong', content: mapChildren(el) }]; - case 'U': - return [{ type: 'u', content: mapChildren(el) }]; - case 'DEL': - case 'STRIKE': - return [{ type: 'del', content: mapChildren(el) }]; - case 'CODE': - return [{ type: 'inlineCode', content: el.innerText }]; - - case 'DIV': - if (el.hasAttribute('data-mx-maths')) { - return [{ type: 'displayMath', content: el.getAttribute('data-mx-maths') }]; - } - return mapChildren(el); - case 'SPAN': - if (el.hasAttribute('data-mx-spoiler')) { - return [{ type: 'spoiler', reason: el.getAttribute('data-mx-spoiler'), content: mapChildren(el) }]; - } - if (el.hasAttribute('data-mx-maths')) { - return [{ type: 'inlineMath', content: el.getAttribute('data-mx-maths') }]; - } - return mapChildren(el); - default: - return mapChildren(el); - } -} - -function mapNode(n) { - switch (n.nodeType) { - case Node.TEXT_NODE: - return [{ type: 'text', content: n.textContent }]; - case Node.ELEMENT_NODE: - return mapElement(n); - default: - return []; - } -} - -function mapChildren(n) { - return Array.from(n.childNodes).reduce((ast, childN) => { - ast.push(...mapNode(childN)); - return ast; - }, []); -} - -function render(content, state, plainOut, htmlOut) { - let c = content; - if (content.length === 1 && content[0].type === 'paragraph') { - c = c[0].content; - } - - const plainStr = plainOut(c, state).trim(); - if (state.onlyPlain) return { plain: plainStr }; - - const htmlStr = htmlOut(c, state); - - const plainHtml = htmlStr.replace(/
    /g, '\n').replace(/<\/p>

    /g, '\n\n').replace(/<\/?p>/g, ''); - const onlyPlain = sanitizeText(plainStr) === plainHtml; - - return { - onlyPlain, - plain: plainStr, - html: htmlStr, - }; -} - -const plainParser = parserFor(plainRules); -const plainPlainOut = outputFor(plainRules, 'plain'); -const plainHtmlOut = outputFor(plainRules, 'html'); - -const mdParser = parserFor(markdownRules); -const mdPlainOut = outputFor(markdownRules, 'plain'); -const mdHtmlOut = outputFor(markdownRules, 'html'); - -export function plain(source, state) { - return render(plainParser(source, state), state, plainPlainOut, plainHtmlOut); -} - -export function markdown(source, state) { - return render(mdParser(source, state), state, mdPlainOut, mdHtmlOut); -} - -export function html(source, state) { - const el = document.createElement('template'); - el.innerHTML = source; - return render(mapChildren(el.content), state, mdPlainOut, mdHtmlOut); -} diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index a776fb2b..74e56ec7 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -89,20 +89,6 @@ export function trimHTMLReply(html) { return html.slice(i + suffix.length); } -export function hasDMWith(userId) { - const mx = initMatrix.matrixClient; - const directIds = [...initMatrix.roomList.directs]; - - return directIds.find((roomId) => { - const dRoom = mx.getRoom(roomId); - const roomMembers = dRoom.getMembers(); - if (roomMembers.length <= 2 && dRoom.getMember(userId)) { - return true; - } - return false; - }); -} - export function joinRuleToIconSrc(joinRule, isSpace) { return ({ restricted: () => (isSpace ? SpaceIC : HashIC), diff --git a/src/util/mimetypes.js b/src/util/mimetypes.js deleted file mode 100644 index bf7efbce..00000000 --- a/src/util/mimetypes.js +++ /dev/null @@ -1,39 +0,0 @@ -// https://github.com/matrix-org/matrix-react-sdk/blob/cd15e08fc285da42134817cce50de8011809cd53/src/utils/blobs.ts -export const ALLOWED_BLOB_MIMETYPES = [ - 'image/jpeg', - 'image/gif', - 'image/png', - 'image/apng', - 'image/webp', - 'image/avif', - - 'video/mp4', - 'video/webm', - 'video/ogg', - 'video/quicktime', - - 'audio/mp4', - 'audio/webm', - 'audio/aac', - 'audio/mpeg', - 'audio/ogg', - 'audio/wave', - 'audio/wav', - 'audio/x-wav', - 'audio/x-pn-wav', - 'audio/flac', - 'audio/x-flac', -]; - -export function getBlobSafeMimeType(mimetype) { - if (typeof mimetype !== 'string') return 'application/octet-stream'; - const [type] = mimetype.split(';'); - if (!ALLOWED_BLOB_MIMETYPES.includes(type)) { - return 'application/octet-stream'; - } - // Required for Chromium browsers - if (type === 'video/quicktime') { - return 'video/mp4'; - } - return type; -} diff --git a/src/util/sanitize.js b/src/util/sanitize.js deleted file mode 100644 index 3723a11b..00000000 --- a/src/util/sanitize.js +++ /dev/null @@ -1,140 +0,0 @@ -import sanitizeHtml from 'sanitize-html'; - -const MAX_TAG_NESTING = 100; -let mx = null; - -const permittedHtmlTags = [ - 'font', 'del', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'blockquote', 'p', 'a', 'ul', 'ol', 'sup', 'sub', - 'li', 'b', 'i', 'u', 'strong', 'em', 'strike', 's', 'code', - 'hr', 'br', 'div', 'table', 'thead', 'tbody', 'tr', 'th', - 'td', 'caption', 'pre', 'span', 'img', 'details', 'summary', -]; - -const urlSchemes = ['https', 'http', 'ftp', 'mailto', 'magnet']; - -const permittedTagToAttributes = { - font: ['style', 'data-mx-bg-color', 'data-mx-color', 'color'], - span: ['style', 'data-mx-bg-color', 'data-mx-color', 'data-mx-spoiler', 'data-mx-maths', 'data-mx-pill', 'data-mx-ping'], - div: ['data-mx-maths'], - a: ['name', 'target', 'href', 'rel'], - img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], - ol: ['start'], - code: ['class'], -}; - -function transformFontTag(tagName, attribs) { - return { - tagName, - attribs: { - ...attribs, - style: `background-color: ${attribs['data-mx-bg-color']}; color: ${attribs['data-mx-color']}`, - }, - }; -} - -function transformSpanTag(tagName, attribs) { - return { - tagName, - attribs: { - ...attribs, - style: `background-color: ${attribs['data-mx-bg-color']}; color: ${attribs['data-mx-color']}`, - }, - }; -} - -function transformATag(tagName, attribs) { - const userLink = decodeURIComponent(attribs.href).match(/^https?:\/\/matrix.to\/#\/(@.+:.+)/); - if (userLink !== null) { - // convert user link to pill - const userId = userLink[1]; - const pill = { - tagName: 'span', - attribs: { - 'data-mx-pill': userId, - }, - }; - if (userId === mx?.getUserId()) { - pill.attribs['data-mx-ping'] = undefined; - } - return pill; - } - - const rex = /[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}]/ug; - const newHref = attribs.href.replace(rex, (match) => `[e-${match.codePointAt(0).toString(16)}]`); - - return { - tagName, - attribs: { - ...attribs, - href: newHref, - rel: 'noopener', - target: '_blank', - }, - }; -} - -function transformImgTag(tagName, attribs) { - const { src } = attribs; - if (src.startsWith('mxc://') === false) { - return { - tagName: 'a', - attribs: { - href: src, - rel: 'noopener', - target: '_blank', - }, - text: attribs.alt || src, - }; - } - return { - tagName, - attribs: { - ...attribs, - src: mx?.mxcUrlToHttp(src), - }, - }; -} - -export function sanitizeCustomHtml(matrixClient, body) { - mx = matrixClient; - return sanitizeHtml(body, { - allowedTags: permittedHtmlTags, - allowedAttributes: permittedTagToAttributes, - disallowedTagsMode: 'discard', - allowedSchemes: urlSchemes, - allowedSchemesByTag: { - a: urlSchemes, - }, - allowedSchemesAppliedToAttributes: ['href'], - allowProtocolRelative: false, - allowedClasses: { - code: ['language-*'], - }, - allowedStyles: { - '*': { - color: [/^#(?:[0-9a-fA-F]{3}){1,2}$/], - 'background-color': [/^#(?:[0-9a-fA-F]{3}){1,2}$/], - }, - }, - transformTags: { - font: transformFontTag, - span: transformSpanTag, - a: transformATag, - img: transformImgTag, - }, - nonTextTags: ['style', 'script', 'textarea', 'option', 'noscript', 'mx-reply'], - nestingLimit: MAX_TAG_NESTING, - }); -} - -export function sanitizeText(body) { - const tagsToReplace = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - }; - return body.replace(/[&<>'"]/g, (tag) => tagsToReplace[tag] || tag); -} diff --git a/src/util/twemojify.jsx b/src/util/twemojify.jsx deleted file mode 100644 index ad203a91..00000000 --- a/src/util/twemojify.jsx +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import linkifyHtml from 'linkify-html'; -import parse from 'html-react-parser'; -import { sanitizeText } from './sanitize'; - -export const TWEMOJI_BASE_URL = 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/'; - -/** - * @param {string} text - text to twemojify - * @param {object|undefined} opts - DEPRECATED - options for tweomoji.parse - * @param {boolean} [linkify=false] - convert links to html tags (default: false) - * @param {boolean} [sanitize=true] - sanitize html text (default: true) - * @param {boolean} [maths=false] - DEPRECATED - render maths (default: false) - * @returns React component - */ -export function twemojify(text, opts, linkify = false, sanitize = true) { - if (typeof text !== 'string') return text; - let content = text; - - if (sanitize) { - content = sanitizeText(content); - } - - if (linkify) { - content = linkifyHtml(content, { - target: '_blank', - rel: 'noreferrer noopener', - }); - } - return parse(content); -} From e058a9ae6cf3980617c635467db728b7f78ddaa7 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:20:33 +0530 Subject: [PATCH 575/824] fix notification, favicon and sound (#1802) --- src/app/pages/client/ClientNonUIFeatures.tsx | 26 ++++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 27d1ae40..947764ca 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -6,6 +6,8 @@ import { roomToUnreadAtom, unreadEqual, unreadInfoToUnread } from '../../state/r import LogoSVG from '../../../../public/res/svg/cinny.svg'; import LogoUnreadSVG from '../../../../public/res/svg/cinny-unread.svg'; import LogoHighlightSVG from '../../../../public/res/svg/cinny-highlight.svg'; +import NotificationSound from '../../../../public/sound/notification.ogg'; +import InviteSound from '../../../../public/sound/invite.ogg'; import { setFavicon } from '../../utils/dom'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; @@ -28,14 +30,21 @@ function FaviconUpdater() { const roomToUnread = useAtomValue(roomToUnreadAtom); useEffect(() => { - if (roomToUnread.size === 0) { - setFavicon(LogoSVG); - } else { - const highlight = Array.from(roomToUnread.entries()).find( - ([, unread]) => unread.highlight > 0 - ); + let notification = false; + let highlight = false; + roomToUnread.forEach((unread) => { + if (unread.total > 0) { + notification = true; + } + if (unread.highlight > 0) { + highlight = true; + } + }); + if (notification) { setFavicon(highlight ? LogoHighlightSVG : LogoUnreadSVG); + } else { + setFavicon(LogoSVG); } }, [roomToUnread]); @@ -88,7 +97,7 @@ function InviteNotifications() { return ( // eslint-disable-next-line jsx-a11y/media-has-caption ); } @@ -168,6 +177,7 @@ function MessageNotifications() { const cachedUnreadInfo = unreadCacheRef.current.get(room.roomId); unreadCacheRef.current.set(room.roomId, unreadInfo); + if (unreadInfo.total === 0) return; if ( cachedUnreadInfo && unreadEqual(unreadInfoToUnread(cachedUnreadInfo), unreadInfoToUnread(unreadInfo)) @@ -210,7 +220,7 @@ function MessageNotifications() { return ( // eslint-disable-next-line jsx-a11y/media-has-caption ); } From 7c795b800d8ae9cd6892ee61cfdf95c955ce0cb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:23:18 +1000 Subject: [PATCH 576/824] Bump softprops/action-gh-release from 2.0.5 to 2.0.6 (#1785) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.5 to 2.0.6. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/69320dbe05506a9a39fc8ae11030b214ec2d1f87...a74c6b72af54cfa997e81df42d94703d6313a2d0) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 227b96c7..46766e96 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -52,7 +52,7 @@ jobs: gpg --export | xxd -p echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release - uses: softprops/action-gh-release@69320dbe05506a9a39fc8ae11030b214ec2d1f87 + uses: softprops/action-gh-release@a74c6b72af54cfa997e81df42d94703d6313a2d0 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz From 9db81d191380fe3a5bc88ef62a3b9235c0b462c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:23:56 +1000 Subject: [PATCH 577/824] Bump actions/upload-artifact from 4.3.3 to 4.3.4 (#1797) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.3 to 4.3.4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4.3.3...v4.3.4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 95a9e8ef..fd8741a2 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -25,7 +25,7 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Upload artifact - uses: actions/upload-artifact@v4.3.3 + uses: actions/upload-artifact@v4.3.4 with: name: preview path: dist @@ -33,7 +33,7 @@ jobs: - name: Save pr number run: echo ${PR_NUMBER} > ./pr.txt - name: Upload pr number - uses: actions/upload-artifact@v4.3.3 + uses: actions/upload-artifact@v4.3.4 with: name: pr path: ./pr.txt From f1668999a5af86f7705b76c13414127d968acc7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:24:56 +1000 Subject: [PATCH 578/824] Bump docker/setup-qemu-action from 3.0.0 to 3.1.0 (#1798) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v3.0.0...v3.1.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 46766e96..3dfa240b 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 + uses: docker/setup-qemu-action@v3.1.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.3.0 - name: Login to Docker Hub From 65ad07087831d17f2d7117da833ca49a41f601df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:25:38 +1000 Subject: [PATCH 579/824] Bump docker/build-push-action from 6.0.0 to 6.3.0 (#1799) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.0.0 to 6.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.0.0...v6.3.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index a45917ba..d47d2c2f 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Build Docker image - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.3.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 3dfa240b..b1aeee74 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.3.0 with: context: . platforms: linux/amd64,linux/arm64 From fc2b5744f4f079a6d3fb3dc5f2c7a31b153a657b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:36:45 +1000 Subject: [PATCH 580/824] Bump react-error-boundary from 4.0.10 to 4.0.13 (#1664) Bumps [react-error-boundary](https://github.com/bvaughn/react-error-boundary) from 4.0.10 to 4.0.13. - [Release notes](https://github.com/bvaughn/react-error-boundary/releases) - [Commits](https://github.com/bvaughn/react-error-boundary/compare/4.0.10...4.0.13) --- updated-dependencies: - dependency-name: react-error-boundary dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab70f0fb..7174ee7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", "react-dom": "18.2.0", - "react-error-boundary": "4.0.10", + "react-error-boundary": "4.0.13", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "react-range": "1.8.14", @@ -7678,9 +7678,9 @@ } }, "node_modules/react-error-boundary": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.10.tgz", - "integrity": "sha512-pvVKdi77j2OoPHo+p3rorgE43OjDWiqFkaqkJz8sJKK6uf/u8xtzuaVfj5qJ2JnDLIgF1De3zY5AJDijp+LVPA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", "dependencies": { "@babel/runtime": "^7.12.5" }, diff --git a/package.json b/package.json index a4bf6f34..6e573c99 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "react-autosize-textarea": "7.1.0", "react-blurhash": "0.2.0", "react-dom": "18.2.0", - "react-error-boundary": "4.0.10", + "react-error-boundary": "4.0.13", "react-google-recaptcha": "2.1.0", "react-modal": "3.16.1", "react-range": "1.8.14", From 4b461f87ff9a84a6a09628b71b52a1d7a855547d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:40:46 +1000 Subject: [PATCH 581/824] Bump linkifyjs from 4.0.2 to 4.1.3 (#1672) Bumps [linkifyjs](https://github.com/Hypercontext/linkifyjs/tree/HEAD/packages/linkifyjs) from 4.0.2 to 4.1.3. - [Release notes](https://github.com/Hypercontext/linkifyjs/releases) - [Changelog](https://github.com/Hypercontext/linkifyjs/blob/main/CHANGELOG.md) - [Commits](https://github.com/Hypercontext/linkifyjs/commits/v4.1.3/packages/linkifyjs) --- updated-dependencies: - dependency-name: linkifyjs dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7174ee7a..b38a3b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "is-hotkey": "0.2.0", "jotai": "2.6.0", "linkify-react": "4.1.1", - "linkifyjs": "4.0.2", + "linkifyjs": "4.1.3", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", @@ -6771,9 +6771,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", - "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==" }, "node_modules/locate-path": { "version": "6.0.0", diff --git a/package.json b/package.json index 6e573c99..54fb35b8 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "is-hotkey": "0.2.0", "jotai": "2.6.0", "linkify-react": "4.1.1", - "linkifyjs": "4.0.2", + "linkifyjs": "4.1.3", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", From 66478143dff36b10e8d236dd07c9507a2a7a7056 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:43:53 +1000 Subject: [PATCH 582/824] Bump linkify-react from 4.1.1 to 4.1.3 (#1742) updated-dependencies: - dependency-name: linkify-react dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b38a3b02..a0075c55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "linkify-react": "4.1.1", + "linkify-react": "4.1.3", "linkifyjs": "4.1.3", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", @@ -6762,9 +6762,9 @@ } }, "node_modules/linkify-react": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.1.tgz", - "integrity": "sha512-2K9Y1cUdvq40dFWqCJ//X+WP19nlzIVITFGI93RjLnA0M7KbnxQ/ffC3AZIZaEIrLangF9Hjt3i0GQ9/anEG5A==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.3.tgz", + "integrity": "sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==", "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" diff --git a/package.json b/package.json index 54fb35b8..9670b912 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", - "linkify-react": "4.1.1", + "linkify-react": "4.1.3", "linkifyjs": "4.1.3", "matrix-js-sdk": "29.1.0", "millify": "6.1.0", From e854b883940e07bf343d59a4c30cfd8a6f3e2e0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:49:06 +1000 Subject: [PATCH 583/824] Bump formik from 2.2.9 to 2.4.6 (#1715) Bumps [formik](https://github.com/jaredpalmer/formik) from 2.2.9 to 2.4.6. - [Release notes](https://github.com/jaredpalmer/formik/releases) - [Commits](https://github.com/jaredpalmer/formik/compare/formik@2.2.9...formik@2.4.6) --- updated-dependencies: - dependency-name: formik dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 35 ++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index a0075c55..e3701207 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "flux": "4.0.3", "focus-trap-react": "10.0.2", "folds": "2.0.0", - "formik": "2.2.9", + "formik": "2.4.6", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", @@ -3237,6 +3237,15 @@ "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", "dev": true }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/is-hotkey": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.7.tgz", @@ -3274,14 +3283,12 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { "version": "18.2.39", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3323,8 +3330,7 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -5727,9 +5733,9 @@ } }, "node_modules/formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz", + "integrity": "sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g==", "funding": [ { "type": "individual", @@ -5737,18 +5743,24 @@ } ], "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", "deepmerge": "^2.1.1", "hoist-non-react-statics": "^3.3.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" + "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, + "node_modules/formik/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -8548,7 +8560,8 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/tsutils": { "version": "3.21.0", diff --git a/package.json b/package.json index 9670b912..607cbcf7 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "flux": "4.0.3", "focus-trap-react": "10.0.2", "folds": "2.0.0", - "formik": "2.2.9", + "formik": "2.4.6", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", "immer": "9.0.16", From 653ddd9f11ab8286549855ca71001f7b8440754d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:44:28 +0530 Subject: [PATCH 584/824] fix space lobby button shrink --- src/app/features/lobby/SpaceItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/lobby/SpaceItem.tsx b/src/app/features/lobby/SpaceItem.tsx index 4924f45b..e9d9356a 100644 --- a/src/app/features/lobby/SpaceItem.tsx +++ b/src/app/features/lobby/SpaceItem.tsx @@ -479,7 +479,7 @@ export const SpaceItemCard = as<'div', SpaceItemCardProps>( )} {canEditChild && ( - + {item.parentId === undefined && } From c52c4f7d32e1c23fe9c93a2e8e8ebcef78c0bcd9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 14 Jul 2024 19:51:19 +0530 Subject: [PATCH 585/824] fix crash when adding existing room to space (#1806) --- .../molecules/space-add-existing/SpaceAddExisting.jsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index 3895ac75..2eb94a5c 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -26,6 +26,7 @@ import { useStore } from '../../hooks/useStore'; import { roomToParentsAtom } from '../../state/room/roomToParents'; import { useDirects, useRooms, useSpaces } from '../../state/hooks/roomList'; import { allRoomsAtom } from '../../state/room-list/roomList'; +import { mDirectAtom } from '../../state/mDirectList'; function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const mountStore = useStore(roomId); @@ -36,9 +37,10 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const [searchIds, setSearchIds] = useState(null); const mx = initMatrix.matrixClient; const roomIdToParents = useAtomValue(roomToParentsAtom); + const mDirects = useAtomValue(mDirectAtom); const spaces = useSpaces(mx, allRoomsAtom); - const rooms = useRooms(mx, allRoomsAtom); - const directs = useDirects(mx, allRoomsAtom); + const rooms = useRooms(mx, allRoomsAtom, mDirects); + const directs = useDirects(mx, allRoomsAtom, mDirects); useEffect(() => { const roomIds = onlySpaces ? [...spaces] : [...rooms, ...directs]; @@ -152,9 +154,9 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { name={room.name} parentName={parents} roomId={rId} - imageSrc={directs.has(rId) ? imageSrc : null} + imageSrc={mDirects.has(rId) ? imageSrc : null} iconSrc={ - directs.has(rId) ? null : joinRuleToIconSrc(room.getJoinRule(), room.isSpaceRoom()) + mDirects.has(rId) ? null : joinRuleToIconSrc(room.getJoinRule(), room.isSpaceRoom()) } isUnread={false} notificationCount={0} From c4abe39375695bf0f643ec218fdd20e4e18f47bf Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:50:20 +0530 Subject: [PATCH 586/824] Make hotkeys work again (#1819) --- src/app/components/Pdf-viewer/PdfViewer.tsx | 2 + src/app/components/UIAFlowOverlay.tsx | 3 +- src/app/components/editor/Editor.preview.tsx | 2 + src/app/components/editor/Toolbar.tsx | 2 + .../editor/autocomplete/AutocompleteMenu.tsx | 3 +- src/app/components/emoji-board/EmojiBoard.tsx | 3 +- .../leave-room-prompt/LeaveRoomPrompt.tsx | 2 + .../leave-space-prompt/LeaveSpacePrompt.tsx | 2 + .../message/content/FileContent.tsx | 3 + .../message/content/ImageContent.tsx | 2 + src/app/components/room-card/RoomCard.tsx | 4 +- src/app/features/lobby/HierarchyItemMenu.tsx | 2 + src/app/features/lobby/LobbyHeader.tsx | 2 + src/app/features/lobby/LobbyHero.tsx | 3 +- src/app/features/lobby/RoomItem.tsx | 3 +- src/app/features/lobby/SpaceItem.tsx | 3 + .../features/message-search/SearchFilters.tsx | 3 + src/app/features/room-nav/RoomNavItem.tsx | 2 + src/app/features/room/MembersDrawer.tsx | 3 + src/app/features/room/Room.tsx | 17 +++++- src/app/features/room/RoomView.tsx | 60 +++++++++++++++++-- src/app/features/room/RoomViewFollowing.tsx | 2 + src/app/features/room/RoomViewHeader.tsx | 3 + src/app/features/room/message/Message.tsx | 8 +++ src/app/features/room/message/Reactions.tsx | 2 + src/app/organisms/search/Search.jsx | 25 +++++++- src/app/pages/auth/ServerPicker.tsx | 2 + .../pages/auth/login/PasswordLoginForm.tsx | 2 + src/app/pages/client/ClientRoot.tsx | 2 - src/app/pages/client/direct/Direct.tsx | 2 + src/app/pages/client/explore/Explore.tsx | 2 + src/app/pages/client/explore/Server.tsx | 3 + src/app/pages/client/home/Home.tsx | 2 + src/app/pages/client/inbox/Invites.tsx | 3 +- src/app/pages/client/sidebar/DirectTab.tsx | 2 + src/app/pages/client/sidebar/HomeTab.tsx | 2 + src/app/pages/client/sidebar/SpaceTabs.tsx | 2 + src/app/pages/client/space/Space.tsx | 2 + src/app/utils/keyboard.ts | 5 ++ src/client/event/hotkeys.js | 24 -------- 40 files changed, 182 insertions(+), 39 deletions(-) delete mode 100644 src/client/event/hotkeys.js diff --git a/src/app/components/Pdf-viewer/PdfViewer.tsx b/src/app/components/Pdf-viewer/PdfViewer.tsx index a78c13f2..9c7fd980 100644 --- a/src/app/components/Pdf-viewer/PdfViewer.tsx +++ b/src/app/components/Pdf-viewer/PdfViewer.tsx @@ -26,6 +26,7 @@ import * as css from './PdfViewer.css'; import { AsyncStatus } from '../../hooks/useAsyncCallback'; import { useZoom } from '../../hooks/useZoom'; import { createPage, usePdfDocumentLoader, usePdfJSLoader } from '../../plugins/pdfjs-dist'; +import { stopPropagation } from '../../utils/keyboard'; export type PdfViewerProps = { name: string; @@ -201,6 +202,7 @@ export const PdfViewer = as<'div', PdfViewerProps>( initialFocus: false, onDeactivate: () => setJumpAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} >

    diff --git a/src/app/components/UIAFlowOverlay.tsx b/src/app/components/UIAFlowOverlay.tsx index f788eb0f..dc517b48 100644 --- a/src/app/components/UIAFlowOverlay.tsx +++ b/src/app/components/UIAFlowOverlay.tsx @@ -13,6 +13,7 @@ import { IconButton, } from 'folds'; import FocusTrap from 'focus-trap-react'; +import { stopPropagation } from '../utils/keyboard'; export type UIAFlowOverlayProps = { currentStep: number; @@ -28,7 +29,7 @@ export function UIAFlowOverlay({ }: UIAFlowOverlayProps) { return ( }> - + {children} diff --git a/src/app/components/editor/Editor.preview.tsx b/src/app/components/editor/Editor.preview.tsx index ad67dc12..b760dddc 100644 --- a/src/app/components/editor/Editor.preview.tsx +++ b/src/app/components/editor/Editor.preview.tsx @@ -14,6 +14,7 @@ import { import { CustomEditor, useEditor } from './Editor'; import { Toolbar } from './Toolbar'; +import { stopPropagation } from '../../utils/keyboard'; export function EditorPreview() { const [open, setOpen] = useState(false); @@ -32,6 +33,7 @@ export function EditorPreview() { initialFocus: false, onDeactivate: () => setOpen(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 0c82855d..e5c7d16e 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -35,6 +35,7 @@ import { isMacOS } from '../../utils/user-agent'; import { KeySymbol } from '../../utils/key-symbol'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; +import { stopPropagation } from '../../utils/keyboard'; function BtnTooltip({ text, shortCode }: { text: string; shortCode?: string }) { return ( @@ -151,6 +152,7 @@ export function HeadingBlockButton() { isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown' || evt.key === 'ArrowRight', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp' || evt.key === 'ArrowLeft', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx index fc4327da..5d2d917c 100644 --- a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx +++ b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx @@ -4,7 +4,7 @@ import { isKeyHotkey } from 'is-hotkey'; import { Header, Menu, Scroll, config } from 'folds'; import * as css from './AutocompleteMenu.css'; -import { preventScrollWithArrowKey } from '../../../utils/keyboard'; +import { preventScrollWithArrowKey, stopPropagation } from '../../../utils/keyboard'; type AutocompleteMenuProps = { requestClose: () => void; @@ -24,6 +24,7 @@ export function AutocompleteMenu({ headerContent, requestClose, children }: Auto allowOutsideClick: true, isKeyForward: (evt: KeyboardEvent) => isKeyHotkey('arrowdown', evt), isKeyBackward: (evt: KeyboardEvent) => isKeyHotkey('arrowup', evt), + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 408ce85d..53172efd 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -37,7 +37,7 @@ import * as css from './EmojiBoard.css'; import { EmojiGroupId, IEmoji, IEmojiGroup, emojiGroups, emojis } from '../../plugins/emoji'; import { IEmojiGroupLabels, useEmojiGroupLabels } from './useEmojiGroupLabels'; import { IEmojiGroupIcons, useEmojiGroupIcons } from './useEmojiGroupIcons'; -import { preventScrollWithArrowKey } from '../../utils/keyboard'; +import { preventScrollWithArrowKey, stopPropagation } from '../../utils/keyboard'; import { useRelevantImagePacks } from '../../hooks/useImagePacks'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRecentEmoji } from '../../hooks/useRecentEmoji'; @@ -775,6 +775,7 @@ export function EmojiBoard({ !editableActiveElement() && isKeyHotkey(['arrowdown', 'arrowright'], evt), isKeyBackward: (evt: KeyboardEvent) => !editableActiveElement() && isKeyHotkey(['arrowup', 'arrowleft'], evt), + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx index 1132b44d..8709b942 100644 --- a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx +++ b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx @@ -19,6 +19,7 @@ import { import { MatrixError } from 'matrix-js-sdk'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; +import { stopPropagation } from '../../utils/keyboard'; type LeaveSpacePromptProps = { roomId: string; @@ -52,6 +53,7 @@ export function LeaveSpacePrompt({ roomId, onDone, onCancel }: LeaveSpacePromptP initialFocus: false, onDeactivate: onCancel, clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/components/message/content/FileContent.tsx b/src/app/components/message/content/FileContent.tsx index af064a32..f09c1e07 100644 --- a/src/app/components/message/content/FileContent.tsx +++ b/src/app/components/message/content/FileContent.tsx @@ -29,6 +29,7 @@ import { mimeTypeToExt, } from '../../../utils/mimeTypes'; import * as css from './style.css'; +import { stopPropagation } from '../../../utils/keyboard'; const renderErrorButton = (retry: () => void, text: string) => ( setTextViewer(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > setPdfViewer(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > ( initialFocus: false, onDeactivate: () => setViewer(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -236,6 +237,7 @@ export const RoomCard = as<'div', RoomCardProps>( initialFocus: false, clickOutsideDeactivates: true, onDeactivate: closeTopic, + escapeDeactivates: stopPropagation, }} > {renderTopicViewer(roomName, roomTopic, closeTopic)} diff --git a/src/app/features/lobby/HierarchyItemMenu.tsx b/src/app/features/lobby/HierarchyItemMenu.tsx index 489bb9ba..30a4f632 100644 --- a/src/app/features/lobby/HierarchyItemMenu.tsx +++ b/src/app/features/lobby/HierarchyItemMenu.tsx @@ -27,6 +27,7 @@ import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { UseStateProvider } from '../../components/UseStateProvider'; import { LeaveSpacePrompt } from '../../components/leave-space-prompt'; import { LeaveRoomPrompt } from '../../components/leave-room-prompt'; +import { stopPropagation } from '../../utils/keyboard'; type HierarchyItemWithParent = HierarchyItem & { parentId: string; @@ -227,6 +228,7 @@ export function HierarchyItemMenu({ clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/lobby/LobbyHeader.tsx b/src/app/features/lobby/LobbyHeader.tsx index a23faada..e01d3ad5 100644 --- a/src/app/features/lobby/LobbyHeader.tsx +++ b/src/app/features/lobby/LobbyHeader.tsx @@ -30,6 +30,7 @@ import { openInviteUser, openSpaceSettings } from '../../../client/action/naviga import { IPowerLevels, usePowerLevelsAPI } from '../../hooks/usePowerLevels'; import { UseStateProvider } from '../../components/UseStateProvider'; import { LeaveSpacePrompt } from '../../components/leave-space-prompt'; +import { stopPropagation } from '../../utils/keyboard'; type LobbyMenuProps = { roomId: string; @@ -197,6 +198,7 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setViewTopic(false), + escapeDeactivates: stopPropagation, }} > setView(false), + escapeDeactivates: stopPropagation, }} > evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > @@ -338,6 +340,7 @@ function AddSpaceButton({ item }: { item: HierarchyItem }) { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/message-search/SearchFilters.tsx b/src/app/features/message-search/SearchFilters.tsx index 5de188d4..929dd1e9 100644 --- a/src/app/features/message-search/SearchFilters.tsx +++ b/src/app/features/message-search/SearchFilters.tsx @@ -38,6 +38,7 @@ import { } from '../../hooks/useAsyncSearch'; import { DebounceOptions, useDebounce } from '../../hooks/useDebounce'; import { VirtualTile } from '../../components/virtualizer'; +import { stopPropagation } from '../../utils/keyboard'; type OrderButtonProps = { order?: string; @@ -66,6 +67,7 @@ function OrderButton({ order, onChange }: OrderButtonProps) { initialFocus: false, onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -202,6 +204,7 @@ function SelectRoomButton({ roomList, selectedRooms, onChange }: SelectRoomButto initialFocus: false, onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index fce62375..8ecc81a3 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -36,6 +36,7 @@ import { LeaveRoomPrompt } from '../../components/leave-room-prompt'; import { useClientConfig } from '../../hooks/useClientConfig'; import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; import { TypingIndicator } from '../../components/typing-indicator'; +import { stopPropagation } from '../../utils/keyboard'; type RoomNavItemMenuProps = { room: Room; @@ -269,6 +270,7 @@ export function RoomNavItem({ clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > m.membership === Membership.Join, @@ -300,6 +301,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > @@ -358,6 +360,7 @@ export function MembersDrawer({ room }: MembersDrawerProps) { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx index 764e9686..fd578ec6 100644 --- a/src/app/features/room/Room.tsx +++ b/src/app/features/room/Room.tsx @@ -1,6 +1,7 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import { Box, Line } from 'folds'; import { useParams } from 'react-router-dom'; +import { isKeyHotkey } from 'is-hotkey'; import { RoomView } from './RoomView'; import { MembersDrawer } from './MembersDrawer'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; @@ -8,6 +9,8 @@ import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { PowerLevelsContextProvider, usePowerLevels } from '../../hooks/usePowerLevels'; import { useRoom } from '../../hooks/useRoom'; +import { useKeyDown } from '../../hooks/useKeyDown'; +import { markAsRead } from '../../../client/action/notifications'; export function Room() { const { eventId } = useParams(); @@ -17,6 +20,18 @@ export function Room() { const screenSize = useScreenSizeContext(); const powerLevels = usePowerLevels(room); + useKeyDown( + window, + useCallback( + (evt) => { + if (isKeyHotkey('escape', evt)) { + markAsRead(room.roomId); + } + }, + [room.roomId] + ) + ); + return ( diff --git a/src/app/features/room/RoomView.tsx b/src/app/features/room/RoomView.tsx index fe145b37..84162fcc 100644 --- a/src/app/features/room/RoomView.tsx +++ b/src/app/features/room/RoomView.tsx @@ -1,7 +1,8 @@ -import React, { useRef } from 'react'; +import React, { useCallback, useRef } from 'react'; import { Box, Text, config } from 'folds'; import { EventType, Room } from 'matrix-js-sdk'; - +import { ReactEditor } from 'slate-react'; +import { isKeyHotkey } from 'is-hotkey'; import { useStateEvent } from '../../hooks/useStateEvent'; import { StateEvent } from '../../../types/matrix/room'; import { usePowerLevelsAPI, usePowerLevelsContext } from '../../hooks/usePowerLevels'; @@ -15,10 +16,42 @@ import { RoomInput } from './RoomInput'; import { RoomViewFollowing } from './RoomViewFollowing'; import { Page } from '../../components/page'; import { RoomViewHeader } from './RoomViewHeader'; +import { useKeyDown } from '../../hooks/useKeyDown'; +import { editableActiveElement } from '../../utils/dom'; +import navigation from '../../../client/state/navigation'; + +const shouldFocusMessageField = (evt: KeyboardEvent): boolean => { + const { code } = evt; + console.log(code); + if (evt.metaKey || evt.altKey || evt.ctrlKey) { + return false; + } + // do not focus on F keys + if (/^F\d+$/.test(code)) return false; + + // do not focus on numlock/scroll lock + if ( + code.startsWith('OS') || + code.startsWith('Meta') || + code.startsWith('Shift') || + code.startsWith('Alt') || + code.startsWith('Control') || + code.startsWith('Arrow') || + code === 'Tab' || + code === 'Space' || + code === 'Enter' || + code === 'NumLock' || + code === 'ScrollLock' + ) { + return false; + } + + return true; +}; export function RoomView({ room, eventId }: { room: Room; eventId?: string }) { - const roomInputRef = useRef(null); - const roomViewRef = useRef(null); + const roomInputRef = useRef(null); + const roomViewRef = useRef(null); const { roomId } = room; const editor = useEditor(); @@ -33,6 +66,25 @@ export function RoomView({ room, eventId }: { room: Room; eventId?: string }) { ? canSendEvent(EventType.RoomMessage, getPowerLevel(myUserId)) : false; + useKeyDown( + window, + useCallback( + (evt) => { + if (editableActiveElement()) return; + if ( + document.body.lastElementChild?.className !== 'ReactModalPortal' || + navigation.isRawModalVisible + ) { + return; + } + if (shouldFocusMessageField(evt) || isKeyHotkey('mod+v')) { + ReactEditor.focus(editor); + } + }, + [editor] + ) + ); + return ( diff --git a/src/app/features/room/RoomViewFollowing.tsx b/src/app/features/room/RoomViewFollowing.tsx index 2f7a583e..58d3f64f 100644 --- a/src/app/features/room/RoomViewFollowing.tsx +++ b/src/app/features/room/RoomViewFollowing.tsx @@ -22,6 +22,7 @@ import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRoomLatestRenderedEvent } from '../../hooks/useRoomLatestRenderedEvent'; import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; import { EventReaders } from '../../components/event-readers'; +import { stopPropagation } from '../../utils/keyboard'; export type RoomViewFollowingProps = { room: Room; @@ -50,6 +51,7 @@ export const RoomViewFollowing = as<'div', RoomViewFollowingProps>( initialFocus: false, onDeactivate: () => setOpen(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index 61c730f7..aa267c53 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -57,6 +57,7 @@ import { useRoomAvatar, useRoomName, useRoomTopic } from '../../hooks/useRoomMet import { mDirectAtom } from '../../state/mDirectList'; import { useClientConfig } from '../../hooks/useClientConfig'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; +import { stopPropagation } from '../../utils/keyboard'; type RoomMenuProps = { room: Room; @@ -240,6 +241,7 @@ export function RoomViewHeader() { initialFocus: false, clickOutsideDeactivates: true, onDeactivate: () => setViewTopic(false), + escapeDeactivates: stopPropagation, }} > evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > void; @@ -148,6 +149,7 @@ export const MessageAllReactionItem = as< returnFocusOnDeactivate: false, onDeactivate: () => handleClose(), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -201,6 +203,7 @@ export const MessageReadReceiptItem = as< initialFocus: false, onDeactivate: handleClose, clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -278,6 +281,7 @@ export const MessageSourceCodeItem = as< initialFocus: false, onDeactivate: handleClose, clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -401,6 +405,7 @@ export const MessageDeleteItem = as< initialFocus: false, onDeactivate: handleClose, clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -530,6 +535,7 @@ export const MessageReportItem = as< initialFocus: false, onDeactivate: handleClose, clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -875,6 +881,7 @@ export const Message = as<'div', MessageProps>( clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > @@ -1089,6 +1096,7 @@ export const Event = as<'div', EventProps>( clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/features/room/message/Reactions.tsx b/src/app/features/room/message/Reactions.tsx index 728cf810..a6d7f553 100644 --- a/src/app/features/room/message/Reactions.tsx +++ b/src/app/features/room/message/Reactions.tsx @@ -21,6 +21,7 @@ import { Reaction, ReactionTooltipMsg } from '../../../components/message'; import { useRelations } from '../../../hooks/useRelations'; import * as css from './styles.css'; import { ReactionViewer } from '../reaction-viewer'; +import { stopPropagation } from '../../../utils/keyboard'; export type ReactionsProps = { room: Room; @@ -105,6 +106,7 @@ export const Reactions = as<'div', ReactionsProps>( returnFocusOnDeactivate: false, onDeactivate: () => setViewer(false), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index c9d1d991..0990a03f 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef } from 'react'; +import React, { useState, useEffect, useRef, useCallback } from 'react'; import { useAtomValue } from 'jotai'; import './Search.scss'; @@ -25,6 +25,8 @@ import { roomToUnreadAtom } from '../../state/room/roomToUnread'; import { roomToParentsAtom } from '../../state/room/roomToParents'; import { allRoomsAtom } from '../../state/room-list/roomList'; import { mDirectAtom } from '../../state/mDirectList'; +import { useKeyDown } from '../../hooks/useKeyDown'; +import { openSearch } from '../../../client/action/navigation'; function useVisiblityToggle(setResult) { const [isOpen, setIsOpen] = useState(false); @@ -49,6 +51,27 @@ function useVisiblityToggle(setResult) { } }, [isOpen]); + useKeyDown( + window, + useCallback((event) => { + // Ctrl/Cmd + + if (event.ctrlKey || event.metaKey) { + // open search modal + if (event.key === 'k') { + event.preventDefault(); + // means some menu or modal window is open + if ( + document.body.lastChild.className !== 'ReactModalPortal' || + navigation.isRawModalVisible + ) { + return; + } + openSearch(); + } + } + }, []) + ); + const requestClose = () => setIsOpen(false); return [isOpen, requestClose]; diff --git a/src/app/pages/auth/ServerPicker.tsx b/src/app/pages/auth/ServerPicker.tsx index 18201c98..a2a78106 100644 --- a/src/app/pages/auth/ServerPicker.tsx +++ b/src/app/pages/auth/ServerPicker.tsx @@ -22,6 +22,7 @@ import { import FocusTrap from 'focus-trap-react'; import { useDebounce } from '../../hooks/useDebounce'; +import { stopPropagation } from '../../utils/keyboard'; export function ServerPicker({ server, @@ -103,6 +104,7 @@ export function ServerPicker({ clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx index b9dd14b7..087d384d 100644 --- a/src/app/pages/auth/login/PasswordLoginForm.tsx +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -36,6 +36,7 @@ import { import { PasswordInput } from '../../../components/password-input/PasswordInput'; import { FieldError } from '../FiledError'; import { getResetPasswordPath } from '../../pathUtils'; +import { stopPropagation } from '../../../utils/keyboard'; function UsernameHint({ server }: { server: string }) { const [anchor, setAnchor] = useState(); @@ -54,6 +55,7 @@ function UsernameHint({ server }: { server: string }) { initialFocus: false, onDeactivate: () => setAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx index 6a1dbcb1..c36adfc6 100644 --- a/src/app/pages/client/ClientRoot.tsx +++ b/src/app/pages/client/ClientRoot.tsx @@ -1,7 +1,6 @@ import { Box, Spinner, Text } from 'folds'; import React, { ReactNode, useEffect, useState } from 'react'; import initMatrix from '../../../client/initMatrix'; -import { initHotkeys } from '../../../client/event/hotkeys'; import { getSecret } from '../../../client/state/auth'; import { SplashScreen } from '../../components/splash-screen'; import { CapabilitiesAndMediaConfigLoader } from '../../components/CapabilitiesAndMediaConfigLoader'; @@ -47,7 +46,6 @@ export function ClientRoot({ children }: ClientRootProps) { useEffect(() => { const handleStart = () => { - initHotkeys(); setLoading(false); }; initMatrix.once('init_loading_finished', handleStart); diff --git a/src/app/pages/client/direct/Direct.tsx b/src/app/pages/client/direct/Direct.tsx index 673a5d9f..c62ef160 100644 --- a/src/app/pages/client/direct/Direct.tsx +++ b/src/app/pages/client/direct/Direct.tsx @@ -44,6 +44,7 @@ import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; import { useRoomsUnread } from '../../../state/hooks/unread'; import { markAsRead } from '../../../../client/action/notifications'; +import { stopPropagation } from '../../../utils/keyboard'; type DirectMenuProps = { requestClose: () => void; @@ -118,6 +119,7 @@ function DirectHeader() { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> diff --git a/src/app/pages/client/explore/Explore.tsx b/src/app/pages/client/explore/Explore.tsx index 67f8dc3f..420e1a16 100644 --- a/src/app/pages/client/explore/Explore.tsx +++ b/src/app/pages/client/explore/Explore.tsx @@ -36,6 +36,7 @@ import { getMxIdServer } from '../../../utils/matrix'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; +import { stopPropagation } from '../../../utils/keyboard'; export function AddServer() { const mx = useMatrixClient(); @@ -80,6 +81,7 @@ export function AddServer() { initialFocus: false, clickOutsideDeactivates: true, onDeactivate: () => setDialog(false), + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/pages/client/explore/Server.tsx b/src/app/pages/client/explore/Server.tsx index 9fe4e78e..1a81c225 100644 --- a/src/app/pages/client/explore/Server.tsx +++ b/src/app/pages/client/explore/Server.tsx @@ -41,6 +41,7 @@ import * as css from './style.css'; import { allRoomsAtom } from '../../../state/room-list/roomList'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { getMxIdServer } from '../../../utils/matrix'; +import { stopPropagation } from '../../../utils/keyboard'; const useServerSearchParams = (searchParams: URLSearchParams): ExploreServerPathSearchParams => useMemo( @@ -182,6 +183,7 @@ function ThirdPartyProtocolsSelector({ initialFocus: false, onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > @@ -277,6 +279,7 @@ function LimitButton({ limit, onLimitChange }: LimitButtonProps) { initialFocus: false, onDeactivate: () => setMenuAnchor(undefined), clickOutsideDeactivates: true, + escapeDeactivates: stopPropagation, }} > diff --git a/src/app/pages/client/home/Home.tsx b/src/app/pages/client/home/Home.tsx index 33714191..76034cfe 100644 --- a/src/app/pages/client/home/Home.tsx +++ b/src/app/pages/client/home/Home.tsx @@ -47,6 +47,7 @@ import { PageNav, PageNavHeader, PageNavContent } from '../../../components/page import { useRoomsUnread } from '../../../state/hooks/unread'; import { markAsRead } from '../../../../client/action/notifications'; import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; +import { stopPropagation } from '../../../utils/keyboard'; type HomeMenuProps = { requestClose: () => void; @@ -121,6 +122,7 @@ function HomeHeader() { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx index 91dc0291..06e5f6c6 100644 --- a/src/app/pages/client/inbox/Invites.tsx +++ b/src/app/pages/client/inbox/Invites.tsx @@ -34,7 +34,7 @@ import { RoomAvatar } from '../../../components/room-avatar'; import { addRoomIdToMDirect, getMxIdLocalPart, guessDmRoomUserId } from '../../../utils/matrix'; import { Time } from '../../../components/message'; import { useElementSizeObserver } from '../../../hooks/useElementSizeObserver'; -import { onEnterOrSpace } from '../../../utils/keyboard'; +import { onEnterOrSpace, stopPropagation } from '../../../utils/keyboard'; import { RoomTopicViewer } from '../../../components/room-topic-viewer'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; @@ -140,6 +140,7 @@ function InviteCard({ room, userId, direct, compact, onNavigate }: InviteCardPro initialFocus: false, clickOutsideDeactivates: true, onDeactivate: closeTopic, + escapeDeactivates: stopPropagation, }} > void; @@ -120,6 +121,7 @@ export function DirectTab() { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> diff --git a/src/app/pages/client/sidebar/HomeTab.tsx b/src/app/pages/client/sidebar/HomeTab.tsx index 0b5135ca..41f7c648 100644 --- a/src/app/pages/client/sidebar/HomeTab.tsx +++ b/src/app/pages/client/sidebar/HomeTab.tsx @@ -23,6 +23,7 @@ import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; import { useHomeRooms } from '../home/useHomeRooms'; import { markAsRead } from '../../../../client/action/notifications'; +import { stopPropagation } from '../../../utils/keyboard'; type HomeMenuProps = { requestClose: () => void; @@ -122,6 +123,7 @@ export function HomeTab() { clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index 99c04965..8635a35f 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -90,6 +90,7 @@ import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; import { markAsRead } from '../../../../client/action/notifications'; import { copyToClipboard } from '../../../utils/dom'; import { openInviteUser, openSpaceSettings } from '../../../../client/action/navigation'; +import { stopPropagation } from '../../../utils/keyboard'; type SpaceMenuProps = { room: Room; @@ -463,6 +464,7 @@ function SpaceTab({ clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts index 8ec435d3..da3fe8cb 100644 --- a/src/app/utils/keyboard.ts +++ b/src/app/utils/keyboard.ts @@ -30,3 +30,8 @@ export const onEnterOrSpace = (callback: () => void) => (evt: KeyboardEventLike) callback(); } }; + +export const stopPropagation = (evt: KeyboardEvent): boolean => { + evt.stopPropagation(); + return true; +}; diff --git a/src/client/event/hotkeys.js b/src/client/event/hotkeys.js deleted file mode 100644 index 856fcadc..00000000 --- a/src/client/event/hotkeys.js +++ /dev/null @@ -1,24 +0,0 @@ -import { openSearch } from '../action/navigation'; -import navigation from '../state/navigation'; - -function listenKeyboard(event) { - // Ctrl/Cmd + - if (event.ctrlKey || event.metaKey) { - // open search modal - if (event.key === 'k') { - event.preventDefault(); - if (navigation.isRawModalVisible) return; - openSearch(); - } - } -} - -function initHotkeys() { - document.body.addEventListener('keydown', listenKeyboard); -} - -function removeHotkeys() { - document.body.removeEventListener('keydown', listenKeyboard); -} - -export { initHotkeys, removeHotkeys }; From a1a822c5b64eb4e31edbf9cbd4bd12f3926f084b Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:50:51 +0530 Subject: [PATCH 587/824] Fix selecting tombstone room opens replacement room (#1820) --- src/app/utils/matrix.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 55e16a95..278bb46b 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -14,6 +14,8 @@ import { } from 'matrix-js-sdk'; import { IImageInfo, IThumbnailContent, IVideoInfo } from '../../types/matrix/common'; import { AccountDataEvent } from '../../types/matrix/accountData'; +import { getStateEvent } from './room'; +import { StateEvent } from '../../types/matrix/room'; export const matchMxId = (id: string): RegExpMatchArray | null => id.match(/^([@!$+#])(\S+):(\S+)$/); @@ -42,8 +44,12 @@ export const parseMatrixToUrl = (url: string): [string | undefined, string | und export const getCanonicalAliasRoomId = (mx: MatrixClient, alias: string): string | undefined => mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias)?.roomId; -export const getCanonicalAliasOrRoomId = (mx: MatrixClient, roomId: string): string => - mx.getRoom(roomId)?.getCanonicalAlias() || roomId; +export const getCanonicalAliasOrRoomId = (mx: MatrixClient, roomId: string): string => { + const room = mx.getRoom(roomId); + if (!room) return roomId; + if (getStateEvent(room, StateEvent.RoomTombstone) !== undefined) return roomId; + return room.getCanonicalAlias() || roomId; +}; export const getImageInfo = (img: HTMLImageElement, fileOrBlob: File | Blob): IImageInfo => { const info: IImageInfo = {}; From c243b6104c7c9ca98ff0b5b8bfdf3c32a98f5818 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 21 Jul 2024 11:13:33 +0530 Subject: [PATCH 588/824] Update color theme to match with new design (#1821) * update silver theme * update unread badge style to look more slim * update nav item style to look less sharp * fix type focus message input typo * decrease navigation drawer width to bring main chat layout to little more center * increase sidebar width to make it less congested * fix sidebar item style * decrease dark theme contrast * improve dark theme * revert sidebar width change * add join with address option in home context menu * match legacy theme with latest themes --- src/app/atoms/button/Toggle.scss | 7 +- src/app/components/nav/NavItemContent.tsx | 2 +- src/app/components/nav/styles.css.ts | 3 +- src/app/components/page/style.css.ts | 2 +- .../components/unread-badge/UnreadBadge.tsx | 4 +- .../room-nav/RoomNavCategoryButton.tsx | 2 +- src/app/features/room/RoomView.tsx | 3 +- src/app/pages/client/home/Home.tsx | 15 ++ src/colors.css.ts | 162 +++++++++--------- src/index.scss | 142 +++++++++------ 10 files changed, 197 insertions(+), 145 deletions(-) diff --git a/src/app/atoms/button/Toggle.scss b/src/app/atoms/button/Toggle.scss index bc6d8a90..ef21f6cd 100644 --- a/src/app/atoms/button/Toggle.scss +++ b/src/app/atoms/button/Toggle.scss @@ -22,8 +22,7 @@ height: 16px; background-color: var(--tc-surface-low); border-radius: calc(var(--bo-radius) / 2); - transition: transform 200ms ease-in-out, - opacity 200ms ease-in-out; + transition: transform 200ms ease-in-out, opacity 200ms ease-in-out; opacity: 0.6; } @@ -36,8 +35,8 @@ @include dir.prop(transform, var(--ltr), var(--rtl)); transform: translateX(calc(125%)); - background-color: white; + background-color: var(--bg-surface); opacity: 1; } } -} \ No newline at end of file +} diff --git a/src/app/components/nav/NavItemContent.tsx b/src/app/components/nav/NavItemContent.tsx index dcd0edfd..d6a5d131 100644 --- a/src/app/components/nav/NavItemContent.tsx +++ b/src/app/components/nav/NavItemContent.tsx @@ -5,6 +5,6 @@ import * as css from './styles.css'; export const NavItemContent = as<'p', ComponentProps>( ({ className, ...props }, ref) => ( - + ) ); diff --git a/src/app/components/nav/styles.css.ts b/src/app/components/nav/styles.css.ts index 06710ddd..48b2a4d3 100644 --- a/src/app/components/nav/styles.css.ts +++ b/src/app/components/nav/styles.css.ts @@ -52,7 +52,7 @@ const NavItemBase = style({ backgroundColor: Container, color: OnContainer, outline: 'none', - minHeight: toRem(38), + minHeight: toRem(36), selectors: { '&:hover, &:focus-visible': { @@ -111,6 +111,7 @@ export const NavItemContent = style({ flexGrow: 1, display: 'flex', alignItems: 'center', + fontWeight: config.fontWeight.W500, selectors: { '&:hover': { diff --git a/src/app/components/page/style.css.ts b/src/app/components/page/style.css.ts index 559d3666..4807a227 100644 --- a/src/app/components/page/style.css.ts +++ b/src/app/components/page/style.css.ts @@ -2,7 +2,7 @@ import { style } from '@vanilla-extract/css'; import { DefaultReset, color, config, toRem } from 'folds'; export const PageNav = style({ - width: toRem(280), + width: toRem(256), }); export const PageNavHeader = style({ diff --git a/src/app/components/unread-badge/UnreadBadge.tsx b/src/app/components/unread-badge/UnreadBadge.tsx index f5dc09fe..f8bfefa3 100644 --- a/src/app/components/unread-badge/UnreadBadge.tsx +++ b/src/app/components/unread-badge/UnreadBadge.tsx @@ -22,9 +22,9 @@ export function UnreadBadge({ highlight, count }: UnreadBadgeProps) { 0 ? '400' : '200'} - fill={count > 0 ? 'Solid' : 'Soft'} + fill="Solid" radii="Pill" - outlined + outlined={false} > {count > 0 && ( diff --git a/src/app/features/room-nav/RoomNavCategoryButton.tsx b/src/app/features/room-nav/RoomNavCategoryButton.tsx index 7acbbe28..3af8aeac 100644 --- a/src/app/features/room-nav/RoomNavCategoryButton.tsx +++ b/src/app/features/room-nav/RoomNavCategoryButton.tsx @@ -19,7 +19,7 @@ export const RoomNavCategoryButton = as<'button', { closed?: boolean }>( {...props} ref={ref} > - + {children} diff --git a/src/app/features/room/RoomView.tsx b/src/app/features/room/RoomView.tsx index 84162fcc..3eabd528 100644 --- a/src/app/features/room/RoomView.tsx +++ b/src/app/features/room/RoomView.tsx @@ -22,7 +22,6 @@ import navigation from '../../../client/state/navigation'; const shouldFocusMessageField = (evt: KeyboardEvent): boolean => { const { code } = evt; - console.log(code); if (evt.metaKey || evt.altKey || evt.ctrlKey) { return false; } @@ -77,7 +76,7 @@ export function RoomView({ room, eventId }: { room: Room; eventId?: string }) { ) { return; } - if (shouldFocusMessageField(evt) || isKeyHotkey('mod+v')) { + if (shouldFocusMessageField(evt) || isKeyHotkey('mod+v', evt)) { ReactEditor.focus(editor); } }, diff --git a/src/app/pages/client/home/Home.tsx b/src/app/pages/client/home/Home.tsx index 76034cfe..a06e108e 100644 --- a/src/app/pages/client/home/Home.tsx +++ b/src/app/pages/client/home/Home.tsx @@ -62,6 +62,11 @@ const HomeMenu = forwardRef(({ requestClose }, re requestClose(); }; + const handleJoinAddress = () => { + openJoinAlias(); + requestClose(); + }; + return ( @@ -76,6 +81,16 @@ const HomeMenu = forwardRef(({ requestClose }, re Mark as Read + } + > + + Join with Address + + ); diff --git a/src/colors.css.ts b/src/colors.css.ts index 9b854bef..c4f122d2 100644 --- a/src/colors.css.ts +++ b/src/colors.css.ts @@ -3,92 +3,92 @@ import { color } from 'folds'; export const silverTheme = createTheme(color, { Background: { - Container: '#E6E6E6', - ContainerHover: '#DADADA', - ContainerActive: '#CECECE', - ContainerLine: '#C2C2C2', + Container: '#DEDEDE', + ContainerHover: '#D3D3D3', + ContainerActive: '#C7C7C7', + ContainerLine: '#BBBBBB', OnContainer: '#000000', }, Surface: { - Container: '#F2F2F2', - ContainerHover: '#E6E6E6', - ContainerActive: '#DADADA', - ContainerLine: '#CECECE', + Container: '#EAEAEA', + ContainerHover: '#DEDEDE', + ContainerActive: '#D3D3D3', + ContainerLine: '#C7C7C7', OnContainer: '#000000', }, SurfaceVariant: { - Container: '#E6E6E6', - ContainerHover: '#DADADA', - ContainerActive: '#CECECE', - ContainerLine: '#C2C2C2', + Container: '#DEDEDE', + ContainerHover: '#D3D3D3', + ContainerActive: '#C7C7C7', + ContainerLine: '#BBBBBB', OnContainer: '#000000', }, Primary: { - Main: '#1858D5', - MainHover: '#164FC0', - MainActive: '#144BB5', - MainLine: '#1346AA', + Main: '#1245A8', + MainHover: '#103E97', + MainActive: '#0F3B8F', + MainLine: '#0E3786', OnMain: '#FFFFFF', - Container: '#E8EEFB', - ContainerHover: '#DCE6F9', - ContainerActive: '#D1DEF7', - ContainerLine: '#C5D5F5', - OnContainer: '#113E95', + Container: '#C4D0E9', + ContainerHover: '#B8C7E5', + ContainerActive: '#ACBEE1', + ContainerLine: '#A0B5DC', + OnContainer: '#0D3076', }, Secondary: { Main: '#000000', - MainHover: '#0C0C0C', - MainActive: '#181818', - MainLine: '#303030', - OnMain: '#F2F2F2', - Container: '#CECECE', - ContainerHover: '#C2C2C2', - ContainerActive: '#B5B5B5', - ContainerLine: '#A9A9A9', + MainHover: '#171717', + MainActive: '#232323', + MainLine: '#2F2F2F', + OnMain: '#EAEAEA', + Container: '#C7C7C7', + ContainerHover: '#BBBBBB', + ContainerActive: '#AFAFAF', + ContainerLine: '#A4A4A4', OnContainer: '#0C0C0C', }, Success: { - Main: '#00844C', - MainHover: '#007744', - MainActive: '#007041', - MainLine: '#006A3D', + Main: '#017343', + MainHover: '#01683C', + MainActive: '#016239', + MainLine: '#015C36', OnMain: '#FFFFFF', - Container: '#E5F3ED', - ContainerHover: '#D9EDE4', - ContainerActive: '#CCE6DB', - ContainerLine: '#BFE0D2', - OnContainer: '#005C35', + Container: '#BFDCD0', + ContainerHover: '#B3D5C7', + ContainerActive: '#A6CEBD', + ContainerLine: '#99C7B4', + OnContainer: '#01512F', }, Warning: { - Main: '#A85400', - MainHover: '#974C00', - MainActive: '#8F4700', - MainLine: '#864300', + Main: '#864300', + MainHover: '#793C00', + MainActive: '#723900', + MainLine: '#6B3600', OnMain: '#FFFFFF', - Container: '#F6EEE5', - ContainerHover: '#F2E5D9', - ContainerActive: '#EEDDCC', - ContainerLine: '#E9D4BF', - OnContainer: '#763B00', + Container: '#E1D0BF', + ContainerHover: '#DBC7B2', + ContainerActive: '#D5BDA6', + ContainerLine: '#CFB499', + OnContainer: '#5E2F00', }, Critical: { - Main: '#C40E0E', - MainHover: '#AC0909', - MainActive: '#A60C0C', - MainLine: '#9C0B0B', + Main: '#9D0F0F', + MainHover: '#8D0E0E', + MainActive: '#850D0D', + MainLine: '#7E0C0C', OnMain: '#FFFFFF', - Container: '#F9E7E7', - ContainerHover: '#F6DBDB', - ContainerActive: '#F3CFCF', - ContainerLine: '#F0C3C3', - OnContainer: '#890A0A', + Container: '#E7C3C3', + ContainerHover: '#E2B7B7', + ContainerActive: '#DDABAB', + ContainerLine: '#D89F9F', + OnContainer: '#6E0B0B', }, Other: { @@ -100,27 +100,27 @@ export const silverTheme = createTheme(color, { const darkThemeData = { Background: { - Container: '#15171A', - ContainerHover: '#1F2326', - ContainerActive: '#2A2E33', - ContainerLine: '#343A40', - OnContainer: '#ffffff', + Container: '#1A1A1A', + ContainerHover: '#262626', + ContainerActive: '#333333', + ContainerLine: '#404040', + OnContainer: '#F2F2F2', }, Surface: { - Container: '#1F2326', - ContainerHover: '#2A2E33', - ContainerActive: '#343A40', - ContainerLine: '#3F464D', - OnContainer: '#ffffff', + Container: '#262626', + ContainerHover: '#333333', + ContainerActive: '#404040', + ContainerLine: '#4D4D4D', + OnContainer: '#F2F2F2', }, SurfaceVariant: { - Container: '#2A2E33', - ContainerHover: '#343A40', - ContainerActive: '#3F464D', - ContainerLine: '#495159', - OnContainer: '#ffffff', + Container: '#333333', + ContainerHover: '#404040', + ContainerActive: '#4D4D4D', + ContainerLine: '#595959', + OnContainer: '#F2F2F2', }, Primary: { @@ -137,16 +137,16 @@ const darkThemeData = { }, Secondary: { - Main: '#D1E8FF', - MainHover: '#BCD1E5', - MainActive: '#B2C5D9', - MainLine: '#A7BACC', - OnMain: '#15171A', - Container: '#343A40', - ContainerHover: '#3F464D', - ContainerActive: '#495159', - ContainerLine: '#545D66', - OnContainer: '#C7DCF2', + Main: '#FFFFFF', + MainHover: '#E5E5E5', + MainActive: '#D9D9D9', + MainLine: '#CCCCCC', + OnMain: '#1A1A1A', + Container: '#404040', + ContainerHover: '#4D4D4D', + ContainerActive: '#595959', + ContainerLine: '#666666', + OnContainer: '#F2F2F2', }, Success: { diff --git a/src/index.scss b/src/index.scss index 5290035b..5903858a 100644 --- a/src/index.scss +++ b/src/index.scss @@ -19,25 +19,25 @@ --bg-surface-active: rgba(0, 0, 0, 5%); --bg-surface-border: rgba(0, 0, 0, 6%); - --bg-primary: rgb(83, 110, 234); - --bg-primary-hover: rgba(83, 110, 234, 80%); - --bg-primary-active: rgba(83, 110, 234, 70%); - --bg-primary-border: rgba(83, 110, 234, 38%); + --bg-primary: rgb(18, 69, 168); + --bg-primary-hover: rgba(18, 69, 168, 80%); + --bg-primary-active: rgba(18, 69, 168, 70%); + --bg-primary-border: rgba(18, 69, 168, 38%); - --bg-positive: rgb(69, 184, 59); - --bg-positive-hover: rgba(69, 184, 59, 8%); - --bg-positive-active: rgba(69, 184, 59, 15%); - --bg-positive-border: rgba(69, 184, 59, 40%); + --bg-positive: rgb(1, 115, 67); + --bg-positive-hover: rgba(1, 115, 67, 8%); + --bg-positive-active: rgba(1, 115, 67, 15%); + --bg-positive-border: rgba(1, 115, 67, 40%); - --bg-caution: rgb(255, 179, 0); - --bg-caution-hover: rgba(255, 179, 0, 8%); - --bg-caution-active: rgba(255, 179, 0, 15%); - --bg-caution-border: rgba(255, 179, 0, 40%); + --bg-caution: rgb(134, 67, 0); + --bg-caution-hover: rgba(134, 67, 0, 8%); + --bg-caution-active: rgba(134, 67, 0, 15%); + --bg-caution-border: rgba(134, 67, 0, 40%); - --bg-danger: rgb(240, 71, 71); - --bg-danger-hover: rgba(240, 71, 71, 5%); - --bg-danger-active: rgba(240, 71, 71, 10%); - --bg-danger-border: rgba(240, 71, 71, 20%); + --bg-danger: rgb(157, 15, 15); + --bg-danger-hover: rgba(157, 15, 15, 5%); + --bg-danger-active: rgba(157, 15, 15, 10%); + --bg-danger-border: rgba(157, 15, 15, 20%); --bg-tooltip: #353535; --bg-badge: #989898; @@ -56,16 +56,16 @@ --tc-primary-low: rgba(255, 255, 255, 40%); --tc-positive-high: var(--bg-positive); - --tc-positive-normal: rgb(69, 184, 59, 80%); - --tc-positive-low: rgb(69, 184, 59, 60%); + --tc-positive-normal: rgb(1, 115, 67, 80%); + --tc-positive-low: rgb(1, 115, 67, 60%); --tc-caution-high: var(--bg-caution); - --tc-caution-normal: rgb(255, 179, 0, 80%); - --tc-caution-low: rgb(255, 179, 0, 60%); + --tc-caution-normal: rgb(134, 67, 0, 80%); + --tc-caution-low: rgb(134, 67, 0, 60%); --tc-danger-high: var(--bg-danger); - --tc-danger-normal: rgba(240, 71, 71, 88%); - --tc-danger-low: rgba(240, 71, 71, 60%); + --tc-danger-normal: rgba(157, 15, 15, 88%); + --tc-danger-low: rgba(157, 15, 15, 60%); --tc-code: #e62498; --tc-link: hsl(213deg 100% 45%); @@ -78,12 +78,12 @@ --ic-surface-low: #7c7c7c; --ic-primary-high: #ffffff; --ic-primary-normal: #ffffff; - --ic-positive-high: rgba(69, 184, 59); - --ic-positive-normal: rgba(69, 184, 59, 80%); - --ic-caution-high: rgba(255, 179, 0); - --ic-caution-normal: rgba(255, 179, 0, 80%); - --ic-danger-high: rgba(240, 71, 71); - --ic-danger-normal: rgba(240, 71, 71, 0.7); + --ic-positive-high: rgba(1, 115, 67); + --ic-positive-normal: rgba(1, 115, 67, 80%); + --ic-caution-high: rgba(134, 67, 0); + --ic-caution-normal: rgba(134, 67, 0, 80%); + --ic-danger-high: rgba(157, 15, 15); + --ic-danger-normal: rgba(157, 15, 15, 0.7); /* user mxid colors */ --mx-uc-1: hsl(208, 100%, 45%); @@ -210,20 +210,35 @@ .dark-theme, .butter-theme { /* background color | --bg-[background type]: value */ - --bg-surface: #1f2326; - --bg-surface-transparent: #1f232600; - --bg-surface-low: #15171a; - --bg-surface-low-transparent: #15171a00; - --bg-surface-extra-low: #15171a; - --bg-surface-extra-low-transparent: #15171a00; - --bg-surface-hover: #1f2326; - --bg-surface-active: #2a2e33; - --bg-surface-border: rgba(0, 0, 0, 20%); + --bg-surface: #262626; + --bg-surface-transparent: #26262600; + --bg-surface-low: #1a1a1a; + --bg-surface-low-transparent: #1a1a1a00; + --bg-surface-extra-low: #1a1a1a; + --bg-surface-extra-low-transparent: #1a1a1a00; + --bg-surface-hover: #333333; + --bg-surface-active: #404040; + --bg-surface-border: #404040; - --bg-primary: rgb(42, 98, 166); - --bg-primary-hover: rgba(42, 98, 166, 80%); - --bg-primary-active: rgba(42, 98, 166, 70%); - --bg-primary-border: rgba(42, 98, 166, 38%); + --bg-primary: rgb(189, 182, 236); + --bg-primary-hover: rgba(189, 182, 236, 0.8); + --bg-primary-active: rgba(189, 182, 236, 70%); + --bg-primary-border: rgba(189, 182, 236, 38%); + + --bg-positive: rgb(133, 224, 186); + --bg-positive-hover: rgba(133, 224, 186, 8%); + --bg-positive-active: rgba(133, 224, 186, 15%); + --bg-positive-border: rgba(133, 224, 186, 40%); + + --bg-caution: rgb(227, 186, 145); + --bg-caution-hover: rgba(227, 186, 145, 8%); + --bg-caution-active: rgba(227, 186, 145, 15%); + --bg-caution-border: rgba(227, 186, 145, 40%); + + --bg-danger: rgb(230, 157, 157); + --bg-danger-hover: rgba(230, 157, 157, 5%); + --bg-danger-active: rgba(230, 157, 157, 10%); + --bg-danger-border: rgba(230, 157, 157, 20%); --bg-tooltip: #000; --bg-badge: hsl(0, 0%, 75%); @@ -237,9 +252,21 @@ --tc-surface-normal-low: rgba(255, 255, 255, 60%); --tc-surface-low: rgba(255, 255, 255, 58%); - --tc-primary-high: #ffffff; - --tc-primary-normal: rgba(255, 255, 255, 0.68); - --tc-primary-low: rgba(255, 255, 255, 0.4); + --tc-primary-high: rgb(44, 40, 67); + --tc-primary-normal: rgba(44, 40, 67, 0.68); + --tc-primary-low: rgba(44, 40, 67, 0.4); + + --tc-positive-high: var(--bg-positive); + --tc-positive-normal: rgb(133, 224, 186, 80%); + --tc-positive-low: rgb(133, 224, 186, 60%); + + --tc-caution-high: var(--bg-caution); + --tc-caution-normal: rgb(227, 186, 145, 80%); + --tc-caution-low: rgb(227, 186, 145, 60%); + + --tc-danger-high: var(--bg-danger); + --tc-danger-normal: rgba(230, 157, 157, 88%); + --tc-danger-low: rgba(230, 157, 157, 60%); --tc-code: #e565b1; --tc-link: hsl(213deg 100% 80%); @@ -249,7 +276,15 @@ --ic-surface-high: rgb(255, 255, 255); --ic-surface-normal: rgba(255, 255, 255, 84%); --ic-surface-low: rgba(255, 255, 255, 64%); - --ic-primary-normal: #ffffff; + --ic-primary-high: var(--tc-primary-high); + --ic-primary-normal: var(--tc-primary-high); + --ic-primary-low: var(--tc-primary-high); + --ic-positive-high: rgba(133, 224, 186); + --ic-positive-normal: rgba(133, 224, 186, 80%); + --ic-caution-high: rgba(227, 186, 145); + --ic-caution-normal: rgba(227, 186, 145, 80%); + --ic-danger-high: rgba(230, 157, 157); + --ic-danger-normal: rgba(230, 157, 157, 0.7); --mx-uc-1: hsl(208, 100%, 75%); --mx-uc-2: hsl(301, 100%, 80%); @@ -296,17 +331,20 @@ .butter-theme { /* background color | --bg-[background type]: value */ - --bg-surface: hsl(64, 6%, 14%); - --bg-surface-transparent: hsla(64, 6%, 14%, 0); - --bg-surface-low: hsl(64, 6%, 10%); - --bg-surface-low-transparent: hsla(64, 6%, 10%, 0); - --bg-surface-extra-low: hsl(64, 6%, 8%); - --bg-surface-extra-low-transparent: hsla(64, 6%, 8%, 0); + --bg-surface: #262621; + --bg-surface-transparent: #26262100; + --bg-surface-low: #1a1916; + --bg-surface-low-transparent: #1a191600; + --bg-surface-extra-low: #1a1916; + --bg-surface-extra-low-transparent: #1a1916; + --bg-surface-hover: #33322c; + --bg-surface-active: #403f38; + --bg-surface-border: #403f38; --bg-badge: #c4c1ab; /* text color | --tc-[background type]-[priority]: value */ - --tc-surface-high: rgb(255, 251, 222, 94%); + --tc-surface-high: rgb(255, 251, 222); --tc-surface-normal: rgba(255, 251, 222, 94%); --tc-surface-normal-low: rgba(255, 251, 222, 60%); --tc-surface-low: rgba(255, 251, 222, 58%); From 021a2c0e2ed605339f7f1153fa421ac0a5bdddc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:43:58 +1000 Subject: [PATCH 589/824] Bump actions/setup-node from 4.0.2 to 4.0.3 (#1816) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.0.2 to 4.0.3. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4.0.2...v4.0.3) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index fd8741a2..67ae5f1e 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Setup node - uses: actions/setup-node@v4.0.2 + uses: actions/setup-node@v4.0.3 with: node-version: 20.12.2 cache: 'npm' diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 5a0ecbca..71d34294 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Setup node - uses: actions/setup-node@v4.0.2 + uses: actions/setup-node@v4.0.3 with: node-version: 20.12.2 cache: 'npm' diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index b1aeee74..9118be55 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Setup node - uses: actions/setup-node@v4.0.2 + uses: actions/setup-node@v4.0.3 with: node-version: 20.12.2 cache: 'npm' From fbe27d69c0b14620509686562b3c576247a2b4c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:44:27 +1000 Subject: [PATCH 590/824] Bump docker/build-push-action from 6.3.0 to 6.4.0 (#1815) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.3.0...v6.4.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index d47d2c2f..fdeb237f 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Build Docker image - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 9118be55..a8466211 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . platforms: linux/amd64,linux/arm64 From e046c59f7c5aa6385d4b9e0e4bc82aa3984502fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:44:43 +1000 Subject: [PATCH 591/824] Bump docker/setup-buildx-action from 3.3.0 to 3.4.0 (#1814) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3.3.0...v3.4.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index a8466211..7bc82b42 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.3.0 + uses: docker/setup-buildx-action@v3.4.0 - name: Login to Docker Hub uses: docker/login-action@v3.2.0 with: From e2228a18c1533bbf8b7a3f82f8353ae65bc69a80 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:17:19 +0530 Subject: [PATCH 592/824] handle error in loading screen (#1823) * handle client boot error in loading screen * use sync state hook in client root * add loading screen options * removed extra condition in loading finish * add sync connection status bar --- src/app/features/room-nav/RoomNavItem.tsx | 2 +- src/app/features/room/Room.tsx | 4 +- src/app/features/room/RoomTimeline.tsx | 10 +- src/app/features/room/RoomTombstone.tsx | 46 ++--- src/app/features/room/RoomViewHeader.tsx | 2 +- src/app/hooks/useAccountData.js | 7 +- src/app/hooks/useCommands.ts | 28 +-- src/app/hooks/useCrossSigningStatus.js | 8 +- src/app/hooks/useDeviceList.js | 7 +- src/app/hooks/useSyncState.ts | 6 +- .../GlobalNotification.jsx | 4 +- .../global-notification/IgnoreUserList.jsx | 9 +- .../KeywordNotification.jsx | 4 +- src/app/molecules/image-pack/ImagePack.jsx | 37 ++-- .../molecules/image-pack/ImagePackUpload.jsx | 4 +- .../molecules/image-upload/ImageUpload.jsx | 7 +- .../ExportE2ERoomKeys.jsx | 5 +- .../ImportE2ERoomKeys.jsx | 5 +- .../molecules/room-aliases/RoomAliases.jsx | 14 +- src/app/molecules/room-emojis/RoomEmojis.jsx | 6 +- .../room-encryption/RoomEncryption.jsx | 4 +- .../RoomHistoryVisibility.jsx | 27 ++- .../molecules/room-members/RoomMembers.jsx | 10 +- .../room-notification/RoomNotification.jsx | 11 +- .../room-permissions/RoomPermissions.jsx | 8 +- .../molecules/room-profile/RoomProfile.jsx | 6 +- .../room-visibility/RoomVisibility.jsx | 15 +- .../space-add-existing/SpaceAddExisting.jsx | 8 +- src/app/organisms/create-room/CreateRoom.jsx | 10 +- .../emoji-verification/EmojiVerification.jsx | 14 +- src/app/organisms/invite-user/InviteUser.jsx | 8 +- src/app/organisms/join-alias/JoinAlias.jsx | 6 +- .../profile-editor/ProfileEditor.jsx | 6 +- .../profile-viewer/ProfileViewer.jsx | 46 ++--- src/app/organisms/room/RoomSettings.jsx | 7 +- src/app/organisms/search/Search.jsx | 16 +- src/app/organisms/settings/AuthRequest.jsx | 4 +- src/app/organisms/settings/CrossSigning.jsx | 4 +- src/app/organisms/settings/DeviceManage.jsx | 12 +- src/app/organisms/settings/KeyBackup.jsx | 14 +- .../settings/SecretStorageAccess.jsx | 13 +- src/app/organisms/settings/Settings.jsx | 12 +- .../space-settings/SpaceSettings.jsx | 5 +- src/app/pages/client/ClientLayout.tsx | 2 +- src/app/pages/client/ClientRoot.tsx | 181 ++++++++++++++++-- src/app/pages/client/SyncStatus.tsx | 87 +++++++++ src/app/pages/client/WelcomePage.tsx | 2 +- src/app/pages/client/direct/Direct.tsx | 3 +- src/app/pages/client/home/Home.tsx | 3 +- src/app/pages/client/inbox/Notifications.tsx | 2 +- src/app/pages/client/sidebar/DirectTab.tsx | 3 +- src/app/pages/client/sidebar/HomeTab.tsx | 3 +- src/app/pages/client/sidebar/SpaceTabs.tsx | 2 +- src/app/pages/client/space/Space.tsx | 2 +- .../{notifications.js => notifications.ts} | 8 +- src/client/action/room.js | 82 ++------ src/client/initMatrix.js | 128 ------------- src/client/initMatrix.ts | 70 +++++++ src/client/mx.ts | 7 - src/index.scss | 2 + src/util/matrixUtil.js | 24 +-- src/util/sort.js | 27 --- 62 files changed, 609 insertions(+), 510 deletions(-) create mode 100644 src/app/pages/client/SyncStatus.tsx rename src/client/action/{notifications.js => notifications.ts} (69%) delete mode 100644 src/client/initMatrix.js create mode 100644 src/client/initMatrix.ts delete mode 100644 src/client/mx.ts diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index 8ecc81a3..281c5b77 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -53,7 +53,7 @@ const RoomNavItemMenu = forwardRef( const canInvite = canDoAction('invite', getPowerLevel(mx.getUserId() ?? '')); const handleMarkAsRead = () => { - markAsRead(room.roomId); + markAsRead(mx, room.roomId); requestClose(); }; diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx index fd578ec6..19ac53e1 100644 --- a/src/app/features/room/Room.tsx +++ b/src/app/features/room/Room.tsx @@ -11,10 +11,12 @@ import { PowerLevelsContextProvider, usePowerLevels } from '../../hooks/usePower import { useRoom } from '../../hooks/useRoom'; import { useKeyDown } from '../../hooks/useKeyDown'; import { markAsRead } from '../../../client/action/notifications'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; export function Room() { const { eventId } = useParams(); const room = useRoom(); + const mx = useMatrixClient(); const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); const screenSize = useScreenSizeContext(); @@ -25,7 +27,7 @@ export function Room() { useCallback( (evt) => { if (isKeyHotkey('escape', evt)) { - markAsRead(room.roomId); + markAsRead(mx, room.roomId); } }, [room.roomId] diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 14cdb56e..b9bfb843 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -597,7 +597,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli // so timeline can be updated with evt like: edits, reactions etc if (atBottomRef.current) { if (document.hasFocus() && (!unreadInfo || mEvt.getSender() === mx.getUserId())) { - requestAnimationFrame(() => markAsRead(mEvt.getRoomId())); + requestAnimationFrame(() => markAsRead(mx, mEvt.getRoomId())); } if (document.hasFocus()) { @@ -658,15 +658,15 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const tryAutoMarkAsRead = useCallback(() => { if (!unreadInfo) { - requestAnimationFrame(() => markAsRead(room.roomId)); + requestAnimationFrame(() => markAsRead(mx, room.roomId)); return; } const evtTimeline = getEventTimeline(room, unreadInfo.readUptoEventId); const latestTimeline = evtTimeline && getFirstLinkedTimeline(evtTimeline, Direction.Forward); if (latestTimeline === room.getLiveTimeline()) { - requestAnimationFrame(() => markAsRead(room.roomId)); + requestAnimationFrame(() => markAsRead(mx, room.roomId)); } - }, [room, unreadInfo]); + }, [mx, room, unreadInfo]); const debounceSetAtBottom = useDebounce( useCallback((entry: IntersectionObserverEntry) => { @@ -832,7 +832,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }; const handleMarkAsRead = () => { - markAsRead(room.roomId); + markAsRead(mx, room.roomId); }; const handleOpenReply: MouseEventHandler = useCallback( diff --git a/src/app/features/room/RoomTombstone.tsx b/src/app/features/room/RoomTombstone.tsx index bd8afdad..e3f8251f 100644 --- a/src/app/features/room/RoomTombstone.tsx +++ b/src/app/features/room/RoomTombstone.tsx @@ -40,28 +40,30 @@ export function RoomTombstone({ roomId, body, replacementRoomId }: RoomTombstone )} - {replacementRoom?.getMyMembership() === Membership.Join || - joinState.status === AsyncStatus.Success ? ( - - ) : ( - - )} + + {replacementRoom?.getMyMembership() === Membership.Join || + joinState.status === AsyncStatus.Success ? ( + + ) : ( + + )} + ); } diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index aa267c53..6750f923 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -74,7 +74,7 @@ const RoomMenu = forwardRef( const canInvite = canDoAction('invite', getPowerLevel(mx.getUserId() ?? '')); const handleMarkAsRead = () => { - markAsRead(room.roomId); + markAsRead(mx, room.roomId); requestClose(); }; diff --git a/src/app/hooks/useAccountData.js b/src/app/hooks/useAccountData.js index ed654d97..43cc11ed 100644 --- a/src/app/hooks/useAccountData.js +++ b/src/app/hooks/useAccountData.js @@ -1,10 +1,9 @@ /* eslint-disable import/prefer-default-export */ import { useState, useEffect } from 'react'; - -import initMatrix from '../../client/initMatrix'; +import { useMatrixClient } from './useMatrixClient'; export function useAccountData(eventType) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [event, setEvent] = useState(mx.getAccountData(eventType)); useEffect(() => { @@ -16,7 +15,7 @@ export function useAccountData(eventType) { return () => { mx.removeListener('accountData', handleChange); }; - }, [eventType]); + }, [mx, eventType]); return event; } diff --git a/src/app/hooks/useCommands.ts b/src/app/hooks/useCommands.ts index 3c829514..182d1307 100644 --- a/src/app/hooks/useCommands.ts +++ b/src/app/hooks/useCommands.ts @@ -92,9 +92,9 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { return; } } - const devices = await Promise.all(userIds.map(hasDevices)); + const devices = await Promise.all(userIds.map(uid => hasDevices(mx, uid))); const isEncrypt = devices.every((hasDevice) => hasDevice); - const result = await roomActions.createDM(userIds, isEncrypt); + const result = await roomActions.createDM(mx, userIds, isEncrypt); navigateRoom(result.room_id); }, }, @@ -106,7 +106,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { const roomIds = rawIds.filter( (idOrAlias) => isRoomId(idOrAlias) || isRoomAlias(idOrAlias) ); - roomIds.map((id) => roomActions.join(id)); + roomIds.map((id) => roomActions.join(mx, id)); }, }, [Command.Leave]: { @@ -127,7 +127,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Invite user to room. Example: /invite userId1 userId2 [-r reason]', exe: async (payload) => { const { users, reason } = parseUsersAndReason(payload); - users.map((id) => roomActions.invite(room.roomId, id, reason)); + users.map((id) => mx.invite(room.roomId, id, reason)); }, }, [Command.DisInvite]: { @@ -135,7 +135,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Disinvite user to room. Example: /disinvite userId1 userId2 [-r reason]', exe: async (payload) => { const { users, reason } = parseUsersAndReason(payload); - users.map((id) => roomActions.kick(room.roomId, id, reason)); + users.map((id) => mx.kick(room.roomId, id, reason)); }, }, [Command.Kick]: { @@ -143,7 +143,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Kick user from room. Example: /kick userId1 userId2 [-r reason]', exe: async (payload) => { const { users, reason } = parseUsersAndReason(payload); - users.map((id) => roomActions.kick(room.roomId, id, reason)); + users.map((id) => mx.kick(room.roomId, id, reason)); }, }, [Command.Ban]: { @@ -151,7 +151,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Ban user from room. Example: /ban userId1 userId2 [-r reason]', exe: async (payload) => { const { users, reason } = parseUsersAndReason(payload); - users.map((id) => roomActions.ban(room.roomId, id, reason)); + users.map((id) => mx.ban(room.roomId, id, reason)); }, }, [Command.UnBan]: { @@ -160,7 +160,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { exe: async (payload) => { const rawIds = payload.split(' '); const users = rawIds.filter((id) => isUserId(id)); - users.map((id) => roomActions.unban(room.roomId, id)); + users.map((id) => mx.unban(room.roomId, id)); }, }, [Command.Ignore]: { @@ -169,7 +169,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { exe: async (payload) => { const rawIds = payload.split(' '); const userIds = rawIds.filter((id) => isUserId(id)); - if (userIds.length > 0) roomActions.ignore(userIds); + if (userIds.length > 0) roomActions.ignore(mx, userIds); }, }, [Command.UnIgnore]: { @@ -178,7 +178,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { exe: async (payload) => { const rawIds = payload.split(' '); const userIds = rawIds.filter((id) => isUserId(id)); - if (userIds.length > 0) roomActions.unignore(userIds); + if (userIds.length > 0) roomActions.unignore(mx, userIds); }, }, [Command.MyRoomNick]: { @@ -187,7 +187,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { exe: async (payload) => { const nick = payload.trim(); if (nick === '') return; - roomActions.setMyRoomNick(room.roomId, nick); + roomActions.setMyRoomNick(mx, room.roomId, nick); }, }, [Command.MyRoomAvatar]: { @@ -195,7 +195,7 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { description: 'Change profile picture in current room. Example /myroomavatar mxc://xyzabc', exe: async (payload) => { if (payload.match(/^mxc:\/\/\S+$/)) { - roomActions.setMyRoomAvatar(room.roomId, payload); + roomActions.setMyRoomAvatar(mx, room.roomId, payload); } }, }, @@ -203,14 +203,14 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => { name: Command.ConvertToDm, description: 'Convert room to direct message', exe: async () => { - roomActions.convertToDm(room.roomId); + roomActions.convertToDm(mx, room.roomId); }, }, [Command.ConvertToRoom]: { name: Command.ConvertToRoom, description: 'Convert direct message to room', exe: async () => { - roomActions.convertToRoom(room.roomId); + roomActions.convertToRoom(mx, room.roomId); }, }, }), diff --git a/src/app/hooks/useCrossSigningStatus.js b/src/app/hooks/useCrossSigningStatus.js index 845c5462..990076e6 100644 --- a/src/app/hooks/useCrossSigningStatus.js +++ b/src/app/hooks/useCrossSigningStatus.js @@ -1,12 +1,12 @@ /* eslint-disable import/prefer-default-export */ import { useState, useEffect } from 'react'; -import initMatrix from '../../client/initMatrix'; import { hasCrossSigningAccountData } from '../../util/matrixUtil'; +import { useMatrixClient } from './useMatrixClient'; export function useCrossSigningStatus() { - const mx = initMatrix.matrixClient; - const [isCSEnabled, setIsCSEnabled] = useState(hasCrossSigningAccountData()); + const mx = useMatrixClient(); + const [isCSEnabled, setIsCSEnabled] = useState(hasCrossSigningAccountData(mx)); useEffect(() => { if (isCSEnabled) return undefined; @@ -20,6 +20,6 @@ export function useCrossSigningStatus() { return () => { mx.removeListener('accountData', handleAccountData); }; - }, [isCSEnabled === false]); + }, [mx, isCSEnabled]); return isCSEnabled; } diff --git a/src/app/hooks/useDeviceList.js b/src/app/hooks/useDeviceList.js index 2cce0fe5..7daaad1f 100644 --- a/src/app/hooks/useDeviceList.js +++ b/src/app/hooks/useDeviceList.js @@ -1,10 +1,9 @@ /* eslint-disable import/prefer-default-export */ import { useState, useEffect } from 'react'; - -import initMatrix from '../../client/initMatrix'; +import { useMatrixClient } from './useMatrixClient'; export function useDeviceList() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [deviceList, setDeviceList] = useState(null); useEffect(() => { @@ -27,6 +26,6 @@ export function useDeviceList() { mx.removeListener('crypto.devicesUpdated', handleDevicesUpdate); isMounted = false; }; - }, []); + }, [mx]); return deviceList; } diff --git a/src/app/hooks/useSyncState.ts b/src/app/hooks/useSyncState.ts index 4b2f4163..be8a6ef2 100644 --- a/src/app/hooks/useSyncState.ts +++ b/src/app/hooks/useSyncState.ts @@ -2,13 +2,13 @@ import { ClientEvent, ClientEventHandlerMap, MatrixClient } from 'matrix-js-sdk' import { useEffect } from 'react'; export const useSyncState = ( - mx: MatrixClient, + mx: MatrixClient | undefined, onChange: ClientEventHandlerMap[ClientEvent.Sync] ): void => { useEffect(() => { - mx.on(ClientEvent.Sync, onChange); + mx?.on(ClientEvent.Sync, onChange); return () => { - mx.removeListener(ClientEvent.Sync, onChange); + mx?.removeListener(ClientEvent.Sync, onChange); }; }, [mx, onChange]); }; diff --git a/src/app/molecules/global-notification/GlobalNotification.jsx b/src/app/molecules/global-notification/GlobalNotification.jsx index 865582ce..b115c9dc 100644 --- a/src/app/molecules/global-notification/GlobalNotification.jsx +++ b/src/app/molecules/global-notification/GlobalNotification.jsx @@ -1,6 +1,5 @@ import React from 'react'; -import initMatrix from '../../../client/initMatrix'; import { openReusableContextMenu } from '../../../client/action/navigation'; import { getEventCords } from '../../../util/common'; @@ -14,6 +13,7 @@ import NotificationSelector from './NotificationSelector'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import { useAccountData } from '../../hooks/useAccountData'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; export const notifType = { ON: 'on', @@ -52,7 +52,7 @@ export function getTypeActions(type, highlightValue = false) { } function useGlobalNotif() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const pushRules = useAccountData('m.push_rules')?.getContent(); const underride = pushRules?.global?.underride ?? []; const rulesToType = { diff --git a/src/app/molecules/global-notification/IgnoreUserList.jsx b/src/app/molecules/global-notification/IgnoreUserList.jsx index 87ee6272..1b44a041 100644 --- a/src/app/molecules/global-notification/IgnoreUserList.jsx +++ b/src/app/molecules/global-notification/IgnoreUserList.jsx @@ -1,7 +1,6 @@ import React from 'react'; import './IgnoreUserList.scss'; -import initMatrix from '../../../client/initMatrix'; import * as roomActions from '../../../client/action/room'; import Text from '../../atoms/text/Text'; @@ -14,10 +13,12 @@ import SettingTile from '../setting-tile/SettingTile'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useAccountData } from '../../hooks/useAccountData'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function IgnoreUserList() { useAccountData('m.ignored_user_list'); - const ignoredUsers = initMatrix.matrixClient.getIgnoredUsers(); + const mx = useMatrixClient(); + const ignoredUsers = mx.getIgnoredUsers(); const handleSubmit = (evt) => { evt.preventDefault(); @@ -26,7 +27,7 @@ function IgnoreUserList() { const userIds = value.split(' ').filter((v) => v.match(/^@\S+:\S+$/)); if (userIds.length === 0) return; ignoreInput.value = ''; - roomActions.ignore(userIds); + roomActions.ignore(mx, userIds); }; return ( @@ -49,7 +50,7 @@ function IgnoreUserList() { key={uId} text={uId} iconColor={CrossIC} - onClick={() => roomActions.unignore([uId])} + onClick={() => roomActions.unignore(mx, [uId])} /> ))}
    diff --git a/src/app/molecules/global-notification/KeywordNotification.jsx b/src/app/molecules/global-notification/KeywordNotification.jsx index 8484d41d..7f7e4dea 100644 --- a/src/app/molecules/global-notification/KeywordNotification.jsx +++ b/src/app/molecules/global-notification/KeywordNotification.jsx @@ -1,7 +1,6 @@ import React from 'react'; import './KeywordNotification.scss'; -import initMatrix from '../../../client/initMatrix'; import { openReusableContextMenu } from '../../../client/action/navigation'; import { getEventCords } from '../../../util/common'; @@ -21,6 +20,7 @@ import { useAccountData } from '../../hooks/useAccountData'; import { notifType, typeToLabel, getActionType, getTypeActions, } from './GlobalNotification'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const DISPLAY_NAME = '.m.rule.contains_display_name'; const ROOM_PING = '.m.rule.roomnotif'; @@ -28,7 +28,7 @@ const USERNAME = '.m.rule.contains_user_name'; const KEYWORD = 'keyword'; function useKeywordNotif() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const pushRules = useAccountData('m.push_rules')?.getContent(); const override = pushRules?.global?.override ?? []; const content = pushRules?.global?.content ?? []; diff --git a/src/app/molecules/image-pack/ImagePack.jsx b/src/app/molecules/image-pack/ImagePack.jsx index f88886c1..51ffd0d3 100644 --- a/src/app/molecules/image-pack/ImagePack.jsx +++ b/src/app/molecules/image-pack/ImagePack.jsx @@ -4,7 +4,6 @@ import React, { import PropTypes from 'prop-types'; import './ImagePack.scss'; -import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; import { suffixRename } from '../../../util/common'; @@ -19,6 +18,7 @@ import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; import ImagePackProfile from './ImagePackProfile'; import ImagePackItem from './ImagePackItem'; import ImagePackUpload from './ImagePackUpload'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const renameImagePackItem = (shortcode) => new Promise((resolve) => { let isCompleted = false; @@ -63,8 +63,7 @@ function getUsage(usage) { return 'both'; } -function isGlobalPack(roomId, stateKey) { - const mx = initMatrix.matrixClient; +function isGlobalPack(mx, roomId, stateKey) { const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent(); if (typeof globalContent !== 'object') return false; @@ -75,13 +74,13 @@ function isGlobalPack(roomId, stateKey) { } function useRoomImagePack(roomId, stateKey) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); - const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); - const pack = useMemo(() => ( - ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()) - ), [room, stateKey]); + const pack = useMemo(() => { + const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); + return ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()) + }, [room, stateKey]); const sendPackContent = (content) => { mx.sendStateEvent(roomId, 'im.ponies.room_emotes', content, stateKey); @@ -94,14 +93,14 @@ function useRoomImagePack(roomId, stateKey) { } function useUserImagePack() { - const mx = initMatrix.matrixClient; - const packEvent = mx.getAccountData('im.ponies.user_emotes'); - const pack = useMemo(() => ( - ImagePackBuilder.parsePack(mx.getUserId(), packEvent?.getContent() ?? { + const mx = useMatrixClient(); + const pack = useMemo(() => { + const packEvent = mx.getAccountData('im.ponies.user_emotes'); + return ImagePackBuilder.parsePack(mx.getUserId(), packEvent?.getContent() ?? { pack: { display_name: 'Personal' }, images: {}, }) - ), []); + }, [mx]); const sendPackContent = (content) => { mx.setAccountData('im.ponies.user_emotes', content); @@ -223,10 +222,10 @@ function removeGlobalImagePack(mx, roomId, stateKey) { } function ImagePack({ roomId, stateKey, handlePackDelete }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const [viewMore, setViewMore] = useState(false); - const [isGlobal, setIsGlobal] = useState(isGlobalPack(roomId, stateKey)); + const [isGlobal, setIsGlobal] = useState(isGlobalPack(mx, roomId, stateKey)); const { pack, sendPackContent } = useRoomImagePack(roomId, stateKey); @@ -331,7 +330,7 @@ ImagePack.propTypes = { }; function ImagePackUser() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [viewMore, setViewMore] = useState(false); const { pack, sendPackContent } = useUserImagePack(); @@ -397,7 +396,7 @@ function ImagePackUser() { function useGlobalImagePack() { const [, forceUpdate] = useReducer((count) => count + 1, 0); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const roomIdToStateKeys = new Map(); const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? { rooms: {} }; @@ -419,13 +418,13 @@ function useGlobalImagePack() { return () => { mx.removeListener('accountData', handleEvent); }; - }, []); + }, [mx]); return roomIdToStateKeys; } function ImagePackGlobal() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const roomIdToStateKeys = useGlobalImagePack(); const handleChange = (roomId, stateKey) => { diff --git a/src/app/molecules/image-pack/ImagePackUpload.jsx b/src/app/molecules/image-pack/ImagePackUpload.jsx index 6295de1c..cdf2e13b 100644 --- a/src/app/molecules/image-pack/ImagePackUpload.jsx +++ b/src/app/molecules/image-pack/ImagePackUpload.jsx @@ -2,7 +2,6 @@ import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; import './ImagePackUpload.scss'; -import initMatrix from '../../../client/initMatrix'; import { scaleDownImage } from '../../../util/common'; import Text from '../../atoms/text/Text'; @@ -10,9 +9,10 @@ import Button from '../../atoms/button/Button'; import Input from '../../atoms/input/Input'; import IconButton from '../../atoms/button/IconButton'; import CirclePlusIC from '../../../../public/res/ic/outlined/circle-plus.svg'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ImagePackUpload({ onUpload }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const inputRef = useRef(null); const shortcodeRef = useRef(null); const [imgFile, setImgFile] = useState(null); diff --git a/src/app/molecules/image-upload/ImageUpload.jsx b/src/app/molecules/image-upload/ImageUpload.jsx index 53fc7e16..5213381f 100644 --- a/src/app/molecules/image-upload/ImageUpload.jsx +++ b/src/app/molecules/image-upload/ImageUpload.jsx @@ -2,7 +2,6 @@ import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; import './ImageUpload.scss'; -import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import Avatar from '../../atoms/avatar/Avatar'; @@ -10,6 +9,7 @@ import Spinner from '../../atoms/spinner/Spinner'; import RawIcon from '../../atoms/system-icons/RawIcon'; import PlusIC from '../../../../public/res/ic/outlined/plus.svg'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ImageUpload({ text, bgColor, imageSrc, onUpload, onRequestRemove, @@ -17,12 +17,13 @@ function ImageUpload({ }) { const [uploadPromise, setUploadPromise] = useState(null); const uploadImageRef = useRef(null); + const mx = useMatrixClient(); async function uploadImage(e) { const file = e.target.files.item(0); if (file === null) return; try { - const uPromise = initMatrix.matrixClient.uploadContent(file); + const uPromise = mx.uploadContent(file); setUploadPromise(uPromise); const res = await uPromise; @@ -35,7 +36,7 @@ function ImageUpload({ } function cancelUpload() { - initMatrix.matrixClient.cancelUpload(uploadPromise); + mx.cancelUpload(uploadPromise); setUploadPromise(null); uploadImageRef.current.value = null; } diff --git a/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx b/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx index b7738a6a..1ce7e78a 100644 --- a/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx +++ b/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx @@ -3,7 +3,6 @@ import './ExportE2ERoomKeys.scss'; import FileSaver from 'file-saver'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import { encryptMegolmKeyFile } from '../../../util/cryptE2ERoomKeys'; @@ -13,8 +12,10 @@ import Input from '../../atoms/input/Input'; import Spinner from '../../atoms/spinner/Spinner'; import { useStore } from '../../hooks/useStore'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ExportE2ERoomKeys() { + const mx = useMatrixClient(); const isMountStore = useStore(); const [status, setStatus] = useState({ isOngoing: false, @@ -40,7 +41,7 @@ function ExportE2ERoomKeys() { type: cons.status.IN_FLIGHT, }); try { - const keys = await initMatrix.matrixClient.exportRoomKeys(); + const keys = await mx.exportRoomKeys(); if (isMountStore.getItem()) { setStatus({ isOngoing: true, diff --git a/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx b/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx index b5a44b0e..9f0ab793 100644 --- a/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx +++ b/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx @@ -1,7 +1,6 @@ import React, { useState, useEffect, useRef } from 'react'; import './ImportE2ERoomKeys.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import { decryptMegolmKeyFile } from '../../../util/cryptE2ERoomKeys'; @@ -14,8 +13,10 @@ import Spinner from '../../atoms/spinner/Spinner'; import CirclePlusIC from '../../../../public/res/ic/outlined/circle-plus.svg'; import { useStore } from '../../hooks/useStore'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ImportE2ERoomKeys() { + const mx = useMatrixClient(); const isMountStore = useStore(); const [keyFile, setKeyFile] = useState(null); const [status, setStatus] = useState({ @@ -45,7 +46,7 @@ function ImportE2ERoomKeys() { type: cons.status.IN_FLIGHT, }); } - await initMatrix.matrixClient.importRoomKeys(JSON.parse(keys)); + await mx.importRoomKeys(JSON.parse(keys)); if (isMountStore.getItem()) { setStatus({ isOngoing: false, diff --git a/src/app/molecules/room-aliases/RoomAliases.jsx b/src/app/molecules/room-aliases/RoomAliases.jsx index d573f7d6..876d063f 100644 --- a/src/app/molecules/room-aliases/RoomAliases.jsx +++ b/src/app/molecules/room-aliases/RoomAliases.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomAliases.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import { Debounce } from '../../../util/common'; import { isRoomAliasAvailable } from '../../../util/matrixUtil'; @@ -16,8 +15,10 @@ import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; import SettingTile from '../setting-tile/SettingTile'; import { useStore } from '../../hooks/useStore'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function useValidate(hsString) { + const mx = useMatrixClient(); const [debounce] = useState(new Debounce()); const [validate, setValidate] = useState({ alias: null, status: cons.status.PRE_FLIGHT }); @@ -62,7 +63,7 @@ function useValidate(hsString) { msg: `validating ${alias}...`, }); - const isValid = await isRoomAliasAvailable(alias); + const isValid = await isRoomAliasAvailable(mx, alias); setValidate(() => { if (e.target.value !== value) { return { alias: null, status: cons.status.PRE_FLIGHT }; @@ -79,8 +80,7 @@ function useValidate(hsString) { return [validate, setValidateToDefault, handleAliasChange]; } -function getAliases(roomId) { - const mx = initMatrix.matrixClient; +function getAliases(mx, roomId) { const room = mx.getRoom(roomId); const main = room.getCanonicalAlias(); @@ -95,7 +95,7 @@ function getAliases(roomId) { } function RoomAliases({ roomId }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const userId = mx.getUserId(); const hsString = userId.slice(userId.indexOf(':') + 1); @@ -103,7 +103,7 @@ function RoomAliases({ roomId }) { const isMountedStore = useStore(); const [isPublic, setIsPublic] = useState(false); const [isLocalVisible, setIsLocalVisible] = useState(false); - const [aliases, setAliases] = useState(getAliases(roomId)); + const [aliases, setAliases] = useState(getAliases(mx, roomId)); const [selectedAlias, setSelectedAlias] = useState(null); const [deleteAlias, setDeleteAlias] = useState(null); const [validate, setValidateToDefault, handleAliasChange] = useValidate(hsString); @@ -140,7 +140,7 @@ function RoomAliases({ roomId }) { return () => { isUnmounted = true; }; - }, [roomId]); + }, [mx, roomId]); const toggleDirectoryVisibility = () => { mx.setRoomDirectoryVisibility(roomId, isPublic ? 'private' : 'public'); diff --git a/src/app/molecules/room-emojis/RoomEmojis.jsx b/src/app/molecules/room-emojis/RoomEmojis.jsx index 94ae6107..da09ea86 100644 --- a/src/app/molecules/room-emojis/RoomEmojis.jsx +++ b/src/app/molecules/room-emojis/RoomEmojis.jsx @@ -2,7 +2,6 @@ import React, { useReducer, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomEmojis.scss'; -import initMatrix from '../../../client/initMatrix'; import { suffixRename } from '../../../util/common'; import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; @@ -10,9 +9,10 @@ import Text from '../../atoms/text/Text'; import Input from '../../atoms/input/Input'; import Button from '../../atoms/button/Button'; import ImagePack from '../image-pack/ImagePack'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function useRoomPacks(room) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [, forceUpdate] = useReducer((count) => count + 1, 0); const packEvents = room.currentState.getStateEvents('im.ponies.room_emotes'); @@ -75,7 +75,7 @@ function useRoomPacks(room) { } function RoomEmojis({ roomId }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const { usablePacks, createPack, deletePack } = useRoomPacks(room); diff --git a/src/app/molecules/room-encryption/RoomEncryption.jsx b/src/app/molecules/room-encryption/RoomEncryption.jsx index 1657f363..47250f47 100644 --- a/src/app/molecules/room-encryption/RoomEncryption.jsx +++ b/src/app/molecules/room-encryption/RoomEncryption.jsx @@ -2,16 +2,16 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import './RoomEncryption.scss'; -import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import Toggle from '../../atoms/button/Toggle'; import SettingTile from '../setting-tile/SettingTile'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function RoomEncryption({ roomId }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const encryptionEvents = room.currentState.getStateEvents('m.room.encryption'); const [isEncrypted, setIsEncrypted] = useState(encryptionEvents.length > 0); diff --git a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx index d9dd9540..c897cb35 100644 --- a/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx +++ b/src/app/molecules/room-history-visibility/RoomHistoryVisibility.jsx @@ -2,11 +2,11 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import './RoomHistoryVisibility.scss'; -import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import RadioButton from '../../atoms/button/RadioButton'; import { MenuItem } from '../../atoms/context-menu/ContextMenu'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const visibility = { WORLD_READABLE: 'world_readable', @@ -33,38 +33,33 @@ const items = [{ type: visibility.JOINED, }]; -function setHistoryVisibility(roomId, type) { - const mx = initMatrix.matrixClient; - - return mx.sendStateEvent( - roomId, 'm.room.history_visibility', - { - history_visibility: type, - }, - ); -} function useVisibility(roomId) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const [activeType, setActiveType] = useState(room.getHistoryVisibility()); useEffect(() => { setActiveType(room.getHistoryVisibility()); - }, [roomId]); + }, [room]); const setVisibility = useCallback((item) => { if (item.type === activeType.type) return; setActiveType(item.type); - setHistoryVisibility(roomId, item.type); - }, [activeType, roomId]); + mx.sendStateEvent( + roomId, 'm.room.history_visibility', + { + history_visibility: item.type, + }, + ); + }, [mx, activeType, roomId]); return [activeType, setVisibility]; } function RoomHistoryVisibility({ roomId }) { const [activeType, setVisibility] = useVisibility(roomId); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const userId = mx.getUserId(); const room = mx.getRoom(roomId); const { currentState } = room; diff --git a/src/app/molecules/room-members/RoomMembers.jsx b/src/app/molecules/room-members/RoomMembers.jsx index f931f9dd..a3928fb7 100644 --- a/src/app/molecules/room-members/RoomMembers.jsx +++ b/src/app/molecules/room-members/RoomMembers.jsx @@ -4,7 +4,6 @@ import React, { import PropTypes from 'prop-types'; import './RoomMembers.scss'; -import initMatrix from '../../../client/initMatrix'; import colorMXID from '../../../util/colorMXID'; import { openProfileViewer } from '../../../client/action/navigation'; import { getUsernameOfRoomMember, getPowerLabel } from '../../../util/matrixUtil'; @@ -17,11 +16,11 @@ import Input from '../../atoms/input/Input'; import { MenuHeader } from '../../atoms/context-menu/ContextMenu'; import SegmentedControls from '../../atoms/segmented-controls/SegmentedControls'; import PeopleSelector from '../people-selector/PeopleSelector'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const PER_PAGE_MEMBER = 50; -function normalizeMembers(members) { - const mx = initMatrix.matrixClient; +function normalizeMembers(mx, members) { return members.map((member) => ({ userId: member.userId, name: getUsernameOfRoomMember(member), @@ -33,7 +32,7 @@ function normalizeMembers(members) { } function useMemberOfMembership(roomId, membership) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const [members, setMembers] = useState([]); @@ -45,6 +44,7 @@ function useMemberOfMembership(roomId, membership) { if (isLoadingMembers) return; if (event && event?.getRoomId() !== roomId) return; const memberOfMembership = normalizeMembers( + mx, room.getMembersWithMembership(membership) .sort(memberByAtoZ).sort(memberByPowerLevel), ); @@ -66,7 +66,7 @@ function useMemberOfMembership(roomId, membership) { mx.removeListener('RoomMember.membership', updateMemberList); mx.removeListener('RoomMember.powerLevel', updateMemberList); }; - }, [membership]); + }, [mx, membership]); return [members]; } diff --git a/src/app/molecules/room-notification/RoomNotification.jsx b/src/app/molecules/room-notification/RoomNotification.jsx index 821ea508..db970708 100644 --- a/src/app/molecules/room-notification/RoomNotification.jsx +++ b/src/app/molecules/room-notification/RoomNotification.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import './RoomNotification.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import Text from '../../atoms/text/Text'; @@ -14,6 +13,7 @@ import BellRingIC from '../../../../public/res/ic/outlined/bell-ring.svg'; import BellPingIC from '../../../../public/res/ic/outlined/bell-ping.svg'; import BellOffIC from '../../../../public/res/ic/outlined/bell-off.svg'; import { getNotificationType } from '../../utils/room'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const items = [ { @@ -38,8 +38,7 @@ const items = [ }, ]; -function setRoomNotifType(roomId, newType) { - const mx = initMatrix.matrixClient; +function setRoomNotifType(mx, roomId, newType) { let roomPushRule; try { roomPushRule = mx.getRoomPushRule('global', roomId); @@ -108,7 +107,7 @@ function setRoomNotifType(roomId, newType) { } function useNotifications(roomId) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [activeType, setActiveType] = useState(getNotificationType(mx, roomId)); useEffect(() => { setActiveType(getNotificationType(mx, roomId)); @@ -118,9 +117,9 @@ function useNotifications(roomId) { (item) => { if (item.type === activeType.type) return; setActiveType(item.type); - setRoomNotifType(roomId, item.type); + setRoomNotifType(mx, roomId, item.type); }, - [activeType, roomId] + [mx, activeType, roomId] ); return [activeType, setNotification]; } diff --git a/src/app/molecules/room-permissions/RoomPermissions.jsx b/src/app/molecules/room-permissions/RoomPermissions.jsx index da8720cd..f8cd048f 100644 --- a/src/app/molecules/room-permissions/RoomPermissions.jsx +++ b/src/app/molecules/room-permissions/RoomPermissions.jsx @@ -2,7 +2,6 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomPermissions.scss'; -import initMatrix from '../../../client/initMatrix'; import { getPowerLabel } from '../../../util/matrixUtil'; import { openReusableContextMenu } from '../../../client/action/navigation'; import { getEventCords } from '../../../util/common'; @@ -16,6 +15,7 @@ import SettingTile from '../setting-tile/SettingTile'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import { useForceUpdate } from '../../hooks/useForceUpdate'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const permissionsInfo = { users_default: { @@ -157,7 +157,7 @@ const spacePermsGroups = { function useRoomStateUpdate(roomId) { const [, forceUpdate] = useForceUpdate(); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); useEffect(() => { const handleStateEvent = (event) => { @@ -169,12 +169,12 @@ function useRoomStateUpdate(roomId) { return () => { mx.removeListener('RoomState.events', handleStateEvent); }; - }, [roomId]); + }, [mx, roomId]); } function RoomPermissions({ roomId }) { useRoomStateUpdate(roomId); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const pLEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; const permissions = pLEvent.getContent(); diff --git a/src/app/molecules/room-profile/RoomProfile.jsx b/src/app/molecules/room-profile/RoomProfile.jsx index 15273ebf..da8ce755 100644 --- a/src/app/molecules/room-profile/RoomProfile.jsx +++ b/src/app/molecules/room-profile/RoomProfile.jsx @@ -4,7 +4,6 @@ import { useAtomValue } from 'jotai'; import Linkify from 'linkify-react'; import './RoomProfile.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import colorMXID from '../../../util/colorMXID'; @@ -22,6 +21,7 @@ import { useForceUpdate } from '../../hooks/useForceUpdate'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; import { mDirectAtom } from '../../state/mDirectList'; import { LINKIFY_OPTS } from '../../plugins/react-custom-html-parser'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function RoomProfile({ roomId }) { const isMountStore = useStore(); @@ -32,7 +32,7 @@ function RoomProfile({ roomId }) { type: cons.status.PRE_FLIGHT, }); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mDirects = useAtomValue(mDirectAtom); const isDM = mDirects.has(roomId); let avatarSrc = mx.getRoom(roomId).getAvatarUrl(mx.baseUrl, 36, 36, 'crop'); @@ -67,7 +67,7 @@ function RoomProfile({ roomId }) { }); setIsEditing(false); }; - }, [roomId]); + }, [mx, roomId]); const handleOnSubmit = async (e) => { e.preventDefault(); diff --git a/src/app/molecules/room-visibility/RoomVisibility.jsx b/src/app/molecules/room-visibility/RoomVisibility.jsx index a5e8e2d0..6579513a 100644 --- a/src/app/molecules/room-visibility/RoomVisibility.jsx +++ b/src/app/molecules/room-visibility/RoomVisibility.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import './RoomVisibility.scss'; -import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import RadioButton from '../../atoms/button/RadioButton'; @@ -14,6 +13,7 @@ import HashGlobeIC from '../../../../public/res/ic/outlined/hash-globe.svg'; import SpaceIC from '../../../../public/res/ic/outlined/space.svg'; import SpaceLockIC from '../../../../public/res/ic/outlined/space-lock.svg'; import SpaceGlobeIC from '../../../../public/res/ic/outlined/space-globe.svg'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const visibility = { INVITE: 'invite', @@ -21,8 +21,7 @@ const visibility = { PUBLIC: 'public', }; -function setJoinRule(roomId, type) { - const mx = initMatrix.matrixClient; +function setJoinRule(mx, roomId, type) { let allow; if (type === visibility.RESTRICTED) { const { currentState } = mx.getRoom(roomId); @@ -46,26 +45,26 @@ function setJoinRule(roomId, type) { } function useVisibility(roomId) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const [activeType, setActiveType] = useState(room.getJoinRule()); useEffect(() => { setActiveType(room.getJoinRule()); - }, [roomId]); + }, [room]); const setNotification = useCallback((item) => { if (item.type === activeType.type) return; setActiveType(item.type); - setJoinRule(roomId, item.type); - }, [activeType, roomId]); + setJoinRule(mx, roomId, item.type); + }, [mx, activeType, roomId]); return [activeType, setNotification]; } function RoomVisibility({ roomId }) { const [activeType, setVisibility] = useVisibility(roomId); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const isSpace = room.isSpaceRoom(); const { currentState } = room; diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index 2eb94a5c..ff338f3f 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import { useAtomValue } from 'jotai'; import './SpaceAddExisting.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { joinRuleToIconSrc, getIdServer, genRoomVia } from '../../../util/matrixUtil'; @@ -27,6 +26,7 @@ import { roomToParentsAtom } from '../../state/room/roomToParents'; import { useDirects, useRooms, useSpaces } from '../../state/hooks/roomList'; import { allRoomsAtom } from '../../state/room-list/roomList'; import { mDirectAtom } from '../../state/mDirectList'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const mountStore = useStore(roomId); @@ -35,7 +35,7 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const [allRoomIds, setAllRoomIds] = useState([]); const [selected, setSelected] = useState([]); const [searchIds, setSearchIds] = useState(null); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const roomIdToParents = useAtomValue(roomToParentsAtom); const mDirects = useAtomValue(mDirectAtom); const spaces = useSpaces(mx, allRoomsAtom); @@ -48,7 +48,7 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { (rId) => rId !== roomId && !roomIdToParents.get(rId)?.has(roomId) ); setAllRoomIds(allIds); - }, [roomId, onlySpaces]); + }, [spaces, rooms, directs, roomIdToParents, roomId, onlySpaces]); const toggleSelection = (rId) => { if (process !== null) return; @@ -215,7 +215,7 @@ function useVisibilityToggle() { function SpaceAddExisting() { const [data, requestClose] = useVisibilityToggle(); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(data?.roomId); return ( diff --git a/src/app/organisms/create-room/CreateRoom.jsx b/src/app/organisms/create-room/CreateRoom.jsx index ff00cca1..04b2faeb 100644 --- a/src/app/organisms/create-room/CreateRoom.jsx +++ b/src/app/organisms/create-room/CreateRoom.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './CreateRoom.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { openReusableContextMenu } from '../../../client/action/navigation'; @@ -32,6 +31,7 @@ import SpaceGlobeIC from '../../../../public/res/ic/outlined/space-globe.svg'; import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const [joinRule, setJoinRule] = useState(parentId ? 'restricted' : 'invite'); @@ -46,7 +46,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const addressRef = useRef(null); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const userHs = getIdServer(mx.getUserId()); const handleSubmit = async (evt) => { @@ -69,7 +69,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { const powerLevel = roleIndex === 1 ? 101 : undefined; try { - const data = await roomActions.createRoom({ + const data = await roomActions.createRoom(mx, { name, topic, joinRule, @@ -113,7 +113,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) { if (roomAlias === '') return; const roomAddress = `#${roomAlias}:${userHs}`; - if (await isRoomAliasAvailable(roomAddress)) { + if (await isRoomAliasAvailable(mx, roomAddress)) { setIsValidAddress(true); } else { setIsValidAddress(false); @@ -278,7 +278,7 @@ function useWindowToggle() { function CreateRoom() { const [create, onRequestClose] = useWindowToggle(); const { isSpace, parentId } = create ?? {}; - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(parentId); return ( diff --git a/src/app/organisms/emoji-verification/EmojiVerification.jsx b/src/app/organisms/emoji-verification/EmojiVerification.jsx index 1b543c05..21be477f 100644 --- a/src/app/organisms/emoji-verification/EmojiVerification.jsx +++ b/src/app/organisms/emoji-verification/EmojiVerification.jsx @@ -3,7 +3,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './EmojiVerification.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { hasPrivateKey } from '../../../client/state/secretStorageKeys'; @@ -18,23 +17,24 @@ import Dialog from '../../molecules/dialog/Dialog'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useStore } from '../../hooks/useStore'; import { accessSecretStorage } from '../settings/SecretStorageAccess'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function EmojiVerificationContent({ data, requestClose }) { const [sas, setSas] = useState(null); const [process, setProcess] = useState(false); const { request, targetDevice } = data; - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mountStore = useStore(); const beginStore = useStore(); const beginVerification = async () => { if ( - isCrossVerified(mx.deviceId) && + isCrossVerified(mx, mx.deviceId) && (mx.getCrossSigningId() === null || (await mx.crypto.crossSigningInfo.isStoredInKeyCache('self_signing')) === false) ) { - if (!hasPrivateKey(getDefaultSSKey())) { - const keyData = await accessSecretStorage('Emoji verification'); + if (!hasPrivateKey(getDefaultSSKey(mx))) { + const keyData = await accessSecretStorage(mx, 'Emoji verification'); if (!keyData) { request.cancel(); return; @@ -158,7 +158,7 @@ EmojiVerificationContent.propTypes = { function useVisibilityToggle() { const [data, setData] = useState(null); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); useEffect(() => { const handleOpen = (request, targetDevice) => { @@ -170,7 +170,7 @@ function useVisibilityToggle() { navigation.removeListener(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); mx.removeListener('crypto.verification.request', handleOpen); }; - }, []); + }, [mx]); const requestClose = () => setData(null); diff --git a/src/app/organisms/invite-user/InviteUser.jsx b/src/app/organisms/invite-user/InviteUser.jsx index 10f55f9f..284be72e 100644 --- a/src/app/organisms/invite-user/InviteUser.jsx +++ b/src/app/organisms/invite-user/InviteUser.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './InviteUser.scss'; -import initMatrix from '../../../client/initMatrix'; import * as roomActions from '../../../client/action/room'; import { hasDevices } from '../../../util/matrixUtil'; @@ -18,6 +17,7 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import UserIC from '../../../../public/res/ic/outlined/user.svg'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; import { getDMRoomFor } from '../../utils/matrix'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function InviteUser({ isOpen, roomId, searchTerm, onRequestClose }) { const [isSearching, updateIsSearching] = useState(false); @@ -34,7 +34,7 @@ function InviteUser({ isOpen, roomId, searchTerm, onRequestClose }) { const usernameRef = useRef(null); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const { navigateRoom } = useRoomNavigate(); function getMapCopy(myMap) { @@ -118,7 +118,7 @@ function InviteUser({ isOpen, roomId, searchTerm, onRequestClose }) { procUserError.delete(userId); updateUserProcError(getMapCopy(procUserError)); - const result = await roomActions.createDM(userId, await hasDevices(userId)); + const result = await roomActions.createDM(mx, userId, await hasDevices(mx, userId)); roomIdToUserId.set(result.room_id, userId); updateRoomIdToUserId(getMapCopy(roomIdToUserId)); onDMCreated(result.room_id); @@ -137,7 +137,7 @@ function InviteUser({ isOpen, roomId, searchTerm, onRequestClose }) { procUserError.delete(userId); updateUserProcError(getMapCopy(procUserError)); - await roomActions.invite(roomId, userId); + await mx.invite(roomId, userId); invitedUserIds.add(userId); updateInvitedUserIds(new Set(Array.from(invitedUserIds))); diff --git a/src/app/organisms/join-alias/JoinAlias.jsx b/src/app/organisms/join-alias/JoinAlias.jsx index 9fa5542d..99cf6e6e 100644 --- a/src/app/organisms/join-alias/JoinAlias.jsx +++ b/src/app/organisms/join-alias/JoinAlias.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './JoinAlias.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { join } from '../../../client/action/room'; @@ -18,6 +17,7 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useStore } from '../../hooks/useStore'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const ALIAS_OR_ID_REG = /^[#|!].+:.+\..+$/; @@ -25,7 +25,7 @@ function JoinAliasContent({ term, requestClose }) { const [process, setProcess] = useState(false); const [error, setError] = useState(undefined); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mountStore = useStore(); const { navigateRoom } = useRoomNavigate(); @@ -63,7 +63,7 @@ function JoinAliasContent({ term, requestClose }) { } } try { - const roomId = await join(alias, false, via); + const roomId = await join(mx, alias, false, via); if (!mountStore.getItem()) return; openRoom(roomId); } catch { diff --git a/src/app/organisms/profile-editor/ProfileEditor.jsx b/src/app/organisms/profile-editor/ProfileEditor.jsx index c21c82fa..95709355 100644 --- a/src/app/organisms/profile-editor/ProfileEditor.jsx +++ b/src/app/organisms/profile-editor/ProfileEditor.jsx @@ -1,7 +1,6 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; -import initMatrix from '../../../client/initMatrix'; import colorMXID from '../../../util/colorMXID'; import Text from '../../atoms/text/Text'; @@ -14,10 +13,11 @@ import PencilIC from '../../../../public/res/ic/outlined/pencil.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import './ProfileEditor.scss'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ProfileEditor({ userId }) { const [isEditing, setIsEditing] = useState(false); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const user = mx.getUser(mx.getUserId()); const displayNameRef = useRef(null); @@ -37,7 +37,7 @@ function ProfileEditor({ userId }) { return () => { isMounted = false; }; - }, [userId]); + }, [mx, userId]); const handleAvatarUpload = async (url) => { if (url === null) { diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index b19c9c86..b4ab7473 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './ProfileViewer.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import { openReusableContextMenu } from '../../../client/action/navigation'; @@ -36,9 +35,10 @@ import { useForceUpdate } from '../../hooks/useForceUpdate'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; import { getDMRoomFor } from '../../utils/matrix'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function ModerationTools({ roomId, userId }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const roomMember = room.getMember(userId); @@ -56,13 +56,13 @@ function ModerationTools({ roomId, userId }) { const handleKick = (e) => { e.preventDefault(); const kickReason = e.target.elements['kick-reason']?.value.trim(); - roomActions.kick(roomId, userId, kickReason !== '' ? kickReason : undefined); + mx.kick(roomId, userId, kickReason !== '' ? kickReason : undefined); }; const handleBan = (e) => { e.preventDefault(); const banReason = e.target.elements['ban-reason']?.value.trim(); - roomActions.ban(roomId, userId, banReason !== '' ? banReason : undefined); + mx.ban(roomId, userId, banReason !== '' ? banReason : undefined); }; return ( @@ -90,7 +90,7 @@ ModerationTools.propTypes = { function SessionInfo({ userId }) { const [devices, setDevices] = useState(null); const [isVisible, setIsVisible] = useState(false); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); useEffect(() => { let isUnmounted = false; @@ -111,7 +111,7 @@ function SessionInfo({ userId }) { return () => { isUnmounted = true; }; - }, [userId]); + }, [mx, userId]); function renderSessionChips() { if (!isVisible) return null; @@ -139,7 +139,7 @@ function SessionInfo({ userId }) { > {`View ${ devices?.length > 0 - ? `${devices.length} ${devices.length == 1 ? 'session' : 'sessions'}` + ? `${devices.length} ${devices.length === 1 ? 'session' : 'sessions'}` : 'sessions' }`} @@ -155,10 +155,10 @@ SessionInfo.propTypes = { function ProfileFooter({ roomId, userId, onRequestClose }) { const [isCreatingDM, setIsCreatingDM] = useState(false); const [isIgnoring, setIsIgnoring] = useState(false); - const [isUserIgnored, setIsUserIgnored] = useState(initMatrix.matrixClient.isUserIgnored(userId)); + const mx = useMatrixClient(); + const [isUserIgnored, setIsUserIgnored] = useState(mx.isUserIgnored(userId)); const isMountedRef = useRef(true); - const mx = initMatrix.matrixClient; const { navigateRoom } = useRoomNavigate(); const room = mx.getRoom(roomId); const member = room.getMember(userId); @@ -182,10 +182,10 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { }; useEffect(() => { - setIsUserIgnored(initMatrix.matrixClient.isUserIgnored(userId)); + setIsUserIgnored(mx.isUserIgnored(userId)); setIsIgnoring(false); setIsInviting(false); - }, [userId]); + }, [mx, userId]); const openDM = async () => { // Check and open if user already have a DM with userId. @@ -199,7 +199,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { // Create new DM try { setIsCreatingDM(true); - const result = await roomActions.createDM(userId, await hasDevices(userId)); + const result = await roomActions.createDM(mx, userId, await hasDevices(mx, userId)); onCreated(result.room_id); } catch { if (isMountedRef.current === false) return; @@ -213,9 +213,9 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { try { setIsIgnoring(true); if (isIgnored) { - await roomActions.unignore([userId]); + await roomActions.unignore(mx, [userId]); } else { - await roomActions.ignore([userId]); + await roomActions.ignore(mx, [userId]); } if (isMountedRef.current === false) return; @@ -230,9 +230,9 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { try { setIsInviting(true); let isInviteSent = false; - if (isInvited) await roomActions.kick(roomId, userId); + if (isInvited) await mx.kick(roomId, userId); else { - await roomActions.invite(roomId, userId); + await mx.invite(roomId, userId); isInviteSent = true; } if (isMountedRef.current === false) return; @@ -249,7 +249,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { {isCreatingDM ? 'Creating room...' : 'Message'} {isBanned && canIKick && ( - )} @@ -306,7 +306,7 @@ function useToggleDialog() { } function useRerenderOnProfileChange(roomId, userId) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const [, forceUpdate] = useForceUpdate(); useEffect(() => { const handleProfileChange = (mEvent, member) => { @@ -323,19 +323,19 @@ function useRerenderOnProfileChange(roomId, userId) { mx.removeListener('RoomMember.powerLevel', handleProfileChange); mx.removeListener('RoomMember.membership', handleProfileChange); }; - }, [roomId, userId]); + }, [mx, roomId, userId]); } function ProfileViewer() { const [isOpen, roomId, userId, closeDialog, handleAfterClose] = useToggleDialog(); useRerenderOnProfileChange(roomId, userId); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const renderProfile = () => { const roomMember = room.getMember(userId); - const username = roomMember ? getUsernameOfRoomMember(roomMember) : getUsername(userId); + const username = roomMember ? getUsernameOfRoomMember(roomMember) : getUsername(mx, userId); const avatarMxc = roomMember?.getMxcAvatarUrl?.() || mx.getUser(userId)?.avatarUrl; const avatarUrl = avatarMxc && avatarMxc !== 'null' ? mx.mxcUrlToHttp(avatarMxc, 80, 80, 'crop') : null; @@ -364,9 +364,9 @@ function ProfileViewer() { 'caution' ); if (!isConfirmed) return; - roomActions.setPowerLevel(roomId, userId, newPowerLevel); + roomActions.setPowerLevel(mx, roomId, userId, newPowerLevel); } else { - roomActions.setPowerLevel(roomId, userId, newPowerLevel); + roomActions.setPowerLevel(mx, roomId, userId, newPowerLevel); } }; diff --git a/src/app/organisms/room/RoomSettings.jsx b/src/app/organisms/room/RoomSettings.jsx index 2b8f28e6..69f977b2 100644 --- a/src/app/organisms/room/RoomSettings.jsx +++ b/src/app/organisms/room/RoomSettings.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomSettings.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; @@ -30,6 +29,7 @@ import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { confirmDialog } from '../../molecules/confirm-dialog/ConfirmDialog'; import PopupWindow from '../../molecules/popup-window/PopupWindow'; import IconButton from '../../atoms/button/IconButton'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const tabText = { GENERAL: 'General', @@ -68,7 +68,7 @@ const tabItems = [ ]; function GeneralSettings({ roomId }) { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); return ( @@ -155,7 +155,8 @@ function RoomSettings() { const [window, requestClose] = useWindowToggle(setSelectedTab); const isOpen = window !== null; const roomId = window?.roomId; - const room = initMatrix.matrixClient.getRoom(roomId); + const mx = useMatrixClient(); + const room = mx.getRoom(roomId); const handleTabChange = (tabItem) => { setSelectedTab(tabItem); diff --git a/src/app/organisms/search/Search.jsx b/src/app/organisms/search/Search.jsx index 0990a03f..ebdac396 100644 --- a/src/app/organisms/search/Search.jsx +++ b/src/app/organisms/search/Search.jsx @@ -2,12 +2,10 @@ import React, { useState, useEffect, useRef, useCallback } from 'react'; import { useAtomValue } from 'jotai'; import './Search.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import AsyncSearch from '../../../util/AsyncSearch'; import { joinRuleToIconSrc } from '../../../util/matrixUtil'; -import { roomIdByActivity } from '../../../util/sort'; import Text from '../../atoms/text/Text'; import RawIcon from '../../atoms/system-icons/RawIcon'; @@ -27,6 +25,8 @@ import { allRoomsAtom } from '../../state/room-list/roomList'; import { mDirectAtom } from '../../state/mDirectList'; import { useKeyDown } from '../../hooks/useKeyDown'; import { openSearch } from '../../../client/action/navigation'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { factoryRoomIdByActivity } from '../../utils/sort'; function useVisiblityToggle(setResult) { const [isOpen, setIsOpen] = useState(false); @@ -77,9 +77,7 @@ function useVisiblityToggle(setResult) { return [isOpen, requestClose]; } -function mapRoomIds(roomIds, directs, roomIdToParents) { - const mx = initMatrix.matrixClient; - +function mapRoomIds(mx, roomIds, directs, roomIdToParents) { return roomIds.map((roomId) => { const room = mx.getRoom(roomId); const parentSet = roomIdToParents.get(roomId); @@ -107,7 +105,7 @@ function Search() { const [asyncSearch] = useState(new AsyncSearch()); const [isOpen, requestClose] = useVisiblityToggle(setResult); const searchRef = useRef(null); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const { navigateRoom, navigateSpace } = useRoomNavigate(); const mDirects = useAtomValue(mDirectAtom); const spaces = useSpaces(mx, allRoomsAtom); @@ -141,8 +139,8 @@ function Search() { ids = [...rooms].concat([...directs], [...spaces]); } - ids.sort(roomIdByActivity); - const mappedIds = mapRoomIds(ids, directs, roomToParents); + ids.sort(factoryRoomIdByActivity(mx)); + const mappedIds = mapRoomIds(mx, ids, directs, roomToParents); asyncSearch.setup(mappedIds, { keys: 'name', isContain: true, limit: 20 }); if (prefix) handleSearchResults(mappedIds, prefix); else asyncSearch.search(term); @@ -150,7 +148,7 @@ function Search() { const loadRecentRooms = () => { const recentRooms = []; - handleSearchResults(mapRoomIds(recentRooms, directs, roomToParents).reverse()); + handleSearchResults(mapRoomIds(mx, recentRooms, directs, roomToParents).reverse()); }; const handleAfterOpen = () => { diff --git a/src/app/organisms/settings/AuthRequest.jsx b/src/app/organisms/settings/AuthRequest.jsx index ca07c2a2..f897f83c 100644 --- a/src/app/organisms/settings/AuthRequest.jsx +++ b/src/app/organisms/settings/AuthRequest.jsx @@ -2,7 +2,6 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import './AuthRequest.scss'; -import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; @@ -11,6 +10,7 @@ import Input from '../../atoms/input/Input'; import Spinner from '../../atoms/spinner/Spinner'; import { useStore } from '../../hooks/useStore'; +import { getSecret } from '../../../client/state/auth'; let lastUsedPassword; const getAuthId = (password) => ({ @@ -18,7 +18,7 @@ const getAuthId = (password) => ({ password, identifier: { type: 'm.id.user', - user: initMatrix.matrixClient.getUserId(), + user: getSecret().userId, }, }); diff --git a/src/app/organisms/settings/CrossSigning.jsx b/src/app/organisms/settings/CrossSigning.jsx index 9d848d5a..b993e32f 100644 --- a/src/app/organisms/settings/CrossSigning.jsx +++ b/src/app/organisms/settings/CrossSigning.jsx @@ -4,7 +4,6 @@ import './CrossSigning.scss'; import FileSaver from 'file-saver'; import { Formik } from 'formik'; -import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; import { copyToClipboard } from '../../../util/common'; import { clearSecretStorageKeys } from '../../../client/state/secretStorageKeys'; @@ -17,6 +16,7 @@ import SettingTile from '../../molecules/setting-tile/SettingTile'; import { authRequest } from './AuthRequest'; import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const failedDialog = () => { const renderFailure = (requestClose) => ( @@ -73,9 +73,9 @@ const securityKeyDialog = (key) => { function CrossSigningSetup() { const initialValues = { phrase: '', confirmPhrase: '' }; const [genWithPhrase, setGenWithPhrase] = useState(undefined); + const mx = useMatrixClient(); const setup = async (securityPhrase = undefined) => { - const mx = initMatrix.matrixClient; setGenWithPhrase(typeof securityPhrase === 'string'); const recoveryKey = await mx.createRecoveryKeyFromPassphrase(securityPhrase); clearSecretStorageKeys(); diff --git a/src/app/organisms/settings/DeviceManage.jsx b/src/app/organisms/settings/DeviceManage.jsx index 4a4f141c..9fa8273e 100644 --- a/src/app/organisms/settings/DeviceManage.jsx +++ b/src/app/organisms/settings/DeviceManage.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import './DeviceManage.scss'; import dateFormat from 'dateformat'; -import initMatrix from '../../../client/initMatrix'; import { isCrossVerified } from '../../../util/matrixUtil'; import { openReusableDialog, openEmojiVerification } from '../../../client/action/navigation'; @@ -26,6 +25,7 @@ import { useStore } from '../../hooks/useStore'; import { useDeviceList } from '../../hooks/useDeviceList'; import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; import { accessSecretStorage } from './SecretStorageAccess'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; const promptDeviceName = async (deviceName) => new Promise((resolve) => { let isCompleted = false; @@ -63,14 +63,14 @@ const promptDeviceName = async (deviceName) => new Promise((resolve) => { function DeviceManage() { const TRUNCATED_COUNT = 4; - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const isCSEnabled = useCrossSigningStatus(); const deviceList = useDeviceList(); const [processing, setProcessing] = useState([]); const [truncated, setTruncated] = useState(true); const mountStore = useStore(); mountStore.setItem(true); - const isMeVerified = isCrossVerified(mx.deviceId); + const isMeVerified = isCrossVerified(mx, mx.deviceId); useEffect(() => { setProcessing([]); @@ -130,7 +130,7 @@ function DeviceManage() { }; const verifyWithKey = async (device) => { - const keyData = await accessSecretStorage('Session verification'); + const keyData = await accessSecretStorage(mx, 'Session verification'); if (!keyData) return; addToProcessing(device); await mx.checkOwnCrossSigningTrust(); @@ -191,7 +191,7 @@ function DeviceManage() { )} {isCurrentDevice && ( - {`Session Key: ${initMatrix.matrixClient.getDeviceEd25519Key().match(/.{1,4}/g).join(' ')}`} + {`Session Key: ${mx.getDeviceEd25519Key().match(/.{1,4}/g).join(' ')}`} )} @@ -204,7 +204,7 @@ function DeviceManage() { const verified = []; const noEncryption = []; deviceList.sort((a, b) => b.last_seen_ts - a.last_seen_ts).forEach((device) => { - const isVerified = isCrossVerified(device.device_id); + const isVerified = isCrossVerified(mx, device.device_id); if (isVerified === true) { verified.push(device); } else if (isVerified === false) { diff --git a/src/app/organisms/settings/KeyBackup.jsx b/src/app/organisms/settings/KeyBackup.jsx index b4f2125e..47be511a 100644 --- a/src/app/organisms/settings/KeyBackup.jsx +++ b/src/app/organisms/settings/KeyBackup.jsx @@ -3,7 +3,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './KeyBackup.scss'; -import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; import { deletePrivateKey } from '../../../client/state/secretStorageKeys'; @@ -22,10 +21,11 @@ import DownloadIC from '../../../../public/res/ic/outlined/download.svg'; import { useStore } from '../../hooks/useStore'; import { useCrossSigningStatus } from '../../hooks/useCrossSigningStatus'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function CreateKeyBackupDialog({ keyData }) { const [done, setDone] = useState(false); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mountStore = useStore(); const doBackup = async () => { @@ -80,7 +80,7 @@ CreateKeyBackupDialog.propTypes = { function RestoreKeyBackupDialog({ keyData }) { const [status, setStatus] = useState(false); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mountStore = useStore(); const restoreBackup = async () => { @@ -150,7 +150,7 @@ RestoreKeyBackupDialog.propTypes = { function DeleteKeyBackupDialog({ requestClose }) { const [isDeleting, setIsDeleting] = useState(false); - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const mountStore = useStore(); const deleteBackup = async () => { @@ -187,7 +187,7 @@ DeleteKeyBackupDialog.propTypes = { }; function KeyBackup() { - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const isCSEnabled = useCrossSigningStatus(); const [keyBackup, setKeyBackup] = useState(undefined); const mountStore = useStore(); @@ -215,7 +215,7 @@ function KeyBackup() { }, [isCSEnabled]); const openCreateKeyBackup = async () => { - const keyData = await accessSecretStorage('Create Key Backup'); + const keyData = await accessSecretStorage(mx, 'Create Key Backup'); if (keyData === null) return; openReusableDialog( @@ -228,7 +228,7 @@ function KeyBackup() { }; const openRestoreKeyBackup = async () => { - const keyData = await accessSecretStorage('Restore Key Backup'); + const keyData = await accessSecretStorage(mx, 'Restore Key Backup'); if (keyData === null) return; openReusableDialog( diff --git a/src/app/organisms/settings/SecretStorageAccess.jsx b/src/app/organisms/settings/SecretStorageAccess.jsx index e4fceb07..02882a41 100644 --- a/src/app/organisms/settings/SecretStorageAccess.jsx +++ b/src/app/organisms/settings/SecretStorageAccess.jsx @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import './SecretStorageAccess.scss'; import { deriveKey } from 'matrix-js-sdk/lib/crypto/key_passphrase'; -import initMatrix from '../../../client/initMatrix'; import { openReusableDialog } from '../../../client/action/navigation'; import { getDefaultSSKey, getSSKeyInfo } from '../../../util/matrixUtil'; import { storePrivateKey, hasPrivateKey, getPrivateKey } from '../../../client/state/secretStorageKeys'; @@ -14,11 +13,12 @@ import Input from '../../atoms/input/Input'; import Spinner from '../../atoms/spinner/Spinner'; import { useStore } from '../../hooks/useStore'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function SecretStorageAccess({ onComplete }) { - const mx = initMatrix.matrixClient; - const sSKeyId = getDefaultSSKey(); - const sSKeyInfo = getSSKeyInfo(sSKeyId); + const mx = useMatrixClient(); + const sSKeyId = getDefaultSSKey(mx); + const sSKeyInfo = getSSKeyInfo(mx, sSKeyId); const isPassphrase = !!sSKeyInfo.passphrase; const [withPhrase, setWithPhrase] = useState(isPassphrase); const [process, setProcess] = useState(false); @@ -98,12 +98,13 @@ SecretStorageAccess.propTypes = { }; /** + * @param {MatrixClient} mx Matrix client * @param {string} title Title of secret storage access dialog * @returns {Promise} resolve to keyData or null */ -export const accessSecretStorage = (title) => new Promise((resolve) => { +export const accessSecretStorage = (mx, title) => new Promise((resolve) => { let isCompleted = false; - const defaultSSKey = getDefaultSSKey(); + const defaultSSKey = getDefaultSSKey(mx); if (hasPrivateKey(defaultSSKey)) { resolve({ keyId: defaultSSKey, privateKey: getPrivateKey(defaultSSKey) }); return; diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 47abb45c..f2951b81 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import './Settings.scss'; -import initMatrix from '../../../client/initMatrix'; +import { clearCacheAndReload, logoutClient } from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; import navigation from '../../../client/state/navigation'; @@ -47,6 +47,7 @@ import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { isMacOS } from '../../utils/user-agent'; import { KeySymbol } from '../../utils/key-symbol'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; function AppearanceSection() { const [, updateState] = useState({}); @@ -332,6 +333,8 @@ function SecuritySection() { } function AboutSection() { + const mx = useMatrixClient(); + return (
    @@ -348,7 +351,7 @@ function AboutSection() {
    - +
    @@ -437,11 +440,12 @@ function useWindowToggle(setSelectedTab) { function Settings() { const [selectedTab, setSelectedTab] = useState(tabItems[0]); const [isOpen, requestClose] = useWindowToggle(setSelectedTab); + const mx = useMatrixClient(); const handleTabChange = (tabItem) => setSelectedTab(tabItem); const handleLogout = async () => { if (await confirmDialog('Logout', 'Are you sure that you want to logout your session?', 'Logout', 'danger')) { - initMatrix.logout(); + logoutClient(mx); } }; @@ -462,7 +466,7 @@ function Settings() { > {isOpen && (
    - + tab.text === selectedTab.text)} diff --git a/src/app/organisms/space-settings/SpaceSettings.jsx b/src/app/organisms/space-settings/SpaceSettings.jsx index ff6c1863..9f2069d4 100644 --- a/src/app/organisms/space-settings/SpaceSettings.jsx +++ b/src/app/organisms/space-settings/SpaceSettings.jsx @@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './SpaceSettings.scss'; -import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; @@ -59,8 +58,8 @@ const tabItems = [ ]; function GeneralSettings({ roomId }) { - const roomName = initMatrix.matrixClient.getRoom(roomId)?.name; const mx = useMatrixClient(); + const roomName = mx.getRoom(roomId)?.name; return ( <> @@ -124,7 +123,7 @@ function SpaceSettings() { const isOpen = window !== null; const roomId = window?.roomId; - const mx = initMatrix.matrixClient; + const mx = useMatrixClient(); const room = mx.getRoom(roomId); const handleTabChange = (tabItem) => { diff --git a/src/app/pages/client/ClientLayout.tsx b/src/app/pages/client/ClientLayout.tsx index 208d12e4..4a077ba6 100644 --- a/src/app/pages/client/ClientLayout.tsx +++ b/src/app/pages/client/ClientLayout.tsx @@ -7,7 +7,7 @@ type ClientLayoutProps = { }; export function ClientLayout({ nav, children }: ClientLayoutProps) { return ( - + {nav} {children} diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx index c36adfc6..a590e0bc 100644 --- a/src/app/pages/client/ClientRoot.tsx +++ b/src/app/pages/client/ClientRoot.tsx @@ -1,6 +1,27 @@ -import { Box, Spinner, Text } from 'folds'; -import React, { ReactNode, useEffect, useState } from 'react'; -import initMatrix from '../../../client/initMatrix'; +import { + Box, + Button, + config, + Dialog, + Icon, + IconButton, + Icons, + Menu, + MenuItem, + PopOut, + RectCords, + Spinner, + Text, +} from 'folds'; +import { HttpApiEvent, HttpApiEventHandlerMap, MatrixClient } from 'matrix-js-sdk'; +import FocusTrap from 'focus-trap-react'; +import React, { MouseEventHandler, ReactNode, useCallback, useEffect, useState } from 'react'; +import { + clearCacheAndReload, + initClient, + logoutClient, + startClient, +} from '../../../client/initMatrix'; import { getSecret } from '../../../client/state/auth'; import { SplashScreen } from '../../components/splash-screen'; import { CapabilitiesAndMediaConfigLoader } from '../../components/CapabilitiesAndMediaConfigLoader'; @@ -13,6 +34,10 @@ import Dialogs from '../../organisms/pw/Dialogs'; import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; +import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; +import { useSyncState } from '../../hooks/useSyncState'; +import { stopPropagation } from '../../utils/keyboard'; +import { SyncStatus } from './SyncStatus'; function SystemEmojiFeature() { const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); @@ -37,6 +62,89 @@ function ClientRootLoading() { ); } +function ClientRootOptions({ mx }: { mx: MatrixClient }) { + const [menuAnchor, setMenuAnchor] = useState(); + + const handleToggle: MouseEventHandler = (evt) => { + const cords = evt.currentTarget.getBoundingClientRect(); + setMenuAnchor((currentState) => { + if (currentState) return undefined; + return cords; + }); + }; + + return ( + + + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, + }} + > + + + clearCacheAndReload(mx)} size="300" radii="300"> + + Clear Cache and Reload + + + logoutClient(mx)} + size="300" + radii="300" + variant="Critical" + fill="None" + > + + Logout + + + + + + } + /> + + ); +} + +const useLogoutListener = (mx?: MatrixClient) => { + useEffect(() => { + const handleLogout: HttpApiEventHandlerMap[HttpApiEvent.SessionLoggedOut] = async () => { + mx?.stopClient(); + await mx?.clearStores(); + window.localStorage.clear(); + window.location.reload(); + }; + + mx?.on(HttpApiEvent.SessionLoggedOut, handleLogout); + return () => { + mx?.removeListener(HttpApiEvent.SessionLoggedOut, handleLogout); + }; + }, [mx]); +}; + type ClientRootProps = { children: ReactNode; }; @@ -44,30 +152,71 @@ export function ClientRoot({ children }: ClientRootProps) { const [loading, setLoading] = useState(true); const { baseUrl } = getSecret(); + const [loadState, loadMatrix] = useAsyncCallback( + useCallback(() => initClient(getSecret() as any), []) + ); + const mx = loadState.status === AsyncStatus.Success ? loadState.data : undefined; + const [startState, startMatrix] = useAsyncCallback( + useCallback((m) => startClient(m), []) + ); + + useLogoutListener(mx); + useEffect(() => { - const handleStart = () => { - setLoading(false); - }; - initMatrix.once('init_loading_finished', handleStart); - if (!initMatrix.matrixClient) initMatrix.init(); - return () => { - initMatrix.removeListener('init_loading_finished', handleStart); - }; - }, []); + if (loadState.status === AsyncStatus.Idle) { + loadMatrix(); + } + }, [loadState, loadMatrix]); + + useEffect(() => { + if (mx && !mx.clientRunning) { + startMatrix(mx); + } + }, [mx, startMatrix]); + + useSyncState( + mx, + useCallback((state) => { + if (state === 'PREPARED') { + setLoading(false); + } + }, []) + ); return ( - {loading ? ( + {mx && } + {loading && mx && } + {(loadState.status === AsyncStatus.Error || startState.status === AsyncStatus.Error) && ( + + + + + {loadState.status === AsyncStatus.Error && ( + {`Failed to load. ${loadState.error.message}`} + )} + {startState.status === AsyncStatus.Error && ( + {`Failed to load. ${startState.error.message}`} + )} + + + + + + )} + {loading || !mx ? ( ) : ( - + {(capabilities, mediaConfig) => ( {children} - - {/* TODO: remove these components after navigation refactor */} diff --git a/src/app/pages/client/SyncStatus.tsx b/src/app/pages/client/SyncStatus.tsx new file mode 100644 index 00000000..9cd4b0b2 --- /dev/null +++ b/src/app/pages/client/SyncStatus.tsx @@ -0,0 +1,87 @@ +import { MatrixClient, SyncState } from 'matrix-js-sdk'; +import React, { useCallback, useState } from 'react'; +import { Box, config, Line, Text } from 'folds'; +import { useSyncState } from '../../hooks/useSyncState'; +import { ContainerColor } from '../../styles/ContainerColor.css'; + +type StateData = { + current: SyncState | null; + previous: SyncState | null | undefined; +}; + +type SyncStatusProps = { + mx: MatrixClient; +}; +export function SyncStatus({ mx }: SyncStatusProps) { + const [stateData, setStateData] = useState({ + current: null, + previous: undefined, + }); + + useSyncState( + mx, + useCallback((current, previous) => { + setStateData((s) => { + if (s.current === current && s.previous === previous) { + return s; + } + return { current, previous }; + }); + }, []) + ); + + if ( + (stateData.current === SyncState.Prepared || + stateData.current === SyncState.Syncing || + stateData.current === SyncState.Catchup) && + stateData.previous !== SyncState.Syncing + ) { + return ( + + + Connecting... + + + + ); + } + + if (stateData.current === SyncState.Reconnecting) { + return ( + + + Connection Lost! Reconnecting... + + + + ); + } + + if (stateData.current === SyncState.Error) { + return ( + + + Connection Lost! + + + + ); + } + + return null; +} diff --git a/src/app/pages/client/WelcomePage.tsx b/src/app/pages/client/WelcomePage.tsx index 2486625f..5040d15f 100644 --- a/src/app/pages/client/WelcomePage.tsx +++ b/src/app/pages/client/WelcomePage.tsx @@ -18,7 +18,7 @@ export function WelcomePage() { title="Welcome to Cinny" subTitle={ - Yet anothor matrix client.{' '} + Yet another matrix client.{' '} void; }; const DirectMenu = forwardRef(({ requestClose }, ref) => { + const mx = useMatrixClient(); const orphanRooms = useDirectRooms(); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); const handleMarkAsRead = () => { if (!unread) return; - orphanRooms.forEach((rId) => markAsRead(rId)); + orphanRooms.forEach((rId) => markAsRead(mx, rId)); requestClose(); }; diff --git a/src/app/pages/client/home/Home.tsx b/src/app/pages/client/home/Home.tsx index a06e108e..f9923f46 100644 --- a/src/app/pages/client/home/Home.tsx +++ b/src/app/pages/client/home/Home.tsx @@ -55,10 +55,11 @@ type HomeMenuProps = { const HomeMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useHomeRooms(); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + const mx = useMatrixClient(); const handleMarkAsRead = () => { if (!unread) return; - orphanRooms.forEach((rId) => markAsRead(rId)); + orphanRooms.forEach((rId) => markAsRead(mx, rId)); requestClose(); }; diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 8b9d1847..a01ecb8e 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -356,7 +356,7 @@ function RoomNotificationsGroupComp({ onOpen(room.roomId, eventId); }; const handleMarkAsRead = () => { - markAsRead(room.roomId); + markAsRead(mx, room.roomId); }; return ( diff --git a/src/app/pages/client/sidebar/DirectTab.tsx b/src/app/pages/client/sidebar/DirectTab.tsx index 0beb17d8..849fc365 100644 --- a/src/app/pages/client/sidebar/DirectTab.tsx +++ b/src/app/pages/client/sidebar/DirectTab.tsx @@ -30,10 +30,11 @@ type DirectMenuProps = { const DirectMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useDirectRooms(); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + const mx = useMatrixClient(); const handleMarkAsRead = () => { if (!unread) return; - orphanRooms.forEach((rId) => markAsRead(rId)); + orphanRooms.forEach((rId) => markAsRead(mx, rId)); requestClose(); }; diff --git a/src/app/pages/client/sidebar/HomeTab.tsx b/src/app/pages/client/sidebar/HomeTab.tsx index 41f7c648..dcb0a498 100644 --- a/src/app/pages/client/sidebar/HomeTab.tsx +++ b/src/app/pages/client/sidebar/HomeTab.tsx @@ -31,10 +31,11 @@ type HomeMenuProps = { const HomeMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useHomeRooms(); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); + const mx = useMatrixClient(); const handleMarkAsRead = () => { if (!unread) return; - orphanRooms.forEach((rId) => markAsRead(rId)); + orphanRooms.forEach((rId) => markAsRead(mx, rId)); requestClose(); }; diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index 8635a35f..7b3e61e7 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -114,7 +114,7 @@ const SpaceMenu = forwardRef( const unread = useRoomsUnread(allChild, roomToUnreadAtom); const handleMarkAsRead = () => { - allChild.forEach((childRoomId) => markAsRead(childRoomId)); + allChild.forEach((childRoomId) => markAsRead(mx, childRoomId)); requestClose(); }; diff --git a/src/app/pages/client/space/Space.tsx b/src/app/pages/client/space/Space.tsx index e947373b..e280c603 100644 --- a/src/app/pages/client/space/Space.tsx +++ b/src/app/pages/client/space/Space.tsx @@ -95,7 +95,7 @@ const SpaceMenu = forwardRef(({ room, requestClo const unread = useRoomsUnread(allChild, roomToUnreadAtom); const handleMarkAsRead = () => { - allChild.forEach((childRoomId) => markAsRead(childRoomId)); + allChild.forEach((childRoomId) => markAsRead(mx, childRoomId)); requestClose(); }; diff --git a/src/client/action/notifications.js b/src/client/action/notifications.ts similarity index 69% rename from src/client/action/notifications.js rename to src/client/action/notifications.ts index 579c7c3c..17ea1ed6 100644 --- a/src/client/action/notifications.js +++ b/src/client/action/notifications.ts @@ -1,13 +1,11 @@ -import initMatrix from '../initMatrix'; +import { MatrixClient } from "matrix-js-sdk"; -// eslint-disable-next-line import/prefer-default-export -export async function markAsRead(roomId) { - const mx = initMatrix.matrixClient; +export async function markAsRead(mx: MatrixClient, roomId: string) { const room = mx.getRoom(roomId); if (!room) return; const timeline = room.getLiveTimeline().getEvents(); - const readEventId = room.getEventReadUpTo(mx.getUserId()); + const readEventId = room.getEventReadUpTo(mx.getUserId()!); const getLatestValidEvent = () => { for (let i = timeline.length - 1; i >= 0; i -= 1) { diff --git a/src/client/action/room.js b/src/client/action/room.js index c2d11438..cd4995b9 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -1,16 +1,13 @@ -import initMatrix from '../initMatrix'; -import appDispatcher from '../dispatcher'; -import cons from '../state/cons'; import { getIdServer } from '../../util/matrixUtil'; /** * https://github.com/matrix-org/matrix-react-sdk/blob/1e6c6e9d800890c732d60429449bc280de01a647/src/Rooms.js#L73 + * @param {MatrixClient} mx Matrix client * @param {string} roomId Id of room to add * @param {string} userId User id to which dm || undefined to remove * @returns {Promise} A promise */ -function addRoomToMDirect(roomId, userId) { - const mx = initMatrix.matrixClient; +function addRoomToMDirect(mx, roomId, userId) { const mDirectsEvent = mx.getAccountData('m.direct'); let userIdToRoomIds = {}; @@ -79,24 +76,22 @@ function guessDMRoomTargetId(room, myUserId) { return oldestMember.userId; } -function convertToDm(roomId) { - const mx = initMatrix.matrixClient; +function convertToDm(mx, roomId) { const room = mx.getRoom(roomId); - return addRoomToMDirect(roomId, guessDMRoomTargetId(room, mx.getUserId())); + return addRoomToMDirect(mx, roomId, guessDMRoomTargetId(room, mx.getUserId())); } -function convertToRoom(roomId) { - return addRoomToMDirect(roomId, undefined); +function convertToRoom(mx, roomId) { + return addRoomToMDirect(mx, roomId, undefined); } /** - * + * @param {MatrixClient} mx * @param {string} roomId * @param {boolean} isDM * @param {string[]} via */ -async function join(roomIdOrAlias, isDM = false, via = undefined) { - const mx = initMatrix.matrixClient; +async function join(mx, roomIdOrAlias, isDM = false, via = undefined) { const roomIdParts = roomIdOrAlias.split(':'); const viaServers = via || [roomIdParts[1]]; @@ -105,7 +100,7 @@ async function join(roomIdOrAlias, isDM = false, via = undefined) { if (isDM) { const targetUserId = guessDMRoomTargetId(mx.getRoom(resultRoom.roomId), mx.getUserId()); - await addRoomToMDirect(resultRoom.roomId, targetUserId); + await addRoomToMDirect(mx, resultRoom.roomId, targetUserId); } return resultRoom.roomId; } catch (e) { @@ -113,12 +108,11 @@ async function join(roomIdOrAlias, isDM = false, via = undefined) { } } -async function create(options, isDM = false) { - const mx = initMatrix.matrixClient; +async function create(mx, options, isDM = false) { try { const result = await mx.createRoom(options); if (isDM && typeof options.invite?.[0] === 'string') { - await addRoomToMDirect(result.room_id, options.invite[0]); + await addRoomToMDirect(mx, result.room_id, options.invite[0]); } return result; } catch (e) { @@ -130,7 +124,7 @@ async function create(options, isDM = false) { } } -async function createDM(userIdOrIds, isEncrypted = true) { +async function createDM(mx, userIdOrIds, isEncrypted = true) { const options = { is_direct: true, invite: Array.isArray(userIdOrIds) ? userIdOrIds : [userIdOrIds], @@ -148,11 +142,11 @@ async function createDM(userIdOrIds, isEncrypted = true) { }); } - const result = await create(options, true); + const result = await create(mx, options, true); return result; } -async function createRoom(opts) { +async function createRoom(mx, opts) { // joinRule: 'public' | 'invite' | 'restricted' const { name, topic, joinRule } = opts; const alias = opts.alias ?? undefined; @@ -162,7 +156,6 @@ async function createRoom(opts) { const powerLevel = opts.powerLevel ?? undefined; const blockFederation = opts.blockFederation ?? false; - const mx = initMatrix.matrixClient; const visibility = joinRule === 'public' ? 'public' : 'private'; const options = { creation_content: undefined, @@ -225,7 +218,7 @@ async function createRoom(opts) { }); } - const result = await create(options); + const result = await create(mx, options); if (parentId) { await mx.sendStateEvent(parentId, 'm.space.child', { @@ -238,51 +231,19 @@ async function createRoom(opts) { return result; } -async function invite(roomId, userId, reason) { - const mx = initMatrix.matrixClient; - - const result = await mx.invite(roomId, userId, undefined, reason); - return result; -} - -async function kick(roomId, userId, reason) { - const mx = initMatrix.matrixClient; - - const result = await mx.kick(roomId, userId, reason); - return result; -} - -async function ban(roomId, userId, reason) { - const mx = initMatrix.matrixClient; - - const result = await mx.ban(roomId, userId, reason); - return result; -} - -async function unban(roomId, userId) { - const mx = initMatrix.matrixClient; - - const result = await mx.unban(roomId, userId); - return result; -} - -async function ignore(userIds) { - const mx = initMatrix.matrixClient; +async function ignore(mx, userIds) { let ignoredUsers = mx.getIgnoredUsers().concat(userIds); ignoredUsers = [...new Set(ignoredUsers)]; await mx.setIgnoredUsers(ignoredUsers); } -async function unignore(userIds) { - const mx = initMatrix.matrixClient; - +async function unignore(mx, userIds) { const ignoredUsers = mx.getIgnoredUsers(); await mx.setIgnoredUsers(ignoredUsers.filter((id) => !userIds.includes(id))); } -async function setPowerLevel(roomId, userId, powerLevel) { - const mx = initMatrix.matrixClient; +async function setPowerLevel(mx, roomId, userId, powerLevel) { const room = mx.getRoom(roomId); const powerlevelEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; @@ -291,8 +252,7 @@ async function setPowerLevel(roomId, userId, powerLevel) { return result; } -async function setMyRoomNick(roomId, nick) { - const mx = initMatrix.matrixClient; +async function setMyRoomNick(mx, roomId, nick) { const room = mx.getRoom(roomId); const mEvent = room.currentState.getStateEvents('m.room.member', mx.getUserId()); const content = mEvent?.getContent(); @@ -303,8 +263,7 @@ async function setMyRoomNick(roomId, nick) { }, mx.getUserId()); } -async function setMyRoomAvatar(roomId, mxc) { - const mx = initMatrix.matrixClient; +async function setMyRoomAvatar(mx, roomId, mxc) { const room = mx.getRoom(roomId); const mEvent = room.currentState.getStateEvents('m.room.member', mx.getUserId()); const content = mEvent?.getContent(); @@ -320,7 +279,6 @@ export { convertToRoom, join, createDM, createRoom, - invite, kick, ban, unban, ignore, unignore, setPowerLevel, setMyRoomNick, setMyRoomAvatar, diff --git a/src/client/initMatrix.js b/src/client/initMatrix.js deleted file mode 100644 index 0352ff36..00000000 --- a/src/client/initMatrix.js +++ /dev/null @@ -1,128 +0,0 @@ -import EventEmitter from 'events'; -import * as sdk from 'matrix-js-sdk'; -import Olm from '@matrix-org/olm'; -import { logger } from 'matrix-js-sdk/lib/logger'; - -import { getSecret } from './state/auth'; -import { cryptoCallbacks } from './state/secretStorageKeys'; - -global.Olm = Olm; - -if (import.meta.env.PROD) { - logger.disableAll(); -} - -class InitMatrix extends EventEmitter { - async init() { - if (this.matrixClient || this.initializing) { - console.warn('Client is already initialized!') - return; - } - this.initializing = true; - - try { - await this.startClient(); - this.setupSync(); - this.listenEvents(); - this.initializing = false; - } catch { - this.initializing = false; - } - } - - async startClient() { - const indexedDBStore = new sdk.IndexedDBStore({ - indexedDB: global.indexedDB, - localStorage: global.localStorage, - dbName: 'web-sync-store', - }); - await indexedDBStore.startup(); - const secret = getSecret(); - - this.matrixClient = sdk.createClient({ - baseUrl: secret.baseUrl, - accessToken: secret.accessToken, - userId: secret.userId, - store: indexedDBStore, - cryptoStore: new sdk.IndexedDBCryptoStore(global.indexedDB, 'crypto-store'), - deviceId: secret.deviceId, - timelineSupport: true, - cryptoCallbacks, - verificationMethods: [ - 'm.sas.v1', - ], - }); - - await this.matrixClient.initCrypto(); - - await this.matrixClient.startClient({ - lazyLoadMembers: true, - }); - this.matrixClient.setGlobalErrorOnUnknownDevices(false); - this.matrixClient.setMaxListeners(50); - } - - setupSync() { - const sync = { - NULL: () => { - console.log('NULL state'); - }, - SYNCING: () => { - console.log('SYNCING state'); - }, - PREPARED: (prevState) => { - console.log('PREPARED state'); - console.log('Previous state: ', prevState); - global.initMatrix = this; - if (prevState === null) { - this.emit('init_loading_finished'); - } - }, - RECONNECTING: () => { - console.log('RECONNECTING state'); - }, - CATCHUP: () => { - console.log('CATCHUP state'); - }, - ERROR: () => { - console.log('ERROR state'); - }, - STOPPED: () => { - console.log('STOPPED state'); - }, - }; - this.matrixClient.on('sync', (state, prevState) => sync[state](prevState)); - } - - listenEvents() { - this.matrixClient.on('Session.logged_out', async () => { - this.matrixClient.stopClient(); - await this.matrixClient.clearStores(); - window.localStorage.clear(); - window.location.reload(); - }); - } - - async logout() { - this.matrixClient.stopClient(); - try { - await this.matrixClient.logout(); - } catch { - // ignore if failed to logout - } - await this.matrixClient.clearStores(); - window.localStorage.clear(); - window.location.reload(); - } - - clearCacheAndReload() { - this.matrixClient.stopClient(); - this.matrixClient.store.deleteAllData().then(() => { - window.location.reload(); - }); - } -} - -const initMatrix = new InitMatrix(); - -export default initMatrix; diff --git a/src/client/initMatrix.ts b/src/client/initMatrix.ts new file mode 100644 index 00000000..5a156ad8 --- /dev/null +++ b/src/client/initMatrix.ts @@ -0,0 +1,70 @@ +import { createClient, MatrixClient, IndexedDBStore, IndexedDBCryptoStore } from 'matrix-js-sdk'; +import Olm from '@matrix-org/olm'; +import { logger } from 'matrix-js-sdk/lib/logger'; + +import { cryptoCallbacks } from './state/secretStorageKeys'; + +global.Olm = Olm; + +if (import.meta.env.PROD) { + logger.disableAll(); +} + +type Session = { + baseUrl: string; + accessToken: string; + userId: string; + deviceId: string; +}; + +export const initClient = async (session: Session): Promise => { + const indexedDBStore = new IndexedDBStore({ + indexedDB: global.indexedDB, + localStorage: global.localStorage, + dbName: 'web-sync-store', + }); + await indexedDBStore.startup(); + + const mx = createClient({ + baseUrl: session.baseUrl, + accessToken: session.accessToken, + userId: session.userId, + store: indexedDBStore, + cryptoStore: new IndexedDBCryptoStore(global.indexedDB, 'crypto-store'), + deviceId: session.deviceId, + timelineSupport: true, + cryptoCallbacks: cryptoCallbacks as any, + verificationMethods: ['m.sas.v1'], + }); + + await mx.initCrypto(); + + mx.setGlobalErrorOnUnknownDevices(false); + mx.setMaxListeners(50); + + return mx; +}; + +export const startClient = async (mx: MatrixClient) => { + await mx.startClient({ + lazyLoadMembers: true, + }); +}; + +export const clearCacheAndReload = async (mx: MatrixClient) => { + mx.stopClient(); + await mx.store.deleteAllData(); + window.location.reload(); +}; + +export const logoutClient = async (mx: MatrixClient) => { + mx.stopClient(); + try { + await mx.logout(); + } catch { + // ignore if failed to logout + } + await mx.clearStores(); + window.localStorage.clear(); + window.location.reload(); +}; diff --git a/src/client/mx.ts b/src/client/mx.ts deleted file mode 100644 index 30909458..00000000 --- a/src/client/mx.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { MatrixClient } from 'matrix-js-sdk'; -import initMatrix from './initMatrix'; - -export const mx = (): MatrixClient => { - if (!initMatrix.matrixClient) console.error('Matrix client is used before initialization!'); - return initMatrix.matrixClient!; -}; diff --git a/src/index.scss b/src/index.scss index 5903858a..1c223051 100644 --- a/src/index.scss +++ b/src/index.scss @@ -409,6 +409,8 @@ body { #root { width: 100%; height: 100%; + display: flex; + flex-direction: column; } *, diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index 74e56ec7..e4fd40c3 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -1,5 +1,3 @@ -import initMatrix from '../client/initMatrix'; - import HashIC from '../../public/res/ic/outlined/hash.svg'; import HashGlobeIC from '../../public/res/ic/outlined/hash-globe.svg'; import HashLockIC from '../../public/res/ic/outlined/hash-lock.svg'; @@ -24,8 +22,7 @@ export async function getBaseUrl(servername) { } } -export function getUsername(userId) { - const mx = initMatrix.matrixClient; +export function getUsername(mx, userId) { const user = mx.getUser(userId); if (user === null) return userId; let username = user.displayName; @@ -39,9 +36,9 @@ export function getUsernameOfRoomMember(roomMember) { return roomMember.name || roomMember.userId; } -export async function isRoomAliasAvailable(alias) { +export async function isRoomAliasAvailable(mx, alias) { try { - const result = await initMatrix.matrixClient.getRoomIdForAlias(alias); + const result = await mx.getRoomIdForAlias(alias); if (result.room_id) return false; return false; } catch (e) { @@ -159,9 +156,8 @@ export function genRoomVia(room) { return via.concat(mostPop3.slice(0, 2)); } -export function isCrossVerified(deviceId) { +export function isCrossVerified(mx, deviceId) { try { - const mx = initMatrix.matrixClient; const crossSignInfo = mx.getStoredCrossSigningForUser(mx.getUserId()); const deviceInfo = mx.getStoredDevice(mx.getUserId(), deviceId); const deviceTrust = crossSignInfo.checkDeviceTrust(crossSignInfo, deviceInfo, false, true); @@ -172,14 +168,12 @@ export function isCrossVerified(deviceId) { } } -export function hasCrossSigningAccountData() { - const mx = initMatrix.matrixClient; +export function hasCrossSigningAccountData(mx) { const masterKeyData = mx.getAccountData('m.cross_signing.master'); return !!masterKeyData; } -export function getDefaultSSKey() { - const mx = initMatrix.matrixClient; +export function getDefaultSSKey(mx) { try { return mx.getAccountData('m.secret_storage.default_key').getContent().key; } catch { @@ -187,8 +181,7 @@ export function getDefaultSSKey() { } } -export function getSSKeyInfo(key) { - const mx = initMatrix.matrixClient; +export function getSSKeyInfo(mx, key) { try { return mx.getAccountData(`m.secret_storage.key.${key}`).getContent(); } catch { @@ -196,8 +189,7 @@ export function getSSKeyInfo(key) { } } -export async function hasDevices(userId) { - const mx = initMatrix.matrixClient; +export async function hasDevices(mx, userId) { try { const usersDeviceMap = await mx.downloadKeys([userId, mx.getUserId()]); return Object.values(usersDeviceMap) diff --git a/src/util/sort.js b/src/util/sort.js index f9a0b790..cc73cf57 100644 --- a/src/util/sort.js +++ b/src/util/sort.js @@ -1,30 +1,3 @@ -import initMatrix from '../client/initMatrix'; - -export function roomIdByActivity(id1, id2) { - const room1 = initMatrix.matrixClient.getRoom(id1); - const room2 = initMatrix.matrixClient.getRoom(id2); - - return room2.getLastActiveTimestamp() - room1.getLastActiveTimestamp(); -} - -export function roomIdByAtoZ(aId, bId) { - let aName = initMatrix.matrixClient.getRoom(aId).name; - let bName = initMatrix.matrixClient.getRoom(bId).name; - - // remove "#" from the room name - // To ignore it in sorting - aName = aName.replace(/#/g, ''); - bName = bName.replace(/#/g, ''); - - if (aName.toLowerCase() < bName.toLowerCase()) { - return -1; - } - if (aName.toLowerCase() > bName.toLowerCase()) { - return 1; - } - return 0; -} - export function memberByAtoZ(m1, m2) { const aName = m1.name; const bName = m2.name; From e6d6b0349ebb07b713a54acd6b4eed5abc8bbde9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 23 Jul 2024 10:44:32 +0530 Subject: [PATCH 593/824] Fix unread reset and notification settings (#1824) * reset unread with client sync state change * fix notification toggle setting not working * revert formatOnSave vscode setting --- .eslintrc.cjs | 8 ++++ src/app/hooks/usePermission.js | 28 -------------- src/app/hooks/usePermission.ts | 30 +++++++++++++++ src/app/organisms/settings/Settings.jsx | 29 ++++++++------- src/app/pages/client/ClientNonUIFeatures.tsx | 5 ++- src/app/state/room/roomToUnread.ts | 7 +++- src/client/action/settings.js | 12 ------ src/client/state/cons.js | 4 -- src/client/state/settings.js | 39 -------------------- 9 files changed, 62 insertions(+), 100 deletions(-) delete mode 100644 src/app/hooks/usePermission.js create mode 100644 src/app/hooks/usePermission.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 36101fbe..9d5a27d9 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -61,4 +61,12 @@ module.exports = { "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-shadow": "error" }, + overrides: [ + { + files: ['*.ts'], + rules: { + 'no-undef': 'off', + }, + }, + ], }; diff --git a/src/app/hooks/usePermission.js b/src/app/hooks/usePermission.js deleted file mode 100644 index 5dc76078..00000000 --- a/src/app/hooks/usePermission.js +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable import/prefer-default-export */ - -import { useEffect, useState } from 'react'; - -export function usePermission(name, initial) { - const [state, setState] = useState(initial); - - useEffect(() => { - let descriptor; - - const update = () => setState(descriptor.state); - - if (navigator.permissions?.query) { - navigator.permissions.query({ name }).then((_descriptor) => { - descriptor = _descriptor; - - update(); - descriptor.addEventListener('change', update); - }); - } - - return () => { - if (descriptor) descriptor.removeEventListener('change', update); - }; - }, []); - - return [state, setState]; -} diff --git a/src/app/hooks/usePermission.ts b/src/app/hooks/usePermission.ts new file mode 100644 index 00000000..5a3ec9f6 --- /dev/null +++ b/src/app/hooks/usePermission.ts @@ -0,0 +1,30 @@ +import { useEffect, useState } from "react"; + +export function usePermissionState(name: PermissionName, initialValue: PermissionState = 'prompt') { + const [permissionState, setPermissionState] = useState(initialValue); + + useEffect(() => { + let permissionStatus: PermissionStatus; + + function handlePermissionChange(this: PermissionStatus) { + setPermissionState(this.state); + } + + navigator.permissions + .query({ name }) + .then((permStatus: PermissionStatus) => { + permissionStatus = permStatus; + handlePermissionChange.apply(permStatus); + permStatus.addEventListener("change", handlePermissionChange); + }) + .catch(() => { + // Silence error since FF doesn't support microphone permission + }); + + return () => { + permissionStatus?.removeEventListener("change", handlePermissionChange); + }; + }, [name]); + + return permissionState; +} \ No newline at end of file diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index f2951b81..779931df 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -7,9 +7,8 @@ import settings from '../../../client/state/settings'; import navigation from '../../../client/state/navigation'; import { toggleSystemTheme, - toggleNotifications, toggleNotificationSounds, } from '../../../client/action/settings'; -import { usePermission } from '../../hooks/usePermission'; +import { usePermissionState } from '../../hooks/usePermission'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; @@ -230,23 +229,25 @@ function AppearanceSection() { } function NotificationsSection() { - const [permission, setPermission] = usePermission('notifications', window.Notification?.permission); - - const [, updateState] = useState({}); + const notifPermission = usePermissionState('notifications', window.Notification?.permission ?? "denied"); + const [showNotifications, setShowNotifications] = useSetting(settingsAtom, 'showNotifications') + const [isNotificationSounds, setIsNotificationSounds] = useSetting(settingsAtom, 'isNotificationSounds') const renderOptions = () => { if (window.Notification === undefined) { return Not supported in this browser.; } - if (permission === 'granted') { + if (notifPermission === 'denied') { + return Permission Denied + } + + if (notifPermission === 'granted') { return ( { - toggleNotifications(); - setPermission(window.Notification?.permission); - updateState({}); + setShowNotifications(!showNotifications); }} /> ); @@ -255,7 +256,9 @@ function NotificationsSection() { return ( @@ -275,8 +278,8 @@ function NotificationsSection() { title="Notification Sound" options={( { toggleNotificationSounds(); updateState({}); }} + isActive={isNotificationSounds} + onToggle={() => setIsNotificationSounds(!isNotificationSounds)} /> )} content={Play sound when new messages arrive.} diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 947764ca..5f557aa7 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -58,6 +58,7 @@ function InviteNotifications() { const mx = useMatrixClient(); const navigate = useNavigate(); + const [showNotifications] = useSetting(settingsAtom, 'showNotifications'); const [notificationSound] = useSetting(settingsAtom, 'isNotificationSounds'); const notify = useCallback( @@ -84,7 +85,7 @@ function InviteNotifications() { useEffect(() => { if (invites.length > perviousInviteLen && mx.getSyncState() === 'SYNCING') { - if (Notification.permission === 'granted') { + if (showNotifications && Notification.permission === 'granted') { notify(invites.length - perviousInviteLen); } @@ -92,7 +93,7 @@ function InviteNotifications() { playSound(); } } - }, [mx, invites, perviousInviteLen, notificationSound, notify, playSound]); + }, [mx, invites, perviousInviteLen, showNotifications, notificationSound, notify, playSound]); return ( // eslint-disable-next-line jsx-a11y/media-has-caption diff --git a/src/app/state/room/roomToUnread.ts b/src/app/state/room/roomToUnread.ts index 5a009405..8cb9d958 100644 --- a/src/app/state/room/roomToUnread.ts +++ b/src/app/state/room/roomToUnread.ts @@ -185,8 +185,11 @@ export const useBindRoomToUnreadAtom = ( useSyncState( mx, useCallback( - (state) => { - if (state === SyncState.Prepared) { + (state, prevState) => { + if ( + (state === SyncState.Prepared && prevState === null) || + (state === SyncState.Syncing && prevState !== SyncState.Syncing) + ) { setUnreadAtom({ type: 'RESET', unreadInfos: getUnreadInfos(mx), diff --git a/src/client/action/settings.js b/src/client/action/settings.js index 7b539c8d..e849702b 100644 --- a/src/client/action/settings.js +++ b/src/client/action/settings.js @@ -30,15 +30,3 @@ export function toggleNickAvatarEvents() { type: cons.actions.settings.TOGGLE_NICKAVATAR_EVENT, }); } - -export function toggleNotifications() { - appDispatcher.dispatch({ - type: cons.actions.settings.TOGGLE_NOTIFICATIONS, - }); -} - -export function toggleNotificationSounds() { - appDispatcher.dispatch({ - type: cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS, - }); -} diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 523e871a..353ce47d 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -52,8 +52,6 @@ const cons = { TOGGLE_PEOPLE_DRAWER: 'TOGGLE_PEOPLE_DRAWER', TOGGLE_MEMBERSHIP_EVENT: 'TOGGLE_MEMBERSHIP_EVENT', TOGGLE_NICKAVATAR_EVENT: 'TOGGLE_NICKAVATAR_EVENT', - TOGGLE_NOTIFICATIONS: 'TOGGLE_NOTIFICATIONS', - TOGGLE_NOTIFICATION_SOUNDS: 'TOGGLE_NOTIFICATION_SOUNDS', }, }, events: { @@ -81,8 +79,6 @@ const cons = { PEOPLE_DRAWER_TOGGLED: 'PEOPLE_DRAWER_TOGGLED', MEMBERSHIP_EVENTS_TOGGLED: 'MEMBERSHIP_EVENTS_TOGGLED', NICKAVATAR_EVENTS_TOGGLED: 'NICKAVATAR_EVENTS_TOGGLED', - NOTIFICATIONS_TOGGLED: 'NOTIFICATIONS_TOGGLED', - NOTIFICATION_SOUNDS_TOGGLED: 'NOTIFICATION_SOUNDS_TOGGLED', }, }, }; diff --git a/src/client/state/settings.js b/src/client/state/settings.js index d39b2ca1..bf9562cc 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -33,8 +33,6 @@ class Settings extends EventEmitter { this.isPeopleDrawer = this.getIsPeopleDrawer(); this.hideMembershipEvents = this.getHideMembershipEvents(); this.hideNickAvatarEvents = this.getHideNickAvatarEvents(); - this._showNotifications = this.getShowNotifications(); - this.isNotificationSounds = this.getIsNotificationSounds(); this.darkModeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); @@ -137,29 +135,6 @@ class Settings extends EventEmitter { return settings.isPeopleDrawer; } - get showNotifications() { - if (window.Notification?.permission !== 'granted') return false; - return this._showNotifications; - } - - getShowNotifications() { - if (typeof this._showNotifications === 'boolean') return this._showNotifications; - - const settings = getSettings(); - if (settings === null) return true; - if (typeof settings.showNotifications === 'undefined') return true; - return settings.showNotifications; - } - - getIsNotificationSounds() { - if (typeof this.isNotificationSounds === 'boolean') return this.isNotificationSounds; - - const settings = getSettings(); - if (settings === null) return true; - if (typeof settings.isNotificationSounds === 'undefined') return true; - return settings.isNotificationSounds; - } - setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { @@ -185,20 +160,6 @@ class Settings extends EventEmitter { setSettings('hideNickAvatarEvents', this.hideNickAvatarEvents); this.emit(cons.events.settings.NICKAVATAR_EVENTS_TOGGLED, this.hideNickAvatarEvents); }, - [cons.actions.settings.TOGGLE_NOTIFICATIONS]: async () => { - if (window.Notification?.permission !== 'granted') { - this._showNotifications = false; - } else { - this._showNotifications = !this._showNotifications; - } - setSettings('showNotifications', this._showNotifications); - this.emit(cons.events.settings.NOTIFICATIONS_TOGGLED, this._showNotifications); - }, - [cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS]: () => { - this.isNotificationSounds = !this.isNotificationSounds; - setSettings('isNotificationSounds', this.isNotificationSounds); - this.emit(cons.events.settings.NOTIFICATION_SOUNDS_TOGGLED, this.isNotificationSounds); - }, }; actions[action.type]?.(); From a32c8bf2282947c7fc61558e1a54700652cf0e64 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 23 Jul 2024 10:45:17 +0530 Subject: [PATCH 594/824] Load room member even when member drawer is closed (#1825) --- src/app/features/lobby/Lobby.tsx | 4 +++- src/app/features/room/MembersDrawer.tsx | 5 ++--- src/app/features/room/Room.tsx | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/app/features/lobby/Lobby.tsx b/src/app/features/lobby/Lobby.tsx index 62df2769..c9637235 100644 --- a/src/app/features/lobby/Lobby.tsx +++ b/src/app/features/lobby/Lobby.tsx @@ -47,6 +47,7 @@ import { import { useOrphanSpaces } from '../../state/hooks/roomList'; import { roomToParentsAtom } from '../../state/room/roomToParents'; import { AccountDataEvent } from '../../../types/matrix/accountData'; +import { useRoomMembers } from '../../hooks/useRoomMembers'; export function Lobby() { const navigate = useNavigate(); @@ -57,6 +58,7 @@ export function Lobby() { const space = useSpace(); const spacePowerLevels = usePowerLevels(space); const lex = useMemo(() => new ASCIILexicalTable(' '.charCodeAt(0), '~'.charCodeAt(0), 6), []); + const members = useRoomMembers(mx, space.roomId); const scrollRef = useRef(null); const heroSectionRef = useRef(null); @@ -519,7 +521,7 @@ export function Lobby() { {screenSize === ScreenSize.Desktop && isDrawer && ( <> - + )} diff --git a/src/app/features/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx index 70a9aa34..15d07412 100644 --- a/src/app/features/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -35,7 +35,6 @@ import classNames from 'classnames'; import { openProfileViewer } from '../../../client/action/navigation'; import * as css from './MembersDrawer.css'; -import { useRoomMembers } from '../../hooks/useRoomMembers'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { Membership } from '../../../types/matrix/room'; import { UseStateProvider } from '../../components/UseStateProvider'; @@ -168,13 +167,13 @@ const getRoomMemberStr: SearchItemStrGetter = (m, query) => type MembersDrawerProps = { room: Room; + members: RoomMember[]; }; -export function MembersDrawer({ room }: MembersDrawerProps) { +export function MembersDrawer({ room, members }: MembersDrawerProps) { const mx = useMatrixClient(); const scrollRef = useRef(null); const searchInputRef = useRef(null); const scrollTopAnchorRef = useRef(null); - const members = useRoomMembers(mx, room.roomId); const getPowerLevelTag = usePowerLevelTags(); const fetchingMembers = members.length < room.getJoinedMemberCount(); const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx index 19ac53e1..ee3e7027 100644 --- a/src/app/features/room/Room.tsx +++ b/src/app/features/room/Room.tsx @@ -12,6 +12,7 @@ import { useRoom } from '../../hooks/useRoom'; import { useKeyDown } from '../../hooks/useKeyDown'; import { markAsRead } from '../../../client/action/notifications'; import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { useRoomMembers } from '../../hooks/useRoomMembers'; export function Room() { const { eventId } = useParams(); @@ -21,6 +22,7 @@ export function Room() { const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); const screenSize = useScreenSizeContext(); const powerLevels = usePowerLevels(room); + const members = useRoomMembers(mx, room.roomId); useKeyDown( window, @@ -30,7 +32,7 @@ export function Room() { markAsRead(mx, room.roomId); } }, - [room.roomId] + [mx, room.roomId] ) ); @@ -41,7 +43,7 @@ export function Room() { {screenSize === ScreenSize.Desktop && isDrawer && ( <> - + )} From cc4c222975eadbb382e591e79b37fdc56c479ee9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:15:51 +1000 Subject: [PATCH 595/824] Bump docker/build-push-action from 6.4.0 to 6.5.0 (#1834) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.4.0 to 6.5.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.4.0...v6.5.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index fdeb237f..7b1e2abd 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Build Docker image - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.5.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 7bc82b42..30444481 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.5.0 with: context: . platforms: linux/amd64,linux/arm64 From ab73225f00d0ad97cb5af4d3c5761032e003a222 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:16:16 +1000 Subject: [PATCH 596/824] Bump softprops/action-gh-release from 2.0.6 to 2.0.8 (#1833) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.6 to 2.0.8. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/a74c6b72af54cfa997e81df42d94703d6313a2d0...c062e08bd532815e2082a85e87e3ef29c3e6d191) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 30444481..43460734 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -52,7 +52,7 @@ jobs: gpg --export | xxd -p echo '${{ secrets.GNUPG_PASSPHRASE }}' | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --armor --detach-sign cinny-${{ steps.vars.outputs.tag }}.tar.gz - name: Upload tagged release - uses: softprops/action-gh-release@a74c6b72af54cfa997e81df42d94703d6313a2d0 + uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 with: files: | cinny-${{ steps.vars.outputs.tag }}.tar.gz From 98a378ad8a1d53bf326235c0666348b38a8c07b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:16:38 +1000 Subject: [PATCH 597/824] Bump docker/setup-buildx-action from 3.4.0 to 3.5.0 (#1832) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3.4.0...v3.5.0) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 43460734..76c6ffc1 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.4.0 + uses: docker/setup-buildx-action@v3.5.0 - name: Login to Docker Hub uses: docker/login-action@v3.2.0 with: From da536c8c3f192cef653d072eebd43c90799ffe33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:16:56 +1000 Subject: [PATCH 598/824] Bump docker/login-action from 3.2.0 to 3.3.0 (#1831) Bumps [docker/login-action](https://github.com/docker/login-action) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3.2.0...v3.3.0) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 76c6ffc1..bee0035d 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -72,12 +72,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.5.0 - name: Login to Docker Hub - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to the Container registry - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} From 3110505b21247ca6586e23efeceef8fb27ac2323 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:17:12 +1000 Subject: [PATCH 599/824] Bump docker/setup-qemu-action from 3.1.0 to 3.2.0 (#1830) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index bee0035d..a0a70d13 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -68,7 +68,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Set up QEMU - uses: docker/setup-qemu-action@v3.1.0 + uses: docker/setup-qemu-action@v3.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.5.0 - name: Login to Docker Hub From b387370aaf96c7bb6fae4c4aafcd364afa0f7856 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 23 Jul 2024 19:22:53 +0530 Subject: [PATCH 600/824] Add setting for page zoom (#1835) * add setting for page zoom * parse integer in zoom change listener * fix zoom input width * fix null gets saved as page zoom --- src/app/organisms/settings/Settings.jsx | 451 +++++++++++++------ src/app/pages/client/ClientNonUIFeatures.tsx | 26 ++ src/app/pages/client/ClientRoot.tsx | 17 +- src/app/state/settings.ts | 2 + 4 files changed, 341 insertions(+), 155 deletions(-) diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx index 779931df..6329a57f 100644 --- a/src/app/organisms/settings/Settings.jsx +++ b/src/app/organisms/settings/Settings.jsx @@ -1,13 +1,13 @@ import React, { useState, useEffect } from 'react'; +import { Input, toRem } from 'folds'; +import { isKeyHotkey } from 'is-hotkey'; import './Settings.scss'; import { clearCacheAndReload, logoutClient } from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import settings from '../../../client/state/settings'; import navigation from '../../../client/state/navigation'; -import { - toggleSystemTheme, -} from '../../../client/action/settings'; +import { toggleSystemTheme } from '../../../client/action/settings'; import { usePermissionState } from '../../hooks/usePermission'; import Text from '../../atoms/text/Text'; @@ -55,14 +55,41 @@ function AppearanceSection() { const [messageLayout, setMessageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing, setMessageSpacing] = useSetting(settingsAtom, 'messageSpacing'); const [twitterEmoji, setTwitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); + const [pageZoom, setPageZoom] = useSetting(settingsAtom, 'pageZoom'); const [isMarkdown, setIsMarkdown] = useSetting(settingsAtom, 'isMarkdown'); - const [hideMembershipEvents, setHideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); - const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents'); + const [hideMembershipEvents, setHideMembershipEvents] = useSetting( + settingsAtom, + 'hideMembershipEvents' + ); + const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting( + settingsAtom, + 'hideNickAvatarEvents' + ); const [mediaAutoLoad, setMediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); const [urlPreview, setUrlPreview] = useSetting(settingsAtom, 'urlPreview'); const [encUrlPreview, setEncUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); const [showHiddenEvents, setShowHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); - const spacings = ['0', '100', '200', '300', '400', '500'] + const spacings = ['0', '100', '200', '300', '400', '500']; + + const [currentZoom, setCurrentZoom] = useState(`${pageZoom}`); + + const handleZoomChange = (evt) => { + setCurrentZoom(evt.target.value); + }; + + const handleZoomEnter = (evt) => { + if (isKeyHotkey('escape', evt)) { + evt.stopPropagation(); + setCurrentZoom(pageZoom); + } + if (isKeyHotkey('enter', evt)) { + const newZoom = parseInt(evt.target.value, 10); + if (Number.isNaN(newZoom)) return; + const safeZoom = Math.max(Math.min(newZoom, 150), 75); + setPageZoom(safeZoom); + setCurrentZoom(safeZoom); + } + }; return (
    @@ -70,17 +97,20 @@ function AppearanceSection() { Theme { toggleSystemTheme(); updateState({}); }} + onToggle={() => { + toggleSystemTheme(); + updateState({}); + }} /> - )} + } content={Use light or dark mode based on the system settings.} /> - )} + } /> setTwitterEmoji(!twitterEmoji)} - /> - )} + options={ + setTwitterEmoji(!twitterEmoji)} /> + } content={Use Twitter emoji instead of system emoji.} /> + %} + /> + } + content={ + + Change page zoom to scale user interface between 75% to 150%. Default: 100% + + } + />
    Room messages @@ -114,113 +164,106 @@ function AppearanceSection() { title="Message Layout" content={ setMessageLayout(index)} - /> + selected={messageLayout} + segments={[{ text: 'Modern' }, { text: 'Compact' }, { text: 'Bubble' }]} + onSelect={(index) => setMessageLayout(index)} + /> } /> s === messageSpacing)} - segments={[ - { text: 'No' }, - { text: 'XXS' }, - { text: 'XS' }, - { text: 'S' }, - { text: 'M' }, - { text: 'L' }, - ]} - onSelect={(index) => { - setMessageSpacing(spacings[index]) - }} - /> + selected={spacings.findIndex((s) => s === messageSpacing)} + segments={[ + { text: 'No' }, + { text: 'XXS' }, + { text: 'XS' }, + { text: 'S' }, + { text: 'M' }, + { text: 'L' }, + ]} + onSelect={(index) => { + setMessageSpacing(spacings[index]); + }} + /> } /> setEnterForNewline(!enterForNewline) } + onToggle={() => setEnterForNewline(!enterForNewline)} /> - )} - content={{`Use ${isMacOS() ? KeySymbol.Command : 'Ctrl'} + ENTER to send message and ENTER for newline.`}} + } + content={ + {`Use ${ + isMacOS() ? KeySymbol.Command : 'Ctrl' + } + ENTER to send message and ENTER for newline.`} + } /> setIsMarkdown(!isMarkdown) } - /> - )} + options={ setIsMarkdown(!isMarkdown)} />} content={Format messages with markdown syntax before sending.} /> setHideMembershipEvents(!hideMembershipEvents)} /> - )} - content={Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and Ban)} + } + content={ + + Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and + Ban) + + } /> setHideNickAvatarEvents(!hideNickAvatarEvents)} /> - )} - content={Hide nick and avatar change messages from room timeline.} + } + content={ + Hide nick and avatar change messages from room timeline. + } /> setMediaAutoLoad(!mediaAutoLoad)} - /> - )} - content={Prevent images and videos from auto loading to save bandwidth.} + options={ + setMediaAutoLoad(!mediaAutoLoad)} /> + } + content={ + Prevent images and videos from auto loading to save bandwidth. + } /> setUrlPreview(!urlPreview)} - /> - )} + options={ setUrlPreview(!urlPreview)} />} content={Show url preview for link in messages.} /> setEncUrlPreview(!encUrlPreview)} - /> - )} + options={ + setEncUrlPreview(!encUrlPreview)} /> + } content={Show url preview for link in encrypted messages.} /> setShowHiddenEvents(!showHiddenEvents)} /> - )} + } content={Show hidden state and message events.} />
    @@ -229,19 +272,29 @@ function AppearanceSection() { } function NotificationsSection() { - const notifPermission = usePermissionState('notifications', window.Notification?.permission ?? "denied"); - const [showNotifications, setShowNotifications] = useSetting(settingsAtom, 'showNotifications') - const [isNotificationSounds, setIsNotificationSounds] = useSetting(settingsAtom, 'isNotificationSounds') + const notifPermission = usePermissionState( + 'notifications', + window.Notification?.permission ?? 'denied' + ); + const [showNotifications, setShowNotifications] = useSetting(settingsAtom, 'showNotifications'); + const [isNotificationSounds, setIsNotificationSounds] = useSetting( + settingsAtom, + 'isNotificationSounds' + ); const renderOptions = () => { if (window.Notification === undefined) { - return Not supported in this browser.; + return ( + + Not supported in this browser. + + ); } if (notifPermission === 'denied') { - return Permission Denied + return Permission Denied; } - + if (notifPermission === 'granted') { return ( window.Notification.requestPermission().then(() => { - setShowNotifications(window.Notification?.permission === 'granted'); - })} + onClick={() => + window.Notification.requestPermission().then(() => { + setShowNotifications(window.Notification?.permission === 'granted'); + }) + } > Request permission @@ -276,12 +331,12 @@ function NotificationsSection() { /> setIsNotificationSounds(!isNotificationSounds)} /> - )} + } content={Play sound when new messages arrive.} />
    @@ -295,8 +350,12 @@ function NotificationsSection() { function EmojiSection() { return ( <> -
    -
    +
    + +
    +
    + +
    ); } @@ -314,21 +373,29 @@ function SecuritySection() { Export/Import encryption keys - Export end-to-end encryption room keys to decrypt old messages in other session. In order to encrypt keys you need to set a password, which will be used while importing. + + Export end-to-end encryption room keys to decrypt old messages in other session. In + order to encrypt keys you need to set a password, which will be used while + importing. + - )} + } /> - {'To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you\'ll have to enter the password you set in order to decrypt it.'} + + { + "To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you'll have to enter the password you set in order to decrypt it." + } + - )} + } />
    @@ -337,7 +404,7 @@ function SecuritySection() { function AboutSection() { const mx = useMatrixClient(); - + return (
    @@ -347,14 +414,21 @@ function AboutSection() {
    Cinny - {`v${cons.version}`} + {`v${cons.version}`} Yet another matrix client
    - + - +
    @@ -364,20 +438,104 @@ function AboutSection() {
    @@ -393,32 +551,38 @@ export const tabText = { SECURITY: 'Security', ABOUT: 'About', }; -const tabItems = [{ - text: tabText.APPEARANCE, - iconSrc: SunIC, - disabled: false, - render: () => , -}, { - text: tabText.NOTIFICATIONS, - iconSrc: BellIC, - disabled: false, - render: () => , -}, { - text: tabText.EMOJI, - iconSrc: EmojiIC, - disabled: false, - render: () => , -}, { - text: tabText.SECURITY, - iconSrc: LockIC, - disabled: false, - render: () => , -}, { - text: tabText.ABOUT, - iconSrc: InfoIC, - disabled: false, - render: () => , -}]; +const tabItems = [ + { + text: tabText.APPEARANCE, + iconSrc: SunIC, + disabled: false, + render: () => , + }, + { + text: tabText.NOTIFICATIONS, + iconSrc: BellIC, + disabled: false, + render: () => , + }, + { + text: tabText.EMOJI, + iconSrc: EmojiIC, + disabled: false, + render: () => , + }, + { + text: tabText.SECURITY, + iconSrc: LockIC, + disabled: false, + render: () => , + }, + { + text: tabText.ABOUT, + iconSrc: InfoIC, + disabled: false, + render: () => , + }, +]; function useWindowToggle(setSelectedTab) { const [isOpen, setIsOpen] = useState(false); @@ -447,7 +611,14 @@ function Settings() { const handleTabChange = (tabItem) => setSelectedTab(tabItem); const handleLogout = async () => { - if (await confirmDialog('Logout', 'Are you sure that you want to logout your session?', 'Logout', 'danger')) { + if ( + await confirmDialog( + 'Logout', + 'Are you sure that you want to logout your session?', + 'Logout', + 'danger' + ) + ) { logoutClient(mx); } }; @@ -456,15 +627,19 @@ function Settings() { Settings} - contentOptions={( + title={ + + Settings + + } + contentOptions={ <> - )} + } onRequestClose={requestClose} > {isOpen && ( @@ -475,9 +650,7 @@ function Settings() { defaultSelected={tabItems.findIndex((tab) => tab.text === selectedTab.text)} onSelect={handleTabChange} /> -
    - { selectedTab.render() } -
    +
    {selectedTab.render()}
    )} diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 5f557aa7..845fceb3 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -26,6 +26,30 @@ import { getMxIdLocalPart } from '../../utils/matrix'; import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; import { useInboxNotificationsSelected } from '../../hooks/router/useInbox'; +function SystemEmojiFeature() { + const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); + + if (twitterEmoji) { + document.documentElement.style.setProperty('--font-emoji', 'Twemoji'); + } else { + document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); + } + + return null; +} + +function PageZoomFeature() { + const [pageZoom] = useSetting(settingsAtom, 'pageZoom'); + + if (pageZoom === 100) { + document.documentElement.style.removeProperty('font-size'); + } else { + document.documentElement.style.setProperty('font-size', `calc(1em * ${pageZoom / 100})`); + } + + return null; +} + function FaviconUpdater() { const roomToUnread = useAtomValue(roomToUnreadAtom); @@ -233,6 +257,8 @@ type ClientNonUIFeaturesProps = { export function ClientNonUIFeatures({ children }: ClientNonUIFeaturesProps) { return ( <> + + diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx index a590e0bc..f30bf63a 100644 --- a/src/app/pages/client/ClientRoot.tsx +++ b/src/app/pages/client/ClientRoot.tsx @@ -32,25 +32,11 @@ import { SpecVersions } from './SpecVersions'; import Windows from '../../organisms/pw/Windows'; import Dialogs from '../../organisms/pw/Dialogs'; import ReusableContextMenu from '../../atoms/context-menu/ReusableContextMenu'; -import { useSetting } from '../../state/hooks/settings'; -import { settingsAtom } from '../../state/settings'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { useSyncState } from '../../hooks/useSyncState'; import { stopPropagation } from '../../utils/keyboard'; import { SyncStatus } from './SyncStatus'; -function SystemEmojiFeature() { - const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); - - if (twitterEmoji) { - document.documentElement.style.setProperty('--font-emoji', 'Twemoji'); - } else { - document.documentElement.style.setProperty('--font-emoji', 'Twemoji_DISABLED'); - } - - return null; -} - function ClientRootLoading() { return ( @@ -198,7 +184,7 @@ export function ClientRoot({ children }: ClientRootProps) { {startState.status === AsyncStatus.Error && ( {`Failed to load. ${startState.error.message}`} )} -
    - ); - } -); + return ( + + + } + radii="300" + disabled={!unread} + > + + Mark as Read + + + + + + } + radii="300" + disabled={!canInvite} + > + + Invite + + + } + radii="300" + > + + Copy Link + + + } + radii="300" + > + + Room Settings + + + + + + + {(promptLeave, setPromptLeave) => ( + <> + setPromptLeave(true)} + variant="Critical" + fill="None" + size="300" + after={} + radii="300" + aria-pressed={promptLeave} + > + + Leave Room + + + {promptLeave && ( + setPromptLeave(false)} + /> + )} + + )} + + + + ); +}); export function RoomViewHeader() { const navigate = useNavigate(); @@ -195,8 +187,6 @@ export function RoomViewHeader() { const avatarUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined : undefined; const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); - const location = useLocation(); - const currentPath = joinPathComponent(location); const handleSearchClick = () => { const searchParams: _SearchPathSearchParams = { @@ -336,11 +326,7 @@ export function RoomViewHeader() { escapeDeactivates: stopPropagation, }} > - setMenuAnchor(undefined)} - /> + setMenuAnchor(undefined)} /> } /> diff --git a/src/app/features/room/message/Message.tsx b/src/app/features/room/message/Message.tsx index 6db366ac..d8b2b3e5 100644 --- a/src/app/features/room/message/Message.tsx +++ b/src/app/features/room/message/Message.tsx @@ -51,7 +51,7 @@ import { getMemberAvatarMxc, getMemberDisplayName, } from '../../../utils/room'; -import { getCanonicalAliasOrRoomId, getMxIdLocalPart } from '../../../utils/matrix'; +import { getCanonicalAliasOrRoomId, getMxIdLocalPart, isRoomAlias } from '../../../utils/matrix'; import { MessageLayout, MessageSpacing } from '../../../state/settings'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useRecentEmoji } from '../../../hooks/useRecentEmoji'; @@ -63,18 +63,10 @@ import { EmojiBoard } from '../../../components/emoji-board'; import { ReactionViewer } from '../reaction-viewer'; import { MessageEditor } from './MessageEditor'; import { UserAvatar } from '../../../components/user-avatar'; -import { useSpaceOptionally } from '../../../hooks/useSpace'; -import { useDirectSelected } from '../../../hooks/router/useDirectSelected'; -import { - getDirectRoomPath, - getHomeRoomPath, - getOriginBaseUrl, - getSpaceRoomPath, - withOriginBaseUrl, -} from '../../../pages/pathUtils'; import { copyToClipboard } from '../../../utils/dom'; -import { useClientConfig } from '../../../hooks/useClientConfig'; import { stopPropagation } from '../../../utils/keyboard'; +import { getMatrixToRoomEvent } from '../../../plugins/matrix-to'; +import { getViaServers } from '../../../plugins/via-servers'; export type ReactionHandler = (keyOrMxc: string, shortcode: string) => void; @@ -321,23 +313,13 @@ export const MessageCopyLinkItem = as< } >(({ room, mEvent, onClose, ...props }, ref) => { const mx = useMatrixClient(); - const { hashRouter } = useClientConfig(); - const space = useSpaceOptionally(); - const directSelected = useDirectSelected(); const handleCopy = () => { const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId); - let eventPath = getHomeRoomPath(roomIdOrAlias, mEvent.getId()); - if (space) { - eventPath = getSpaceRoomPath( - getCanonicalAliasOrRoomId(mx, space.roomId), - roomIdOrAlias, - mEvent.getId() - ); - } else if (directSelected) { - eventPath = getDirectRoomPath(roomIdOrAlias, mEvent.getId()); - } - copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), eventPath)); + const eventId = mEvent.getId(); + const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room); + if (!eventId) return; + copyToClipboard(getMatrixToRoomEvent(roomIdOrAlias, eventId, viaServers)); onClose?.(); }; diff --git a/src/app/hooks/router/useSearchParamsViaServers.ts b/src/app/hooks/router/useSearchParamsViaServers.ts new file mode 100644 index 00000000..0b1b2db7 --- /dev/null +++ b/src/app/hooks/router/useSearchParamsViaServers.ts @@ -0,0 +1,14 @@ +import { useMemo } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { getRoomSearchParams } from '../../pages/pathSearchParam'; +import { decodeSearchParamValueArray } from '../../pages/pathUtils'; + +export const useSearchParamsViaServers = (): string[] | undefined => { + const [searchParams] = useSearchParams(); + const roomSearchParams = useMemo(() => getRoomSearchParams(searchParams), [searchParams]); + const viaServers = roomSearchParams.viaServers + ? decodeSearchParamValueArray(roomSearchParams.viaServers) + : undefined; + + return viaServers; +}; diff --git a/src/app/hooks/useMentionClickHandler.ts b/src/app/hooks/useMentionClickHandler.ts new file mode 100644 index 00000000..f8f4bf54 --- /dev/null +++ b/src/app/hooks/useMentionClickHandler.ts @@ -0,0 +1,43 @@ +import { ReactEventHandler, useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useRoomNavigate } from './useRoomNavigate'; +import { useMatrixClient } from './useMatrixClient'; +import { isRoomId, isUserId } from '../utils/matrix'; +import { openProfileViewer } from '../../client/action/navigation'; +import { getHomeRoomPath, withSearchParam } from '../pages/pathUtils'; +import { _RoomSearchParams } from '../pages/paths'; + +export const useMentionClickHandler = (roomId: string): ReactEventHandler => { + const mx = useMatrixClient(); + const { navigateRoom, navigateSpace } = useRoomNavigate(); + const navigate = useNavigate(); + + const handleClick: ReactEventHandler = useCallback( + (evt) => { + evt.preventDefault(); + const target = evt.currentTarget; + const mentionId = target.getAttribute('data-mention-id'); + if (typeof mentionId !== 'string') return; + + if (isUserId(mentionId)) { + openProfileViewer(mentionId, roomId); + return; + } + + const eventId = target.getAttribute('data-mention-event-id') || undefined; + if (isRoomId(mentionId) && mx.getRoom(mentionId)) { + if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); + else navigateRoom(mentionId, eventId); + return; + } + + const viaServers = target.getAttribute('data-mention-via') || undefined; + const path = getHomeRoomPath(mentionId, eventId); + + navigate(viaServers ? withSearchParam<_RoomSearchParams>(path, { viaServers }) : path); + }, + [mx, navigate, navigateRoom, navigateSpace, roomId] + ); + + return handleClick; +}; diff --git a/src/app/hooks/useRoomNavigate.ts b/src/app/hooks/useRoomNavigate.ts index 55528e7e..0f9f365c 100644 --- a/src/app/hooks/useRoomNavigate.ts +++ b/src/app/hooks/useRoomNavigate.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { NavigateOptions, useNavigate } from 'react-router-dom'; import { useAtomValue } from 'jotai'; import { getCanonicalAliasOrRoomId } from '../utils/matrix'; import { @@ -12,12 +12,14 @@ import { useMatrixClient } from './useMatrixClient'; import { getOrphanParents } from '../utils/room'; import { roomToParentsAtom } from '../state/room/roomToParents'; import { mDirectAtom } from '../state/mDirectList'; +import { useSelectedSpace } from './router/useSelectedSpace'; export const useRoomNavigate = () => { const navigate = useNavigate(); const mx = useMatrixClient(); const roomToParents = useAtomValue(roomToParentsAtom); const mDirects = useAtomValue(mDirectAtom); + const spaceSelectedId = useSelectedSpace(); const navigateSpace = useCallback( (roomId: string) => { @@ -28,24 +30,29 @@ export const useRoomNavigate = () => { ); const navigateRoom = useCallback( - (roomId: string, eventId?: string) => { + (roomId: string, eventId?: string, opts?: NavigateOptions) => { const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId); const orphanParents = getOrphanParents(roomToParents, roomId); if (orphanParents.length > 0) { - const pSpaceIdOrAlias = getCanonicalAliasOrRoomId(mx, orphanParents[0]); - navigate(getSpaceRoomPath(pSpaceIdOrAlias, roomIdOrAlias, eventId)); + const pSpaceIdOrAlias = getCanonicalAliasOrRoomId( + mx, + spaceSelectedId && orphanParents.includes(spaceSelectedId) + ? spaceSelectedId + : orphanParents[0] + ); + navigate(getSpaceRoomPath(pSpaceIdOrAlias, roomIdOrAlias, eventId), opts); return; } if (mDirects.has(roomId)) { - navigate(getDirectRoomPath(roomIdOrAlias, eventId)); + navigate(getDirectRoomPath(roomIdOrAlias, eventId), opts); return; } - navigate(getHomeRoomPath(roomIdOrAlias, eventId)); + navigate(getHomeRoomPath(roomIdOrAlias, eventId), opts); }, - [mx, navigate, roomToParents, mDirects] + [mx, navigate, spaceSelectedId, roomToParents, mDirects] ); return { diff --git a/src/app/hooks/useSpoilerClickHandler.ts b/src/app/hooks/useSpoilerClickHandler.ts new file mode 100644 index 00000000..b2101188 --- /dev/null +++ b/src/app/hooks/useSpoilerClickHandler.ts @@ -0,0 +1,14 @@ +import { ReactEventHandler, useCallback } from 'react'; + +export const useSpoilerClickHandler = (): ReactEventHandler => { + const handleClick: ReactEventHandler = useCallback((evt) => { + const target = evt.currentTarget; + if (target.getAttribute('aria-pressed') === 'true') { + evt.stopPropagation(); + target.setAttribute('aria-pressed', 'false'); + target.style.cursor = 'initial'; + } + }, []); + + return handleClick; +}; diff --git a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx index ff338f3f..83b967bc 100644 --- a/src/app/molecules/space-add-existing/SpaceAddExisting.jsx +++ b/src/app/molecules/space-add-existing/SpaceAddExisting.jsx @@ -5,7 +5,7 @@ import './SpaceAddExisting.scss'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; -import { joinRuleToIconSrc, getIdServer, genRoomVia } from '../../../util/matrixUtil'; +import { joinRuleToIconSrc, getIdServer } from '../../../util/matrixUtil'; import { Debounce } from '../../../util/common'; import Text from '../../atoms/text/Text'; @@ -27,6 +27,7 @@ import { useDirects, useRooms, useSpaces } from '../../state/hooks/roomList'; import { allRoomsAtom } from '../../state/room-list/roomList'; import { mDirectAtom } from '../../state/mDirectList'; import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { getViaServers } from '../../plugins/via-servers'; function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const mountStore = useStore(roomId); @@ -69,7 +70,7 @@ function SpaceAddExistingContent({ roomId, spaces: onlySpaces }) { const promises = selected.map((rId) => { const room = mx.getRoom(rId); - const via = genRoomVia(room); + const via = getViaServers(room); if (via.length === 0) { via.push(getIdServer(rId)); } diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx index 7d0f4fde..88fa9932 100644 --- a/src/app/pages/Router.tsx +++ b/src/app/pages/Router.tsx @@ -41,7 +41,7 @@ import { } from './pathUtils'; import { ClientBindAtoms, ClientLayout, ClientRoot } from './client'; import { Home, HomeRouteRoomProvider, HomeSearch } from './client/home'; -import { Direct, DirectRouteRoomProvider } from './client/direct'; +import { Direct, DirectCreate, DirectRouteRoomProvider } from './client/direct'; import { RouteSpaceProvider, Space, SpaceRouteRoomProvider, SpaceSearch } from './client/space'; import { Explore, FeaturedRooms, PublicRooms } from './client/explore'; import { Notifications, Inbox, Invites } from './client/inbox'; @@ -160,7 +160,7 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) } > {mobile ? null : } />} - create

    } /> + } /> { + if (userId) { + const room = getDMRoomFor(mx, userId); + const { roomId } = room ?? {}; + if (roomId && directs.includes(roomId)) { + navigate(getDirectRoomPath(roomId), { replace: true }); + } else { + openInviteUser(undefined, userId); + } + } else { + navigate(getDirectPath(), { replace: true }); + } + }, [mx, navigate, directs, userId]); + + return ; +} diff --git a/src/app/pages/client/direct/RoomProvider.tsx b/src/app/pages/client/direct/RoomProvider.tsx index c78a8f44..ca45aa19 100644 --- a/src/app/pages/client/direct/RoomProvider.tsx +++ b/src/app/pages/client/direct/RoomProvider.tsx @@ -10,12 +10,12 @@ export function DirectRouteRoomProvider({ children }: { children: ReactNode }) { const mx = useMatrixClient(); const rooms = useDirectRooms(); - const { roomIdOrAlias } = useParams(); + const { roomIdOrAlias, eventId } = useParams(); const roomId = useSelectedRoom(); const room = mx.getRoom(roomId); if (!room || !rooms.includes(room.roomId)) { - return ; + return ; } return ( diff --git a/src/app/pages/client/direct/index.ts b/src/app/pages/client/direct/index.ts index 36f44d63..d247bbc0 100644 --- a/src/app/pages/client/direct/index.ts +++ b/src/app/pages/client/direct/index.ts @@ -1,2 +1,3 @@ export * from './Direct'; export * from './RoomProvider'; +export * from './DirectCreate'; diff --git a/src/app/pages/client/home/RoomProvider.tsx b/src/app/pages/client/home/RoomProvider.tsx index 282cee7d..aa14d153 100644 --- a/src/app/pages/client/home/RoomProvider.tsx +++ b/src/app/pages/client/home/RoomProvider.tsx @@ -5,17 +5,25 @@ import { RoomProvider } from '../../../hooks/useRoom'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; import { useHomeRooms } from './useHomeRooms'; +import { useSearchParamsViaServers } from '../../../hooks/router/useSearchParamsViaServers'; export function HomeRouteRoomProvider({ children }: { children: ReactNode }) { const mx = useMatrixClient(); const rooms = useHomeRooms(); - const { roomIdOrAlias } = useParams(); + const { roomIdOrAlias, eventId } = useParams(); + const viaServers = useSearchParamsViaServers(); const roomId = useSelectedRoom(); const room = mx.getRoom(roomId); if (!room || !rooms.includes(room.roomId)) { - return ; + return ( + + ); } return ( diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index a01ecb8e..3425b519 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -24,9 +24,10 @@ import { } from 'matrix-js-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; import { HTMLReactParserOptions } from 'html-react-parser'; +import { Opts as LinkifyOpts } from 'linkifyjs'; import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import { getMxIdLocalPart, isRoomId, isUserId } from '../../../utils/matrix'; +import { getMxIdLocalPart } from '../../../utils/matrix'; import { InboxNotificationsPathSearchParams } from '../../paths'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { SequenceCard } from '../../../components/sequence-card'; @@ -52,8 +53,13 @@ import { Username, } from '../../../components/message'; import colorMXID from '../../../../util/colorMXID'; -import { getReactCustomHtmlParser } from '../../../plugins/react-custom-html-parser'; -import { openJoinAlias, openProfileViewer } from '../../../../client/action/navigation'; +import { + factoryRenderLinkifyWithMention, + getReactCustomHtmlParser, + LINKIFY_OPTS, + makeMentionCustomProps, + renderMatrixMention, +} from '../../../plugins/react-custom-html-parser'; import { RenderMessageContent } from '../../../components/RenderMessageContent'; import { useSetting } from '../../../state/hooks/settings'; import { settingsAtom } from '../../../state/settings'; @@ -70,6 +76,8 @@ import { ContainerColor } from '../../../styles/ContainerColor.css'; import { VirtualTile } from '../../../components/virtualizer'; import { UserAvatar } from '../../../components/user-avatar'; import { EncryptedContent } from '../../../features/room/message'; +import { useMentionClickHandler } from '../../../hooks/useMentionClickHandler'; +import { useSpoilerClickHandler } from '../../../hooks/useSpoilerClickHandler'; type RoomNotificationsGroup = { roomId: string; @@ -181,36 +189,26 @@ function RoomNotificationsGroupComp({ }: RoomNotificationsGroupProps) { const mx = useMatrixClient(); const unread = useRoomUnread(room.roomId, roomToUnreadAtom); - const { navigateRoom, navigateSpace } = useRoomNavigate(); + const mentionClickHandler = useMentionClickHandler(room.roomId); + const spoilerClickHandler = useSpoilerClickHandler(); + const linkifyOpts = useMemo( + () => ({ + ...LINKIFY_OPTS, + render: factoryRenderLinkifyWithMention((href) => + renderMatrixMention(mx, room.roomId, href, makeMentionCustomProps(mentionClickHandler)) + ), + }), + [mx, room, mentionClickHandler] + ); const htmlReactParserOptions = useMemo( () => - getReactCustomHtmlParser(mx, room, { - handleSpoilerClick: (evt) => { - const target = evt.currentTarget; - if (target.getAttribute('aria-pressed') === 'true') { - evt.stopPropagation(); - target.setAttribute('aria-pressed', 'false'); - target.style.cursor = 'initial'; - } - }, - handleMentionClick: (evt) => { - const target = evt.currentTarget; - const mentionId = target.getAttribute('data-mention-id'); - if (typeof mentionId !== 'string') return; - if (isUserId(mentionId)) { - openProfileViewer(mentionId, room.roomId); - return; - } - if (isRoomId(mentionId) && mx.getRoom(mentionId)) { - if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); - else navigateRoom(mentionId); - return; - } - openJoinAlias(mentionId); - }, + getReactCustomHtmlParser(mx, room.roomId, { + linkifyOpts, + handleSpoilerClick: spoilerClickHandler, + handleMentionClick: mentionClickHandler, }), - [mx, room, navigateRoom, navigateSpace] + [mx, room, linkifyOpts, mentionClickHandler, spoilerClickHandler] ); const renderMatrixEvent = useMatrixEventRenderer<[IRoomEvent, string, GetContentCallback]>( @@ -229,6 +227,7 @@ function RoomNotificationsGroupComp({ mediaAutoLoad={mediaAutoLoad} urlPreview={urlPreview} htmlReactParserOptions={htmlReactParserOptions} + linkifyOpts={linkifyOpts} outlineAttachment /> ); @@ -287,6 +286,7 @@ function RoomNotificationsGroupComp({ mediaAutoLoad={mediaAutoLoad} urlPreview={urlPreview} htmlReactParserOptions={htmlReactParserOptions} + linkifyOpts={linkifyOpts} /> ); } diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index 7b3e61e7..f14976fb 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -47,13 +47,7 @@ import { import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { roomToParentsAtom } from '../../../state/room/roomToParents'; import { allRoomsAtom } from '../../../state/room-list/roomList'; -import { - getOriginBaseUrl, - getSpaceLobbyPath, - getSpacePath, - joinPathComponent, - withOriginBaseUrl, -} from '../../pathUtils'; +import { getSpaceLobbyPath, getSpacePath, joinPathComponent } from '../../pathUtils'; import { SidebarAvatar, SidebarItem, @@ -67,7 +61,7 @@ import { import { RoomUnreadProvider, RoomsUnreadProvider } from '../../../components/RoomUnreadProvider'; import { useSelectedSpace } from '../../../hooks/router/useSelectedSpace'; import { UnreadBadge } from '../../../components/unread-badge'; -import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { getCanonicalAliasOrRoomId, isRoomAlias } from '../../../utils/matrix'; import { RoomAvatar } from '../../../components/room-avatar'; import { nameInitials, randomStr } from '../../../utils/common'; import { @@ -83,7 +77,6 @@ import { AccountDataEvent } from '../../../../types/matrix/accountData'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; import { useOpenedSidebarFolderAtom } from '../../../state/hooks/openedSidebarFolder'; -import { useClientConfig } from '../../../hooks/useClientConfig'; import { usePowerLevels, usePowerLevelsAPI } from '../../../hooks/usePowerLevels'; import { useRoomsUnread } from '../../../state/hooks/unread'; import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; @@ -91,6 +84,8 @@ import { markAsRead } from '../../../../client/action/notifications'; import { copyToClipboard } from '../../../utils/dom'; import { openInviteUser, openSpaceSettings } from '../../../../client/action/navigation'; import { stopPropagation } from '../../../utils/keyboard'; +import { getMatrixToRoom } from '../../../plugins/matrix-to'; +import { getViaServers } from '../../../plugins/via-servers'; type SpaceMenuProps = { room: Room; @@ -100,7 +95,6 @@ type SpaceMenuProps = { const SpaceMenu = forwardRef( ({ room, requestClose, onUnpin }, ref) => { const mx = useMatrixClient(); - const { hashRouter } = useClientConfig(); const roomToParents = useAtomValue(roomToParentsAtom); const powerLevels = usePowerLevels(room); const { getPowerLevel, canDoAction } = usePowerLevelsAPI(powerLevels); @@ -124,8 +118,9 @@ const SpaceMenu = forwardRef( }; const handleCopyLink = () => { - const spacePath = getSpacePath(getCanonicalAliasOrRoomId(mx, room.roomId)); - copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), spacePath)); + const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId); + const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room); + copyToClipboard(getMatrixToRoom(roomIdOrAlias, viaServers)); requestClose(); }; diff --git a/src/app/pages/client/space/RoomProvider.tsx b/src/app/pages/client/space/RoomProvider.tsx index 1105e220..0f13f933 100644 --- a/src/app/pages/client/space/RoomProvider.tsx +++ b/src/app/pages/client/space/RoomProvider.tsx @@ -9,6 +9,7 @@ import { useSpace } from '../../../hooks/useSpace'; import { getAllParents } from '../../../utils/room'; import { roomToParentsAtom } from '../../../state/room/roomToParents'; import { allRoomsAtom } from '../../../state/room-list/roomList'; +import { useSearchParamsViaServers } from '../../../hooks/router/useSearchParamsViaServers'; export function SpaceRouteRoomProvider({ children }: { children: ReactNode }) { const mx = useMatrixClient(); @@ -16,7 +17,8 @@ export function SpaceRouteRoomProvider({ children }: { children: ReactNode }) { const roomToParents = useAtomValue(roomToParentsAtom); const allRooms = useAtomValue(allRoomsAtom); - const { roomIdOrAlias } = useParams(); + const { roomIdOrAlias, eventId } = useParams(); + const viaServers = useSearchParamsViaServers(); const roomId = useSelectedRoom(); const room = mx.getRoom(roomId); @@ -26,7 +28,13 @@ export function SpaceRouteRoomProvider({ children }: { children: ReactNode }) { !allRooms.includes(room.roomId) || !getAllParents(roomToParents, room.roomId).has(space.roomId) ) { - return ; + return ( + + ); } return ( diff --git a/src/app/pages/client/space/Space.tsx b/src/app/pages/client/space/Space.tsx index e280c603..d3dc0be7 100644 --- a/src/app/pages/client/space/Space.tsx +++ b/src/app/pages/client/space/Space.tsx @@ -34,15 +34,8 @@ import { NavItemContent, NavLink, } from '../../../components/nav'; -import { - getOriginBaseUrl, - getSpaceLobbyPath, - getSpacePath, - getSpaceRoomPath, - getSpaceSearchPath, - withOriginBaseUrl, -} from '../../pathUtils'; -import { getCanonicalAliasOrRoomId } from '../../../utils/matrix'; +import { getSpaceLobbyPath, getSpaceRoomPath, getSpaceSearchPath } from '../../pathUtils'; +import { getCanonicalAliasOrRoomId, isRoomAlias } from '../../../utils/matrix'; import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom'; import { useSpaceLobbySelected, @@ -69,11 +62,12 @@ import { useRoomsUnread } from '../../../state/hooks/unread'; import { UseStateProvider } from '../../../components/UseStateProvider'; import { LeaveSpacePrompt } from '../../../components/leave-space-prompt'; import { copyToClipboard } from '../../../utils/dom'; -import { useClientConfig } from '../../../hooks/useClientConfig'; import { useClosedNavCategoriesAtom } from '../../../state/hooks/closedNavCategories'; import { useStateEvent } from '../../../hooks/useStateEvent'; import { StateEvent } from '../../../../types/matrix/room'; import { stopPropagation } from '../../../utils/keyboard'; +import { getMatrixToRoom } from '../../../plugins/matrix-to'; +import { getViaServers } from '../../../plugins/via-servers'; type SpaceMenuProps = { room: Room; @@ -81,7 +75,6 @@ type SpaceMenuProps = { }; const SpaceMenu = forwardRef(({ room, requestClose }, ref) => { const mx = useMatrixClient(); - const { hashRouter } = useClientConfig(); const roomToParents = useAtomValue(roomToParentsAtom); const powerLevels = usePowerLevels(room); const { getPowerLevel, canDoAction } = usePowerLevelsAPI(powerLevels); @@ -100,8 +93,9 @@ const SpaceMenu = forwardRef(({ room, requestClo }; const handleCopyLink = () => { - const spacePath = getSpacePath(getCanonicalAliasOrRoomId(mx, room.roomId)); - copyToClipboard(withOriginBaseUrl(getOriginBaseUrl(hashRouter), spacePath)); + const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId); + const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room); + copyToClipboard(getMatrixToRoom(roomIdOrAlias, viaServers)); requestClose(); }; diff --git a/src/app/pages/client/space/SpaceProvider.tsx b/src/app/pages/client/space/SpaceProvider.tsx index 530fc3cc..2e0f79a2 100644 --- a/src/app/pages/client/space/SpaceProvider.tsx +++ b/src/app/pages/client/space/SpaceProvider.tsx @@ -6,6 +6,7 @@ import { allRoomsAtom } from '../../../state/room-list/roomList'; import { useSelectedSpace } from '../../../hooks/router/useSelectedSpace'; import { SpaceProvider } from '../../../hooks/useSpace'; import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; +import { useSearchParamsViaServers } from '../../../hooks/router/useSearchParamsViaServers'; type RouteSpaceProviderProps = { children: ReactNode; @@ -13,13 +14,15 @@ type RouteSpaceProviderProps = { export function RouteSpaceProvider({ children }: RouteSpaceProviderProps) { const mx = useMatrixClient(); const joinedSpaces = useSpaces(mx, allRoomsAtom); + const { spaceIdOrAlias } = useParams(); + const viaServers = useSearchParamsViaServers(); const selectedSpaceId = useSelectedSpace(); const space = mx.getRoom(selectedSpaceId); if (!space || !joinedSpaces.includes(space.roomId)) { - return ; + return ; } return ( diff --git a/src/app/pages/pathSearchParam.ts b/src/app/pages/pathSearchParam.ts new file mode 100644 index 00000000..8e4c93e5 --- /dev/null +++ b/src/app/pages/pathSearchParam.ts @@ -0,0 +1,13 @@ +import { _RoomSearchParams, DirectCreateSearchParams } from './paths'; + +type SearchParamsGetter = (searchParams: URLSearchParams) => T; + +export const getRoomSearchParams: SearchParamsGetter<_RoomSearchParams> = (searchParams) => ({ + viaServers: searchParams.get('viaServers') ?? undefined, +}); + +export const getDirectCreateSearchParams: SearchParamsGetter = ( + searchParams +) => ({ + userId: searchParams.get('userId') ?? undefined, +}); diff --git a/src/app/pages/paths.ts b/src/app/pages/paths.ts index fd3266e9..57750383 100644 --- a/src/app/pages/paths.ts +++ b/src/app/pages/paths.ts @@ -35,6 +35,11 @@ export type _SearchPathSearchParams = { senders?: string; }; export const _SEARCH_PATH = 'search/'; + +export type _RoomSearchParams = { + /* comma separated string of servers */ + viaServers?: string; +}; export const _ROOM_PATH = ':roomIdOrAlias/:eventId?/'; export const HOME_PATH = '/home/'; @@ -44,6 +49,9 @@ export const HOME_SEARCH_PATH = `/home/${_SEARCH_PATH}`; export const HOME_ROOM_PATH = `/home/${_ROOM_PATH}`; export const DIRECT_PATH = '/direct/'; +export type DirectCreateSearchParams = { + userId?: string; +}; export const DIRECT_CREATE_PATH = `/direct/${_CREATE_PATH}`; export const DIRECT_ROOM_PATH = `/direct/${_ROOM_PATH}`; diff --git a/src/app/plugins/matrix-to.ts b/src/app/plugins/matrix-to.ts new file mode 100644 index 00000000..c9df0a87 --- /dev/null +++ b/src/app/plugins/matrix-to.ts @@ -0,0 +1,84 @@ +const MATRIX_TO_BASE = 'https://matrix.to'; + +export const getMatrixToUser = (userId: string): string => `${MATRIX_TO_BASE}/#/${userId}`; + +const withViaServers = (fragment: string, viaServers: string[]): string => + `${fragment}?${viaServers.map((server) => `via=${server}`).join('&')}`; + +export const getMatrixToRoom = (roomIdOrAlias: string, viaServers?: string[]): string => { + let fragment = roomIdOrAlias; + + if (Array.isArray(viaServers) && viaServers.length > 0) { + fragment = withViaServers(fragment, viaServers); + } + + return `${MATRIX_TO_BASE}/#/${fragment}`; +}; + +export const getMatrixToRoomEvent = ( + roomIdOrAlias: string, + eventId: string, + viaServers?: string[] +): string => { + let fragment = `${roomIdOrAlias}/${eventId}`; + + if (Array.isArray(viaServers) && viaServers.length > 0) { + fragment = withViaServers(fragment, viaServers); + } + + return `${MATRIX_TO_BASE}/#/${fragment}`; +}; + +export type MatrixToRoom = { + roomIdOrAlias: string; + viaServers?: string[]; +}; + +export type MatrixToRoomEvent = MatrixToRoom & { + eventId: string; +}; + +const MATRIX_TO = /^https?:\/\/matrix\.to\S*$/; +export const testMatrixTo = (href: string): boolean => MATRIX_TO.test(href); + +const MATRIX_TO_USER = /^https?:\/\/matrix\.to\/#\/(@[^:\s]+:[^?/\s]+)\/?$/; +const MATRIX_TO_ROOM = /^https?:\/\/matrix\.to\/#\/([#!][^:\s]+:[^?/\s]+)\/?(\?[\S]*)?$/; +const MATRIX_TO_ROOM_EVENT = + /^https?:\/\/matrix\.to\/#\/([#!][^:\s]+:[^?/\s]+)\/(\$[^?/\s]+)\/?(\?[\S]*)?$/; + +export const parseMatrixToUser = (href: string): string | undefined => { + const match = href.match(MATRIX_TO_USER); + if (!match) return undefined; + const userId = match[1]; + return userId; +}; + +export const parseMatrixToRoom = (href: string): MatrixToRoom | undefined => { + const match = href.match(MATRIX_TO_ROOM); + if (!match) return undefined; + + const roomIdOrAlias = match[1]; + const viaSearchStr = match[2]; + const viaServers = new URLSearchParams(viaSearchStr).getAll('via'); + + return { + roomIdOrAlias, + viaServers: viaServers.length === 0 ? undefined : viaServers, + }; +}; + +export const parseMatrixToRoomEvent = (href: string): MatrixToRoomEvent | undefined => { + const match = href.match(MATRIX_TO_ROOM_EVENT); + if (!match) return undefined; + + const roomIdOrAlias = match[1]; + const eventId = match[2]; + const viaSearchStr = match[3]; + const viaServers = new URLSearchParams(viaSearchStr).getAll('via'); + + return { + roomIdOrAlias, + eventId, + viaServers: viaServers.length === 0 ? undefined : viaServers, + }; +}; diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index a8086687..16704374 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -1,5 +1,5 @@ /* eslint-disable jsx-a11y/alt-text */ -import React, { ReactEventHandler, Suspense, lazy } from 'react'; +import React, { ComponentPropsWithoutRef, ReactEventHandler, Suspense, lazy } from 'react'; import { Element, Text as DOMText, @@ -7,18 +7,25 @@ import { attributesToProps, domToReact, } from 'html-react-parser'; -import { MatrixClient, Room } from 'matrix-js-sdk'; +import { MatrixClient } from 'matrix-js-sdk'; import classNames from 'classnames'; import { Scroll, Text } from 'folds'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { IntermediateRepresentation, Opts as LinkifyOpts, OptFn } from 'linkifyjs'; import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; -import { getMxIdLocalPart, getCanonicalAliasRoomId } from '../utils/matrix'; +import { getMxIdLocalPart, getCanonicalAliasRoomId, isRoomAlias } from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; import { findAndReplace } from '../utils/findAndReplace'; +import { + parseMatrixToRoom, + parseMatrixToRoomEvent, + parseMatrixToUser, + testMatrixTo, +} from './matrix-to'; +import { onEnterOrSpace } from '../utils/keyboard'; const ReactPrism = lazy(() => import('./react-prism/ReactPrism')); @@ -35,6 +42,108 @@ export const LINKIFY_OPTS: LinkifyOpts = { ignoreTags: ['span'], }; +export const makeMentionCustomProps = ( + handleMentionClick?: ReactEventHandler +): ComponentPropsWithoutRef<'a'> => ({ + style: { cursor: 'pointer' }, + target: '_blank', + rel: 'noreferrer noopener', + role: 'link', + tabIndex: handleMentionClick ? 0 : -1, + onKeyDown: handleMentionClick ? onEnterOrSpace(handleMentionClick) : undefined, + onClick: handleMentionClick, +}); + +export const renderMatrixMention = ( + mx: MatrixClient, + currentRoomId: string | undefined, + href: string, + customProps: ComponentPropsWithoutRef<'a'> +) => { + const userId = parseMatrixToUser(href); + if (userId) { + const currentRoom = mx.getRoom(currentRoomId); + + return ( + + {`@${ + (currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) + }`} + + ); + } + + const matrixToRoom = parseMatrixToRoom(href); + if (matrixToRoom) { + const { roomIdOrAlias, viaServers } = matrixToRoom; + const mentionRoom = mx.getRoom( + isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias + ); + + return ( + + {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + + ); + } + + const matrixToRoomEvent = parseMatrixToRoomEvent(href); + if (matrixToRoomEvent) { + const { roomIdOrAlias, eventId, viaServers } = matrixToRoomEvent; + const mentionRoom = mx.getRoom( + isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias + ); + + return ( + + Message: {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + + ); + } + + return undefined; +}; + +export const factoryRenderLinkifyWithMention = ( + mentionRender: (href: string) => JSX.Element | undefined +): OptFn<(ir: IntermediateRepresentation) => any> => { + const render: OptFn<(ir: IntermediateRepresentation) => any> = ({ + tagName, + attributes, + content, + }) => { + if (tagName === 'a' && testMatrixTo(decodeURIComponent(attributes.href))) { + const mention = mentionRender(decodeURIComponent(attributes.href)); + if (mention) return mention; + } + + return {content}; + }; + return render; +}; + export const scaleSystemEmoji = (text: string): (string | JSX.Element)[] => findAndReplace( text, @@ -76,8 +185,9 @@ export const highlightText = ( export const getReactCustomHtmlParser = ( mx: MatrixClient, - room: Room, + roomId: string | undefined, params: { + linkifyOpts: LinkifyOpts; highlightRegex?: RegExp; handleSpoilerClick?: ReactEventHandler; handleMentionClick?: ReactEventHandler; @@ -215,54 +325,14 @@ export const getReactCustomHtmlParser = ( } } - if (name === 'a') { - const mention = decodeURIComponent(props.href).match( - /^https?:\/\/matrix.to\/#\/((@|#|!).+:[^?/]+)/ + if (name === 'a' && testMatrixTo(decodeURIComponent(props.href))) { + const mention = renderMatrixMention( + mx, + roomId, + decodeURIComponent(props.href), + makeMentionCustomProps(params.handleMentionClick) ); - if (mention) { - // convert mention link to pill - const mentionId = mention[1]; - const mentionPrefix = mention[2]; - if (mentionPrefix === '#' || mentionPrefix === '!') { - const mentionRoom = mx.getRoom( - mentionPrefix === '#' ? getCanonicalAliasRoomId(mx, mentionId) : mentionId - ); - - return ( - - {domToReact(children, opts)} - - ); - } - if (mentionPrefix === '@') - return ( - - {`@${getMemberDisplayName(room, mentionId) ?? getMxIdLocalPart(mentionId)}`} - - ); - } + if (mention) return mention; } if (name === 'span' && 'data-mx-spoiler' in props) { @@ -316,7 +386,7 @@ export const getReactCustomHtmlParser = ( } if (linkify) { - return {jsx}; + return {jsx}; } return jsx; } diff --git a/src/app/plugins/via-servers.ts b/src/app/plugins/via-servers.ts new file mode 100644 index 00000000..75470999 --- /dev/null +++ b/src/app/plugins/via-servers.ts @@ -0,0 +1,65 @@ +import { Room } from 'matrix-js-sdk'; +import { IPowerLevels } from '../hooks/usePowerLevels'; +import { getMxIdServer } from '../utils/matrix'; +import { StateEvent } from '../../types/matrix/room'; +import { getStateEvent } from '../utils/room'; + +export const getViaServers = (room: Room): string[] => { + const getHighestPowerUserId = (): string | undefined => { + const powerLevels = getStateEvent(room, StateEvent.RoomPowerLevels)?.getContent(); + + if (!powerLevels) return undefined; + const userIdToPower = powerLevels.users; + if (!userIdToPower) return undefined; + let powerUserId: string | undefined; + + Object.keys(userIdToPower).forEach((userId) => { + if (userIdToPower[userId] <= (powerLevels.users_default ?? 0)) return; + + if (!powerUserId) { + powerUserId = userId; + return; + } + if (userIdToPower[userId] > userIdToPower[powerUserId]) { + powerUserId = userId; + } + }); + return powerUserId; + }; + + const getServerToPopulation = (): Record => { + const members = room.getMembers(); + const serverToPop: Record = {}; + + members?.forEach((member) => { + const { userId } = member; + const server = getMxIdServer(userId); + if (!server) return; + const serverPop = serverToPop[server]; + if (serverPop === undefined) { + serverToPop[server] = 1; + return; + } + serverToPop[server] = serverPop + 1; + }); + + return serverToPop; + }; + + const via: string[] = []; + const userId = getHighestPowerUserId(); + if (userId) { + const server = getMxIdServer(userId); + if (server) via.push(server); + } + const serverToPop = getServerToPopulation(); + const sortedServers = Object.keys(serverToPop).sort( + (svrA, svrB) => serverToPop[svrB] - serverToPop[svrA] + ); + const mostPop3 = sortedServers.slice(0, 3); + if (via.length === 0) return mostPop3; + if (mostPop3.includes(via[0])) { + mostPop3.splice(mostPop3.indexOf(via[0]), 1); + } + return via.concat(mostPop3.slice(0, 2)); +}; diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts index da3fe8cb..46a951ff 100644 --- a/src/app/utils/keyboard.ts +++ b/src/app/utils/keyboard.ts @@ -24,12 +24,14 @@ export const preventScrollWithArrowKey: KeyboardEventHandler = (evt) => { } }; -export const onEnterOrSpace = (callback: () => void) => (evt: KeyboardEventLike) => { - if (isKeyHotkey('enter', evt) || isKeyHotkey('space', evt)) { - evt.preventDefault(); - callback(); - } -}; +export const onEnterOrSpace = + (callback: (evt: T) => void) => + (evt: KeyboardEventLike) => { + if (isKeyHotkey('enter', evt) || isKeyHotkey('space', evt)) { + evt.preventDefault(); + callback(evt as T); + } + }; export const stopPropagation = (evt: KeyboardEvent): boolean => { evt.stopPropagation(); diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 278bb46b..f837ed45 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -32,15 +32,6 @@ export const isRoomId = (id: string): boolean => validMxId(id) && id.startsWith( export const isRoomAlias = (id: string): boolean => validMxId(id) && id.startsWith('#'); -export const parseMatrixToUrl = (url: string): [string | undefined, string | undefined] => { - const href = decodeURIComponent(url); - - const match = href.match(/^https?:\/\/matrix.to\/#\/([@!$+#]\S+:[^\\?|^\s|^\\/]+)(\?(via=\S+))?/); - if (!match) return [undefined, undefined]; - const [, g1AsMxId, , g3AsVia] = match; - return [g1AsMxId, g3AsVia]; -}; - export const getCanonicalAliasRoomId = (mx: MatrixClient, alias: string): string | undefined => mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias)?.roomId; diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index e4fd40c3..9f1d9421 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -95,67 +95,11 @@ export function joinRuleToIconSrc(joinRule, isSpace) { }[joinRule]?.() || null); } -// NOTE: it gives userId with minimum power level 50; -function getHighestPowerUserId(room) { - const userIdToPower = room.currentState.getStateEvents('m.room.power_levels', '')?.getContent().users; - let powerUserId = null; - if (!userIdToPower) return powerUserId; - - Object.keys(userIdToPower).forEach((userId) => { - if (userIdToPower[userId] < 50) return; - if (powerUserId === null) { - powerUserId = userId; - return; - } - if (userIdToPower[userId] > userIdToPower[powerUserId]) { - powerUserId = userId; - } - }); - return powerUserId; -} - export function getIdServer(userId) { const idParts = userId.split(':'); return idParts[1]; } -export function getServerToPopulation(room) { - const members = room.getMembers(); - const serverToPop = {}; - - members?.forEach((member) => { - const { userId } = member; - const server = getIdServer(userId); - const serverPop = serverToPop[server]; - if (serverPop === undefined) { - serverToPop[server] = 1; - return; - } - serverToPop[server] = serverPop + 1; - }); - - return serverToPop; -} - -export function genRoomVia(room) { - const via = []; - const userId = getHighestPowerUserId(room); - if (userId) { - const server = getIdServer(userId); - if (server) via.push(server); - } - const serverToPop = getServerToPopulation(room); - const sortedServers = Object.keys(serverToPop).sort( - (svrA, svrB) => serverToPop[svrB] - serverToPop[svrA], - ); - const mostPop3 = sortedServers.slice(0, 3); - if (via.length === 0) return mostPop3; - if (mostPop3.includes(via[0])) { - mostPop3.splice(mostPop3.indexOf(via[0]), 1); - } - return via.concat(mostPop3.slice(0, 2)); -} - export function isCrossVerified(mx, deviceId) { try { const crossSignInfo = mx.getStoredCrossSigningForUser(mx.getUserId()); From e54bb2e42377c49e7179f6b59669592186281eff Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 30 Jul 2024 17:49:51 +0530 Subject: [PATCH 607/824] fix tombstone replacement room open previous room (#1856) --- src/app/utils/matrix.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index f837ed45..8613f36a 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -33,7 +33,13 @@ export const isRoomId = (id: string): boolean => validMxId(id) && id.startsWith( export const isRoomAlias = (id: string): boolean => validMxId(id) && id.startsWith('#'); export const getCanonicalAliasRoomId = (mx: MatrixClient, alias: string): string | undefined => - mx.getRooms()?.find((room) => room.getCanonicalAlias() === alias)?.roomId; + mx + .getRooms() + ?.find( + (room) => + room.getCanonicalAlias() === alias && + getStateEvent(room, StateEvent.RoomTombstone) === undefined + )?.roomId; export const getCanonicalAliasOrRoomId = (mx: MatrixClient, roomId: string): string => { const room = mx.getRoom(roomId); From a8f5a6c2f4eef681cd3d271b3d072ba8912fa8e0 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Thu, 1 Aug 2024 23:42:45 +1000 Subject: [PATCH 608/824] update self deploy instructions after react router (#1859) * update self deploy instructions after react router * List the alternative * docs to deploy on subdir --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5b54f7ae..79e8ccc9 100644 --- a/README.md +++ b/README.md @@ -19,22 +19,24 @@ A Matrix client focusing primarily on simple, elegant and secure interface. The ## Getting started -Web app is available at https://app.cinny.in and gets updated on each new release. The `dev` branch is continuously deployed at https://dev.cinny.in but keep in mind that it could have things broken. +* Web app is available at https://app.cinny.in and gets updated on each new release. The `dev` branch is continuously deployed at https://dev.cinny.in but keep in mind that it could have things broken. -You can also download our desktop app from [cinny-desktop repository](https://github.com/cinnyapp/cinny-desktop). +* You can also download our desktop app from [cinny-desktop repository](https://github.com/cinnyapp/cinny-desktop). -To host Cinny on your own, download tarball of the app from [GitHub release](https://github.com/cinnyapp/cinny/releases/latest). +* To host Cinny on your own, download tarball of the app from [GitHub release](https://github.com/cinnyapp/cinny/releases/latest). You can serve the application with a webserver of your choice by simply copying `dist/` directory to the webroot. -To set default Homeserver on login and register page, place a customized [`config.json`](config.json) in webroot of your choice. +To set default Homeserver on login, register and Explore Community page, place a customized [`config.json`](config.json) in webroot of your choice. +You will also need to setup redirects to serve the assests. An example setting of redirects for netlify is done in [`netlify.toml`](netlify.toml). You can also set `hashRouter.enabled = true` in [`config.json`](config.json) if you have trouble setting redirects. +To deploy on subdirectory, you need to rebuild the app youself after updating the `base` path in [`build.confg.ts`](build.confg.ts). For example, if you want to deploy on `https://cinny.in/app`, then change `base: '/app'`. -Alternatively you can just pull the [DockerHub image](https://hub.docker.com/r/ajbura/cinny) by: -``` -docker pull ajbura/cinny -``` -or [ghcr image](https://github.com/cinnyapp/cinny/pkgs/container/cinny) by: -``` -docker pull ghcr.io/cinnyapp/cinny:latest -``` +* Alternatively you can just pull the [DockerHub image](https://hub.docker.com/r/ajbura/cinny) by: + ``` + docker pull ajbura/cinny + ``` + or [ghcr image](https://github.com/cinnyapp/cinny/pkgs/container/cinny) by: + ``` + docker pull ghcr.io/cinnyapp/cinny:latest + ```
    PGP Public Key to verify tarball From c62050445bb1f5ceb790871353c46d231322d037 Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Thu, 1 Aug 2024 23:45:22 +1000 Subject: [PATCH 609/824] Fix typo in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79e8ccc9..5cee6fa2 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ A Matrix client focusing primarily on simple, elegant and secure interface. The You can serve the application with a webserver of your choice by simply copying `dist/` directory to the webroot. To set default Homeserver on login, register and Explore Community page, place a customized [`config.json`](config.json) in webroot of your choice. You will also need to setup redirects to serve the assests. An example setting of redirects for netlify is done in [`netlify.toml`](netlify.toml). You can also set `hashRouter.enabled = true` in [`config.json`](config.json) if you have trouble setting redirects. -To deploy on subdirectory, you need to rebuild the app youself after updating the `base` path in [`build.confg.ts`](build.confg.ts). For example, if you want to deploy on `https://cinny.in/app`, then change `base: '/app'`. +To deploy on subdirectory, you need to rebuild the app youself after updating the `base` path in [`build.config.ts`](build.config.ts). For example, if you want to deploy on `https://cinny.in/app`, then change `base: '/app'`. * Alternatively you can just pull the [DockerHub image](https://hub.docker.com/r/ajbura/cinny) by: ``` From 9cb5c70d5174332eb306b3792a97f9ee7c126ace Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 3 Aug 2024 19:17:53 +0530 Subject: [PATCH 610/824] add back btn for mobile view (#1861) --- src/app/components/BackRouteHandler.tsx | 86 +++++++++++++++ src/app/components/page/Page.tsx | 20 ++-- src/app/components/page/style.css.ts | 19 +++- .../JoinBeforeNavigate.tsx | 28 +++-- src/app/features/lobby/LobbyHeader.tsx | 101 ++++++++++++------ src/app/features/room/RoomViewHeader.tsx | 40 +++++-- src/app/pages/client/explore/Featured.tsx | 19 +++- src/app/pages/client/explore/Server.tsx | 36 +++++-- src/app/pages/client/home/Search.tsx | 31 ++++-- src/app/pages/client/inbox/Invites.tsx | 30 ++++-- src/app/pages/client/inbox/Notifications.tsx | 29 +++-- src/app/pages/client/space/Search.tsx | 31 ++++-- 12 files changed, 370 insertions(+), 100 deletions(-) create mode 100644 src/app/components/BackRouteHandler.tsx diff --git a/src/app/components/BackRouteHandler.tsx b/src/app/components/BackRouteHandler.tsx new file mode 100644 index 00000000..fa3d7592 --- /dev/null +++ b/src/app/components/BackRouteHandler.tsx @@ -0,0 +1,86 @@ +import { ReactNode, useCallback } from 'react'; +import { matchPath, useLocation, useNavigate } from 'react-router-dom'; +import { + getDirectPath, + getExplorePath, + getHomePath, + getInboxPath, + getSpacePath, +} from '../pages/pathUtils'; +import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from '../pages/paths'; + +type BackRouteHandlerProps = { + children: (onBack: () => void) => ReactNode; +}; +export function BackRouteHandler({ children }: BackRouteHandlerProps) { + const navigate = useNavigate(); + const location = useLocation(); + + const goBack = useCallback(() => { + if ( + matchPath( + { + path: HOME_PATH, + caseSensitive: true, + end: false, + }, + location.pathname + ) + ) { + navigate(getHomePath()); + return; + } + if ( + matchPath( + { + path: DIRECT_PATH, + caseSensitive: true, + end: false, + }, + location.pathname + ) + ) { + navigate(getDirectPath()); + return; + } + const spaceMatch = matchPath( + { + path: SPACE_PATH, + caseSensitive: true, + end: false, + }, + location.pathname + ); + if (spaceMatch?.params.spaceIdOrAlias) { + navigate(getSpacePath(spaceMatch.params.spaceIdOrAlias)); + return; + } + if ( + matchPath( + { + path: EXPLORE_PATH, + caseSensitive: true, + end: false, + }, + location.pathname + ) + ) { + navigate(getExplorePath()); + return; + } + if ( + matchPath( + { + path: INBOX_PATH, + caseSensitive: true, + end: false, + }, + location.pathname + ) + ) { + navigate(getInboxPath()); + } + }, [navigate, location]); + + return children(goBack); +} diff --git a/src/app/components/page/Page.tsx b/src/app/components/page/Page.tsx index 4ccb1ec0..a8b9ea04 100644 --- a/src/app/components/page/Page.tsx +++ b/src/app/components/page/Page.tsx @@ -87,15 +87,17 @@ export const Page = as<'div'>(({ className, ...props }, ref) => ( /> )); -export const PageHeader = as<'div'>(({ className, ...props }, ref) => ( -
    -)); +export const PageHeader = as<'div', css.PageHeaderVariants>( + ({ className, balance, ...props }, ref) => ( +
    + ) +); export const PageContent = as<'div'>(({ className, ...props }, ref) => (
    diff --git a/src/app/components/page/style.css.ts b/src/app/components/page/style.css.ts index 4807a227..23f2da49 100644 --- a/src/app/components/page/style.css.ts +++ b/src/app/components/page/style.css.ts @@ -1,4 +1,5 @@ import { style } from '@vanilla-extract/css'; +import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; import { DefaultReset, color, config, toRem } from 'folds'; export const PageNav = style({ @@ -33,11 +34,21 @@ export const PageNavContent = style({ paddingBottom: config.space.S700, }); -export const PageHeader = style({ - paddingLeft: config.space.S400, - paddingRight: config.space.S200, - borderBottomWidth: config.borderWidth.B300, +export const PageHeader = recipe({ + base: { + paddingLeft: config.space.S400, + paddingRight: config.space.S200, + borderBottomWidth: config.borderWidth.B300, + }, + variants: { + balance: { + true: { + paddingLeft: config.space.S200, + }, + }, + }, }); +export type PageHeaderVariants = RecipeVariants; export const PageContent = style([ DefaultReset, diff --git a/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx b/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx index 1cec6599..028cd560 100644 --- a/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx +++ b/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Box, Scroll, Text, toRem } from 'folds'; +import { Box, Icon, IconButton, Icons, Scroll, Text, toRem } from 'folds'; import { useAtomValue } from 'jotai'; import { RoomCard } from '../../components/room-card'; import { RoomTopicViewer } from '../../components/room-topic-viewer'; @@ -8,6 +8,8 @@ import { RoomSummaryLoader } from '../../components/RoomSummaryLoader'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { allRoomsAtom } from '../../state/room-list/roomList'; +import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../components/BackRouteHandler'; type JoinBeforeNavigateProps = { roomIdOrAlias: string; eventId?: string; viaServers?: string[] }; export function JoinBeforeNavigate({ @@ -18,6 +20,7 @@ export function JoinBeforeNavigate({ const mx = useMatrixClient(); const allRooms = useAtomValue(allRoomsAtom); const { navigateRoom, navigateSpace } = useRoomNavigate(); + const screenSize = useScreenSizeContext(); const handleView = (roomId: string) => { if (mx.getRoom(roomId)?.isSpaceRoom()) { @@ -29,11 +32,24 @@ export function JoinBeforeNavigate({ return ( - - - - {roomIdOrAlias} - + + + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + + {roomIdOrAlias} + + diff --git a/src/app/features/lobby/LobbyHeader.tsx b/src/app/features/lobby/LobbyHeader.tsx index e01d3ad5..fa415bd2 100644 --- a/src/app/features/lobby/LobbyHeader.tsx +++ b/src/app/features/lobby/LobbyHeader.tsx @@ -31,6 +31,8 @@ import { IPowerLevels, usePowerLevelsAPI } from '../../hooks/usePowerLevels'; import { UseStateProvider } from '../../components/UseStateProvider'; import { LeaveSpacePrompt } from '../../components/leave-space-prompt'; import { stopPropagation } from '../../utils/keyboard'; +import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../components/BackRouteHandler'; type LobbyMenuProps = { roomId: string; @@ -123,6 +125,7 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { const space = useSpace(); const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); const [menuAnchor, setMenuAnchor] = useState(); + const screenSize = useScreenSizeContext(); const name = useRoomName(space); const avatarMxc = useRoomAvatar(space); @@ -133,42 +136,72 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { }; return ( - + - - - {showProfile && ( - <> - - {nameInitials(name)}} - /> - - - {name} - - + {screenSize === ScreenSize.Mobile ? ( + <> + + + {(onBack) => ( + + + + )} + + + + {showProfile && ( + + {name} + + )} + + + ) : ( + <> + + + {showProfile && ( + <> + + {nameInitials(name)}} + /> + + + {name} + + + )} + + + )} + + {screenSize !== ScreenSize.Mobile && ( + + Members + + } + > + {(triggerRef) => ( + setPeopleDrawer((drawer) => !drawer)}> + + + )} + )} - - - - Members - - } - > - {(triggerRef) => ( - setPeopleDrawer((drawer) => !drawer)}> - - - )} - + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + + + )} + + )} - - ( - - )} - /> - + {screenSize !== ScreenSize.Mobile && ( + + ( + + )} + /> + + )} {name} diff --git a/src/app/pages/client/explore/Featured.tsx b/src/app/pages/client/explore/Featured.tsx index 4838127f..f056cbb5 100644 --- a/src/app/pages/client/explore/Featured.tsx +++ b/src/app/pages/client/explore/Featured.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Box, Icon, Icons, Scroll, Text } from 'folds'; +import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds'; import { useAtomValue } from 'jotai'; import { useClientConfig } from '../../../hooks/useClientConfig'; import { RoomCard, RoomCardGrid } from '../../../components/room-card'; @@ -9,21 +9,38 @@ import { Page, PageContent, PageContentCenter, + PageHeader, PageHero, PageHeroSection, } from '../../../components/page'; import { RoomTopicViewer } from '../../../components/room-topic-viewer'; import * as css from './style.css'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; export function FeaturedRooms() { const { featuredCommunities } = useClientConfig(); const { rooms, spaces } = featuredCommunities ?? {}; const allRooms = useAtomValue(allRoomsAtom); + const screenSize = useScreenSizeContext(); const { navigateSpace, navigateRoom } = useRoomNavigate(); return ( + {screenSize === ScreenSize.Mobile && ( + + + + {(onBack) => ( + + + + )} + + + + )} diff --git a/src/app/pages/client/explore/Server.tsx b/src/app/pages/client/explore/Server.tsx index 1a81c225..1f493df1 100644 --- a/src/app/pages/client/explore/Server.tsx +++ b/src/app/pages/client/explore/Server.tsx @@ -13,6 +13,7 @@ import { Button, Chip, Icon, + IconButton, Icons, Input, Line, @@ -42,6 +43,8 @@ import { allRoomsAtom } from '../../../state/room-list/roomList'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { getMxIdServer } from '../../../utils/matrix'; import { stopPropagation } from '../../../utils/keyboard'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; const useServerSearchParams = (searchParams: URLSearchParams): ExploreServerPathSearchParams => useMemo( @@ -344,6 +347,7 @@ export function PublicRooms() { const userServer = userId && getMxIdServer(userId); const allRooms = useAtomValue(allRoomsAtom); const { navigateSpace, navigateRoom } = useRoomNavigate(); + const screenSize = useScreenSizeContext(); const [searchParams] = useSearchParams(); const serverSearchParams = useServerSearchParams(searchParams); @@ -466,7 +470,7 @@ export function PublicRooms() { return ( - + {isSearch ? ( <> @@ -482,20 +486,34 @@ export function PublicRooms() { - + {screenSize !== ScreenSize.Mobile && } Search - + ) : ( - - - - {server} - - + <> + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + {screenSize !== ScreenSize.Mobile && } + + {server} + + + + )} diff --git a/src/app/pages/client/home/Search.tsx b/src/app/pages/client/home/Search.tsx index af7b1eb9..d5ddfb77 100644 --- a/src/app/pages/client/home/Search.tsx +++ b/src/app/pages/client/home/Search.tsx @@ -1,21 +1,38 @@ import React, { useRef } from 'react'; -import { Box, Icon, Icons, Text, Scroll } from 'folds'; +import { Box, Icon, Icons, Text, Scroll, IconButton } from 'folds'; import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; import { MessageSearch } from '../../../features/message-search'; import { useHomeRooms } from './useHomeRooms'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; export function HomeSearch() { const scrollRef = useRef(null); const rooms = useHomeRooms(); + const screenSize = useScreenSizeContext(); return ( - - - - - Message Search - + + + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + {screenSize !== ScreenSize.Mobile && } + + Message Search + + + diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx index 06e5f6c6..18993081 100644 --- a/src/app/pages/client/inbox/Invites.tsx +++ b/src/app/pages/client/inbox/Invites.tsx @@ -4,6 +4,7 @@ import { Box, Button, Icon, + IconButton, Icons, Overlay, OverlayBackdrop, @@ -39,6 +40,8 @@ import { RoomTopicViewer } from '../../../components/room-topic-viewer'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { useRoomTopic } from '../../../hooks/useRoomMeta'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; const COMPACT_CARD_WIDTH = 548; @@ -205,6 +208,7 @@ export function Invites() { useCallback(() => containerRef.current, []), useCallback((width) => setCompact(width <= COMPACT_CARD_WIDTH), []) ); + const screenSize = useScreenSizeContext(); const { navigateRoom, navigateSpace } = useRoomNavigate(); @@ -225,12 +229,26 @@ export function Invites() { return ( - - - - - Invitations - + + + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + {screenSize !== ScreenSize.Mobile && } + + Invitations + + + diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 3425b519..6a8160d8 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -78,6 +78,8 @@ import { UserAvatar } from '../../../components/user-avatar'; import { EncryptedContent } from '../../../features/room/message'; import { useMentionClickHandler } from '../../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../../hooks/useSpoilerClickHandler'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; type RoomNotificationsGroup = { roomId: string; @@ -484,6 +486,7 @@ export function Notifications() { const mx = useMatrixClient(); const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); const [urlPreview] = useSetting(settingsAtom, 'urlPreview'); + const screenSize = useScreenSizeContext(); const { navigateRoom } = useRoomNavigate(); const [searchParams, setSearchParams] = useSearchParams(); @@ -549,12 +552,26 @@ export function Notifications() { return ( - - - - - Notification Messages - + + + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + {screenSize !== ScreenSize.Mobile && } + + Notification Messages + + + diff --git a/src/app/pages/client/space/Search.tsx b/src/app/pages/client/space/Search.tsx index 6e7ac57d..017262b5 100644 --- a/src/app/pages/client/space/Search.tsx +++ b/src/app/pages/client/space/Search.tsx @@ -1,5 +1,5 @@ import React, { useRef } from 'react'; -import { Box, Icon, Icons, Text, Scroll } from 'folds'; +import { Box, Icon, Icons, Text, Scroll, IconButton } from 'folds'; import { useAtomValue } from 'jotai'; import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; import { MessageSearch } from '../../../features/message-search'; @@ -9,11 +9,14 @@ import { allRoomsAtom } from '../../../state/room-list/roomList'; import { mDirectAtom } from '../../../state/mDirectList'; import { roomToParentsAtom } from '../../../state/room/roomToParents'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; +import { BackRouteHandler } from '../../../components/BackRouteHandler'; export function SpaceSearch() { const mx = useMatrixClient(); const scrollRef = useRef(null); const space = useSpace(); + const screenSize = useScreenSizeContext(); const mDirects = useAtomValue(mDirectAtom); const roomToParents = useAtomValue(roomToParentsAtom); @@ -25,12 +28,26 @@ export function SpaceSearch() { return ( - - - - - Message Search - + + + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + + + + )} + + )} + + + {screenSize !== ScreenSize.Mobile && } + + Message Search + + + From 681287c46ae6aab6c3a3697a8a062acbebc519c9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Aug 2024 09:49:37 +0530 Subject: [PATCH 611/824] show unverified tab indicator on sidebar (#1862) --- src/app/hooks/useDeviceList.js | 31 ----------- src/app/hooks/useDeviceList.ts | 35 +++++++++++++ src/app/pages/client/SidebarNav.tsx | 12 ++++- .../pages/client/sidebar/UnverifiedTab.css.ts | 24 +++++++++ .../pages/client/sidebar/UnverifiedTab.tsx | 51 +++++++++++++++++++ src/app/pages/client/sidebar/index.ts | 1 + src/util/matrixUtil.js | 2 +- 7 files changed, 123 insertions(+), 33 deletions(-) delete mode 100644 src/app/hooks/useDeviceList.js create mode 100644 src/app/hooks/useDeviceList.ts create mode 100644 src/app/pages/client/sidebar/UnverifiedTab.css.ts create mode 100644 src/app/pages/client/sidebar/UnverifiedTab.tsx diff --git a/src/app/hooks/useDeviceList.js b/src/app/hooks/useDeviceList.js deleted file mode 100644 index 7daaad1f..00000000 --- a/src/app/hooks/useDeviceList.js +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -import { useState, useEffect } from 'react'; -import { useMatrixClient } from './useMatrixClient'; - -export function useDeviceList() { - const mx = useMatrixClient(); - const [deviceList, setDeviceList] = useState(null); - - useEffect(() => { - let isMounted = true; - - const updateDevices = () => mx.getDevices().then((data) => { - if (!isMounted) return; - setDeviceList(data.devices || []); - }); - updateDevices(); - - const handleDevicesUpdate = (users) => { - if (users.includes(mx.getUserId())) { - updateDevices(); - } - }; - - mx.on('crypto.devicesUpdated', handleDevicesUpdate); - return () => { - mx.removeListener('crypto.devicesUpdated', handleDevicesUpdate); - isMounted = false; - }; - }, [mx]); - return deviceList; -} diff --git a/src/app/hooks/useDeviceList.ts b/src/app/hooks/useDeviceList.ts new file mode 100644 index 00000000..daec7cbe --- /dev/null +++ b/src/app/hooks/useDeviceList.ts @@ -0,0 +1,35 @@ +/* eslint-disable import/prefer-default-export */ +import { useState, useEffect } from 'react'; +import { CryptoEvent, IMyDevice } from 'matrix-js-sdk'; +import { CryptoEventHandlerMap } from 'matrix-js-sdk/lib/crypto'; +import { useMatrixClient } from './useMatrixClient'; + +export function useDeviceList() { + const mx = useMatrixClient(); + const [deviceList, setDeviceList] = useState(null); + + useEffect(() => { + let isMounted = true; + + const updateDevices = () => + mx.getDevices().then((data) => { + if (!isMounted) return; + setDeviceList(data.devices || []); + }); + updateDevices(); + + const handleDevicesUpdate: CryptoEventHandlerMap[CryptoEvent.DevicesUpdated] = (users) => { + const userId = mx.getUserId(); + if (userId && users.includes(userId)) { + updateDevices(); + } + }; + + mx.on(CryptoEvent.DevicesUpdated, handleDevicesUpdate); + return () => { + mx.removeListener(CryptoEvent.DevicesUpdated, handleDevicesUpdate); + isMounted = false; + }; + }, [mx]); + return deviceList; +} diff --git a/src/app/pages/client/SidebarNav.tsx b/src/app/pages/client/SidebarNav.tsx index fb6bd742..110e4694 100644 --- a/src/app/pages/client/SidebarNav.tsx +++ b/src/app/pages/client/SidebarNav.tsx @@ -10,7 +10,15 @@ import { SidebarItemTooltip, SidebarItem, } from '../../components/sidebar'; -import { DirectTab, HomeTab, SpaceTabs, InboxTab, ExploreTab, UserTab } from './sidebar'; +import { + DirectTab, + HomeTab, + SpaceTabs, + InboxTab, + ExploreTab, + UserTab, + UnverifiedTab, +} from './sidebar'; import { openCreateRoom, openSearch } from '../../../client/action/navigation'; export function SidebarNav() { @@ -65,6 +73,8 @@ export function SidebarNav() { + + diff --git a/src/app/pages/client/sidebar/UnverifiedTab.css.ts b/src/app/pages/client/sidebar/UnverifiedTab.css.ts new file mode 100644 index 00000000..e8fe8c51 --- /dev/null +++ b/src/app/pages/client/sidebar/UnverifiedTab.css.ts @@ -0,0 +1,24 @@ +import { keyframes, style } from '@vanilla-extract/css'; +import { color, toRem } from 'folds'; + +const pushRight = keyframes({ + from: { + transform: `translateX(${toRem(2)}) scale(1)`, + }, + to: { + transform: 'translateX(0) scale(1)', + }, +}); + +export const UnverifiedTab = style({ + animationName: pushRight, + animationDuration: '400ms', + animationIterationCount: 30, + animationDirection: 'alternate', +}); + +export const UnverifiedAvatar = style({ + backgroundColor: color.Critical.Container, + color: color.Critical.OnContainer, + borderColor: color.Critical.ContainerLine, +}); diff --git a/src/app/pages/client/sidebar/UnverifiedTab.tsx b/src/app/pages/client/sidebar/UnverifiedTab.tsx new file mode 100644 index 00000000..402ffc2b --- /dev/null +++ b/src/app/pages/client/sidebar/UnverifiedTab.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { Badge, color, Icon, Icons, Text } from 'folds'; +import { openSettings } from '../../../../client/action/navigation'; +import { isCrossVerified } from '../../../../util/matrixUtil'; +import { + SidebarAvatar, + SidebarItem, + SidebarItemBadge, + SidebarItemTooltip, +} from '../../../components/sidebar'; +import { useDeviceList } from '../../../hooks/useDeviceList'; +import { tabText } from '../../../organisms/settings/Settings'; +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +import * as css from './UnverifiedTab.css'; + +export function UnverifiedTab() { + const mx = useMatrixClient(); + const deviceList = useDeviceList(); + console.log(deviceList); + const unverified = deviceList?.filter( + (device) => isCrossVerified(mx, device.device_id) === false + ); + console.log(unverified); + + if (!unverified?.length) return null; + + return ( + + + {(triggerRef) => ( + openSettings(tabText.SECURITY)} + > + + + )} + + + + + {unverified.length} + + + + + ); +} diff --git a/src/app/pages/client/sidebar/index.ts b/src/app/pages/client/sidebar/index.ts index 63c5d4bb..5da8780b 100644 --- a/src/app/pages/client/sidebar/index.ts +++ b/src/app/pages/client/sidebar/index.ts @@ -4,3 +4,4 @@ export * from './SpaceTabs'; export * from './InboxTab'; export * from './ExploreTab'; export * from './UserTab'; +export * from './UnverifiedTab'; diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index 9f1d9421..7664c3a4 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -106,7 +106,7 @@ export function isCrossVerified(mx, deviceId) { const deviceInfo = mx.getStoredDevice(mx.getUserId(), deviceId); const deviceTrust = crossSignInfo.checkDeviceTrust(crossSignInfo, deviceInfo, false, true); return deviceTrust.isCrossSigningVerified(); - } catch { + } catch (e) { // device does not support encryption return null; } From 96222de5bc521ed212d4b63d6a25925fce500c80 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:06:42 +0530 Subject: [PATCH 612/824] fix page up/down button not working (#1863) --- src/app/features/room/Room.tsx | 3 ++- src/app/features/room/RoomView.tsx | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx index ee3e7027..a4ec7165 100644 --- a/src/app/features/room/Room.tsx +++ b/src/app/features/room/Room.tsx @@ -13,6 +13,7 @@ import { useKeyDown } from '../../hooks/useKeyDown'; import { markAsRead } from '../../../client/action/notifications'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRoomMembers } from '../../hooks/useRoomMembers'; +import { editableActiveElement } from '../../utils/dom'; export function Room() { const { eventId } = useParams(); @@ -28,7 +29,7 @@ export function Room() { window, useCallback( (evt) => { - if (isKeyHotkey('escape', evt)) { + if (isKeyHotkey('escape', evt) && !editableActiveElement()) { markAsRead(mx, room.roomId); } }, diff --git a/src/app/features/room/RoomView.tsx b/src/app/features/room/RoomView.tsx index 3eabd528..250afc93 100644 --- a/src/app/features/room/RoomView.tsx +++ b/src/app/features/room/RoomView.tsx @@ -25,6 +25,7 @@ const shouldFocusMessageField = (evt: KeyboardEvent): boolean => { if (evt.metaKey || evt.altKey || evt.ctrlKey) { return false; } + // do not focus on F keys if (/^F\d+$/.test(code)) return false; @@ -36,6 +37,9 @@ const shouldFocusMessageField = (evt: KeyboardEvent): boolean => { code.startsWith('Alt') || code.startsWith('Control') || code.startsWith('Arrow') || + code.startsWith('Page') || + code.startsWith('End') || + code.startsWith('Home') || code === 'Tab' || code === 'Space' || code === 'Enter' || From 8ed78d48fb05c2066ce3eaa317922a99a80110db Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:07:28 +0530 Subject: [PATCH 613/824] fix notification not working for selected room (#1864) --- src/app/pages/client/ClientNonUIFeatures.tsx | 8 ++++---- src/app/pages/client/sidebar/UnverifiedTab.tsx | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 845fceb3..ffe33e9a 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -183,17 +183,17 @@ function MessageNotifications() { removed, data ) => { + if (mx.getSyncState() !== 'SYNCING') return; + if (document.hasFocus() && (selectedRoomId === room?.roomId || notificationSelected)) return; if ( - mx.getSyncState() !== 'SYNCING' || - selectedRoomId === room?.roomId || - notificationSelected || !room || !data.liveEvent || room.isSpaceRoom() || !isNotificationEvent(mEvent) || getNotificationType(mx, room.roomId) === NotificationType.Mute - ) + ) { return; + } const sender = mEvent.getSender(); const eventId = mEvent.getId(); diff --git a/src/app/pages/client/sidebar/UnverifiedTab.tsx b/src/app/pages/client/sidebar/UnverifiedTab.tsx index 402ffc2b..919c4a70 100644 --- a/src/app/pages/client/sidebar/UnverifiedTab.tsx +++ b/src/app/pages/client/sidebar/UnverifiedTab.tsx @@ -16,11 +16,9 @@ import * as css from './UnverifiedTab.css'; export function UnverifiedTab() { const mx = useMatrixClient(); const deviceList = useDeviceList(); - console.log(deviceList); const unverified = deviceList?.filter( (device) => isCrossVerified(mx, device.device_id) === false ); - console.log(unverified); if (!unverified?.length) return null; From 581211f13e20c87fbfef6410ddf57a13c7a0b49a Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:08:20 +0530 Subject: [PATCH 614/824] fix crash when decoding malformed urls (#1865) --- src/app/components/editor/input.ts | 3 ++- src/app/components/url-preview/UrlPreviewCard.tsx | 3 ++- src/app/pages/auth/AuthLayout.tsx | 5 +++-- src/app/plugins/react-custom-html-parser.tsx | 9 +++++---- src/app/utils/dom.ts | 8 ++++++++ 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 29e5bd6a..20c56ed3 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -25,6 +25,7 @@ import { parseMatrixToUser, testMatrixTo, } from '../../plugins/matrix-to'; +import { tryDecodeURIComponent } from '../../utils/dom'; const markNodeToType: Record = { b: MarkType.Bold, @@ -73,7 +74,7 @@ const elementToInlineNode = (node: Element): MentionElement | EmoticonElement | return createEmoticonElement(src, alt || 'Unknown Emoji'); } if (node.name === 'a') { - const href = decodeURIComponent(node.attribs.href); + const href = tryDecodeURIComponent(node.attribs.href); if (typeof href !== 'string') return undefined; if (testMatrixTo(href)) { const userMention = parseMatrixToUser(href); diff --git a/src/app/components/url-preview/UrlPreviewCard.tsx b/src/app/components/url-preview/UrlPreviewCard.tsx index fc9229fa..07c25f8a 100644 --- a/src/app/components/url-preview/UrlPreviewCard.tsx +++ b/src/app/components/url-preview/UrlPreviewCard.tsx @@ -9,6 +9,7 @@ import { useIntersectionObserver, } from '../../hooks/useIntersectionObserver'; import * as css from './UrlPreviewCard.css'; +import { tryDecodeURIComponent } from '../../utils/dom'; const linkStyles = { color: color.Success.Main }; @@ -43,7 +44,7 @@ export const UrlPreviewCard = as<'div', { url: string; ts: number }>( priority="300" > {typeof prev['og:site_name'] === 'string' && `${prev['og:site_name']} | `} - {decodeURIComponent(url)} + {tryDecodeURIComponent(url)} {prev['og:title']} diff --git a/src/app/pages/auth/AuthLayout.tsx b/src/app/pages/auth/AuthLayout.tsx index 2ea94142..3943f42d 100644 --- a/src/app/pages/auth/AuthLayout.tsx +++ b/src/app/pages/auth/AuthLayout.tsx @@ -29,6 +29,7 @@ import { AutoDiscoveryInfoProvider } from '../../hooks/useAutoDiscoveryInfo'; import { AuthFlowsLoader } from '../../components/AuthFlowsLoader'; import { AuthFlowsProvider } from '../../hooks/useAuthFlows'; import { AuthServerProvider } from '../../hooks/useAuthServer'; +import { tryDecodeURIComponent } from '../../utils/dom'; const currentAuthPath = (pathname: string): string => { if (matchPath(LOGIN_PATH, pathname)) { @@ -72,7 +73,7 @@ export function AuthLayout() { const clientConfig = useClientConfig(); const defaultServer = clientDefaultServer(clientConfig); - let server: string = urlEncodedServer ? decodeURIComponent(urlEncodedServer) : defaultServer; + let server: string = urlEncodedServer ? tryDecodeURIComponent(urlEncodedServer) : defaultServer; if (!clientAllowedServer(clientConfig, server)) { server = defaultServer; @@ -94,7 +95,7 @@ export function AuthLayout() { // if server is mismatches with path server, update path useEffect(() => { - if (!urlEncodedServer || decodeURIComponent(urlEncodedServer) !== server) { + if (!urlEncodedServer || tryDecodeURIComponent(urlEncodedServer) !== server) { navigate( generatePath(currentAuthPath(location.pathname), { server: encodeURIComponent(server), diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index 16704374..95e2f334 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -26,6 +26,7 @@ import { testMatrixTo, } from './matrix-to'; import { onEnterOrSpace } from '../utils/keyboard'; +import { tryDecodeURIComponent } from '../utils/dom'; const ReactPrism = lazy(() => import('./react-prism/ReactPrism')); @@ -134,8 +135,8 @@ export const factoryRenderLinkifyWithMention = ( attributes, content, }) => { - if (tagName === 'a' && testMatrixTo(decodeURIComponent(attributes.href))) { - const mention = mentionRender(decodeURIComponent(attributes.href)); + if (tagName === 'a' && testMatrixTo(tryDecodeURIComponent(attributes.href))) { + const mention = mentionRender(tryDecodeURIComponent(attributes.href)); if (mention) return mention; } @@ -325,11 +326,11 @@ export const getReactCustomHtmlParser = ( } } - if (name === 'a' && testMatrixTo(decodeURIComponent(props.href))) { + if (name === 'a' && testMatrixTo(tryDecodeURIComponent(props.href))) { const mention = renderMatrixMention( mx, roomId, - decodeURIComponent(props.href), + tryDecodeURIComponent(props.href), makeMentionCustomProps(params.handleMentionClick) ); if (mention) return mention; diff --git a/src/app/utils/dom.ts b/src/app/utils/dom.ts index 1aea6754..ab4b8e65 100644 --- a/src/app/utils/dom.ts +++ b/src/app/utils/dom.ts @@ -196,3 +196,11 @@ export const setFavicon = (url: string): void => { if (!favicon) return; favicon.setAttribute('href', url); }; + +export const tryDecodeURIComponent = (encodedURIComponent: string): string => { + try { + return decodeURIComponent(encodedURIComponent); + } catch { + return encodedURIComponent; + } +}; From cfe893f358785c9bea2c3bdd6402079fad1fcc3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Aug 2024 15:38:47 +1000 Subject: [PATCH 615/824] Bump docker/setup-buildx-action from 3.5.0 to 3.6.1 (#1850) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.5.0 to 3.6.1. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3.5.0...v3.6.1) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prod-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index a0a70d13..24a1be01 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -70,7 +70,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.5.0 + uses: docker/setup-buildx-action@v3.6.1 - name: Login to Docker Hub uses: docker/login-action@v3.3.0 with: From cabfdd47b5bf1c9a12c6d30a9c28fed6d6682fb9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:34:11 +0530 Subject: [PATCH 616/824] fix type to focus not working after room switch (#1866) --- src/app/features/room/RoomInput.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 2728a54c..8375d2f7 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -186,9 +186,8 @@ export const RoomInput = forwardRef( Transforms.insertFragment(editor, msgDraft); }, [editor, msgDraft]); - useEffect(() => { - if (!mobileOrTablet()) ReactEditor.focus(editor); - return () => { + useEffect( + () => () => { if (!isEmptyEditor(editor)) { const parsedDraft = JSON.parse(JSON.stringify(editor.children)); setMsgDraft(parsedDraft); @@ -197,8 +196,9 @@ export const RoomInput = forwardRef( } resetEditor(editor); resetEditorHistory(editor); - }; - }, [roomId, editor, setMsgDraft]); + }, + [roomId, editor, setMsgDraft] + ); const handleRemoveUpload = useCallback( (upload: TUploadContent | TUploadContent[]) => { From e68c56b334107862ab2eec5635c11c40c050f00b Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Sun, 4 Aug 2024 20:15:10 +1000 Subject: [PATCH 617/824] Release v4.1.0 (#1867) --- package-lock.json | 4 ++-- package.json | 2 +- src/app/pages/auth/AuthFooter.tsx | 2 +- src/app/pages/client/WelcomePage.tsx | 2 +- src/client/state/cons.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b00ff07..f5aca0e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cinny", - "version": "4.0.3", + "version": "4.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cinny", - "version": "4.0.3", + "version": "4.1.0", "license": "AGPL-3.0-only", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "1.1.6", diff --git a/package.json b/package.json index d06b9601..dc4a040b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cinny", - "version": "4.0.3", + "version": "4.1.0", "description": "Yet another matrix client", "main": "index.js", "type": "module", diff --git a/src/app/pages/auth/AuthFooter.tsx b/src/app/pages/auth/AuthFooter.tsx index 4483ec15..b6e94d2f 100644 --- a/src/app/pages/auth/AuthFooter.tsx +++ b/src/app/pages/auth/AuthFooter.tsx @@ -15,7 +15,7 @@ export function AuthFooter() { target="_blank" rel="noreferrer" > - v4.0.3 + v4.1.0 Twitter diff --git a/src/app/pages/client/WelcomePage.tsx b/src/app/pages/client/WelcomePage.tsx index 8cf6b9ff..1e146a04 100644 --- a/src/app/pages/client/WelcomePage.tsx +++ b/src/app/pages/client/WelcomePage.tsx @@ -24,7 +24,7 @@ export function WelcomePage() { target="_blank" rel="noreferrer noopener" > - v4.0.3 + v4.1.0 } diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 157d4a62..f7f65db2 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -1,5 +1,5 @@ const cons = { - version: '4.0.3', + version: '4.1.0', secretKey: { ACCESS_TOKEN: 'cinny_access_token', DEVICE_ID: 'cinny_device_id', From b4ce8a7cab727c51327c9434ef4bdd765fd7778b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:21:11 +1000 Subject: [PATCH 618/824] Bump docker/build-push-action from 6.5.0 to 6.6.1 (#1891) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.5.0 to 6.6.1. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.5.0...v6.6.1) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 7b1e2abd..827ca66e 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Build Docker image - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 24a1be01..d340cb77 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: context: . platforms: linux/amd64,linux/arm64 From ac1797344c0b8d0ded6019f33f0c9f17973de746 Mon Sep 17 00:00:00 2001 From: aceArt-GmbH <33117017+aceArt-GmbH@users.noreply.github.com> Date: Wed, 14 Aug 2024 15:29:34 +0200 Subject: [PATCH 619/824] Add translation support using i18next (#1576) Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- package-lock.json | 134 +++++++++++++++++++++++-- package.json | 4 + public/locales/de.json | 7 ++ public/locales/en.json | 7 ++ src/app/features/room/RoomTimeline.tsx | 4 +- src/app/i18n.ts | 31 ++++++ src/index.tsx | 3 + vite.config.js | 4 + 8 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 public/locales/de.json create mode 100644 public/locales/en.json create mode 100644 src/app/i18n.ts diff --git a/package-lock.json b/package-lock.json index f5aca0e7..061d3ded 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,9 @@ "formik": "2.4.6", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", + "i18next": "23.12.2", + "i18next-browser-languagedetector": "8.0.0", + "i18next-http-backend": "2.5.2", "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", @@ -54,6 +57,7 @@ "react-dom": "18.2.0", "react-error-boundary": "4.0.13", "react-google-recaptcha": "2.1.0", + "react-i18next": "15.0.0", "react-modal": "3.16.1", "react-range": "1.8.14", "react-router-dom": "6.20.0", @@ -438,11 +442,12 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -467,11 +472,6 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -6146,6 +6146,15 @@ "entities": "^4.5.0" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/html-react-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.2.0.tgz", @@ -6191,6 +6200,76 @@ "node": ">= 6" } }, + "node_modules/i18next": { + "version": "23.12.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", + "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz", + "integrity": "sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz", + "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==", + "license": "MIT", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, + "node_modules/i18next-http-backend/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/i18next-http-backend/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7717,6 +7796,28 @@ "react": ">=16.4.1" } }, + "node_modules/react-i18next": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.0.tgz", + "integrity": "sha512-2O3IgF4zivg57Q6p6i+ChDgJ371IDcEWbuWC6gvoh5NbkDMs0Q+O7RPr4v61+Se32E0V+LmtwePAeqWZW0bi6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7824,6 +7925,12 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -9294,6 +9401,15 @@ "@esbuild/win32-x64": "0.19.12" } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index dc4a040b..8c66068b 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,9 @@ "formik": "2.4.6", "html-dom-parser": "4.0.0", "html-react-parser": "4.2.0", + "i18next": "23.12.2", + "i18next-browser-languagedetector": "8.0.0", + "i18next-http-backend": "2.5.2", "immer": "9.0.16", "is-hotkey": "0.2.0", "jotai": "2.6.0", @@ -65,6 +68,7 @@ "react-dom": "18.2.0", "react-error-boundary": "4.0.13", "react-google-recaptcha": "2.1.0", + "react-i18next": "15.0.0", "react-modal": "3.16.1", "react-range": "1.8.14", "react-router-dom": "6.20.0", diff --git a/public/locales/de.json b/public/locales/de.json new file mode 100644 index 00000000..43a37160 --- /dev/null +++ b/public/locales/de.json @@ -0,0 +1,7 @@ +{ + "Organisms": { + "RoomCommon": { + "changed_room_name": " hat den Raum Name geändert" + } + } +} diff --git a/public/locales/en.json b/public/locales/en.json new file mode 100644 index 00000000..7a2534b8 --- /dev/null +++ b/public/locales/en.json @@ -0,0 +1,7 @@ +{ + "Organisms": { + "RoomCommon": { + "changed_room_name": " changed room name" + } + } +} diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 6e503703..84ce8af1 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -46,6 +46,7 @@ import { } from 'folds'; import { isKeyHotkey } from 'is-hotkey'; import { Opts as LinkifyOpts } from 'linkifyjs'; +import { useTranslation } from 'react-i18next'; import { decryptFile, eventWithShortcode, @@ -958,6 +959,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }, [editor] ); + const { t } = useTranslation(); const renderMatrixEvent = useMatrixEventRenderer< [string, MatrixEvent, number, EventTimelineSet, boolean] @@ -1273,7 +1275,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli {senderName} - {' changed room name'} + {t('Organisms.RoomCommon.changed_room_name')} } diff --git a/src/app/i18n.ts b/src/app/i18n.ts new file mode 100644 index 00000000..9e83805d --- /dev/null +++ b/src/app/i18n.ts @@ -0,0 +1,31 @@ +import i18n from 'i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; +import Backend, { HttpBackendOptions } from 'i18next-http-backend'; +import { initReactI18next } from 'react-i18next'; +import { trimTrailingSlash } from './utils/common'; + +i18n + // i18next-http-backend + // loads translations from your server + // https://github.com/i18next/i18next-http-backend + .use(Backend) + // detect user language + // learn more: https://github.com/i18next/i18next-browser-languageDetector + .use(LanguageDetector) + // pass the i18n instance to react-i18next. + .use(initReactI18next) + // init i18next + // for all options read: https://www.i18next.com/overview/configuration-options + .init({ + debug: false, + fallbackLng: 'en', + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, + load: 'languageOnly', + backend: { + loadPath: `${trimTrailingSlash(import.meta.env.BASE_URL)}/public/locales/{{lng}}.json`, + }, + }); + +export default i18n; diff --git a/src/index.tsx b/src/index.tsx index 1d864203..a289ed1c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -14,6 +14,9 @@ import settings from './client/state/settings'; import App from './app/pages/App'; +// import i18n (needs to be bundled ;)) +import './app/i18n'; + document.body.classList.add(configClass, varsClass); settings.applyTheme(); diff --git a/vite.config.js b/vite.config.js index 1255f81c..7b5ec250 100644 --- a/vite.config.js +++ b/vite.config.js @@ -35,6 +35,10 @@ const copyFiles = { src: 'public/res/android', dest: 'public/', }, + { + src: 'public/locales', + dest: 'public/', + }, ], }; From 7e7bee8f48229a7ebac0c64d5f4f744d81eca202 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:38:35 +1000 Subject: [PATCH 620/824] Bump actions/upload-artifact from 4.3.4 to 4.3.6 (#1890) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.4 to 4.3.6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4.3.4...v4.3.6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 67ae5f1e..ae1097be 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -25,7 +25,7 @@ jobs: NODE_OPTIONS: '--max_old_space_size=4096' run: npm run build - name: Upload artifact - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v4.3.6 with: name: preview path: dist @@ -33,7 +33,7 @@ jobs: - name: Save pr number run: echo ${PR_NUMBER} > ./pr.txt - name: Upload pr number - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v4.3.6 with: name: pr path: ./pr.txt From 830d05e217fd6640c219d4eb419895ca8669e111 Mon Sep 17 00:00:00 2001 From: greentore <117551249+greentore@users.noreply.github.com> Date: Thu, 15 Aug 2024 16:52:32 +0200 Subject: [PATCH 621/824] Add basic `m.thread` support (#1349) * Add basic `m.thread` support * Fix types * Update to v4 * Fix auto formatting mess * Add threaded reply indicators * Fix reply overflow * Fix replying to edited threaded replies * Add thread indicator to room input * Fix editing encrypted events * Use `toRem` function for converting units --------- Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com> --- src/app/components/message/Reply.css.ts | 19 +++++ src/app/components/message/Reply.tsx | 81 +++++++++++-------- .../message-search/SearchResultGroup.tsx | 16 ++-- src/app/features/room/RoomInput.tsx | 40 +++++---- src/app/features/room/RoomTimeline.tsx | 33 ++++---- src/app/pages/client/inbox/Notifications.tsx | 13 +-- src/app/state/room/roomInputDrafts.ts | 4 +- src/app/utils/room.ts | 19 +++-- 8 files changed, 140 insertions(+), 85 deletions(-) diff --git a/src/app/components/message/Reply.css.ts b/src/app/components/message/Reply.css.ts index 014a2840..06799391 100644 --- a/src/app/components/message/Reply.css.ts +++ b/src/app/components/message/Reply.css.ts @@ -5,6 +5,25 @@ export const ReplyBend = style({ flexShrink: 0, }); +export const ThreadIndicator = style({ + opacity: config.opacity.P300, + gap: toRem(2), + + selectors: { + 'button&': { + cursor: 'pointer', + }, + ':hover&': { + opacity: config.opacity.P500, + }, + }, +}); + +export const ThreadIndicatorIcon = style({ + width: toRem(14), + height: toRem(14), +}); + export const Reply = style({ marginBottom: toRem(1), minWidth: 0, diff --git a/src/app/components/message/Reply.tsx b/src/app/components/message/Reply.tsx index 85383cdb..82a9d919 100644 --- a/src/app/components/message/Reply.tsx +++ b/src/app/components/message/Reply.tsx @@ -1,7 +1,7 @@ import { Box, Icon, Icons, Text, as, color, toRem } from 'folds'; import { EventTimelineSet, MatrixClient, MatrixEvent, Room } from 'matrix-js-sdk'; import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend'; -import React, { ReactNode, useEffect, useMemo, useState } from 'react'; +import React, { MouseEventHandler, ReactNode, useEffect, useMemo, useState } from 'react'; import to from 'await-to-js'; import classNames from 'classnames'; import colorMXID from '../../../util/colorMXID'; @@ -22,6 +22,7 @@ export const ReplyLayout = as<'div', ReplyLayoutProps>( ( ) ); +export const ThreadIndicator = as<'div'>(({ ...props }, ref) => ( + + + Threaded reply + +)); + type ReplyProps = { mx: MatrixClient; room: Room; - timelineSet?: EventTimelineSet; - eventId: string; + timelineSet?: EventTimelineSet | undefined; + replyEventId: string; + threadRootId?: string | undefined; + onClick?: MouseEventHandler | undefined; }; -export const Reply = as<'div', ReplyProps>(({ mx, room, timelineSet, eventId, ...props }, ref) => { +export const Reply = as<'div', ReplyProps>((_, ref) => { + const { mx, room, timelineSet, replyEventId, threadRootId, onClick, ...props } = _; const [replyEvent, setReplyEvent] = useState( - timelineSet?.findEventById(eventId) + timelineSet?.findEventById(replyEventId) ); const placeholderWidth = useMemo(() => randomNumberBetween(40, 400), []); @@ -62,7 +73,7 @@ export const Reply = as<'div', ReplyProps>(({ mx, room, timelineSet, eventId, .. useEffect(() => { let disposed = false; const loadEvent = async () => { - const [err, evt] = await to(mx.fetchRoomEvent(room.roomId, eventId)); + const [err, evt] = await to(mx.fetchRoomEvent(room.roomId, replyEventId)); const mEvent = new MatrixEvent(evt); if (disposed) return; if (err) { @@ -78,37 +89,43 @@ export const Reply = as<'div', ReplyProps>(({ mx, room, timelineSet, eventId, .. return () => { disposed = true; }; - }, [replyEvent, mx, room, eventId]); + }, [replyEvent, mx, room, replyEventId]); const badEncryption = replyEvent?.getContent().msgtype === 'm.bad.encrypted'; const bodyJSX = body ? scaleSystemEmoji(trimReplyFromBody(body)) : fallbackBody; return ( - - {getMemberDisplayName(room, sender) ?? getMxIdLocalPart(sender)} - - ) - } - {...props} - ref={ref} - > - {replyEvent !== undefined ? ( - - {badEncryption ? : bodyJSX} - - ) : ( - + + {threadRootId && ( + )} - + + {getMemberDisplayName(room, sender) ?? getMxIdLocalPart(sender)} + + ) + } + data-event-id={replyEventId} + onClick={onClick} + > + {replyEvent !== undefined ? ( + + {badEncryption ? : bodyJSX} + + ) : ( + + )} + + ); }); diff --git a/src/app/features/message-search/SearchResultGroup.tsx b/src/app/features/message-search/SearchResultGroup.tsx index 2b2a816a..84ba3a76 100644 --- a/src/app/features/message-search/SearchResultGroup.tsx +++ b/src/app/features/message-search/SearchResultGroup.tsx @@ -148,7 +148,7 @@ export function SearchResultGroup({ } ); - const handleOpenClick: MouseEventHandler = (evt) => { + const handleOpenClick: MouseEventHandler = (evt) => { const eventId = evt.currentTarget.getAttribute('data-event-id'); if (!eventId) return; onOpen(room.roomId, eventId); @@ -183,15 +183,16 @@ export function SearchResultGroup({ event.sender; const senderAvatarMxc = getMemberAvatarMxc(room, event.sender); + const relation = event.content['m.relates_to']; const mainEventId = - event.content['m.relates_to']?.rel_type === RelationType.Replace - ? event.content['m.relates_to'].event_id - : event.event_id; + relation?.rel_type === RelationType.Replace ? relation.event_id : event.event_id; const getContent = (() => event.content['m.new_content'] ?? event.content) as GetContentCallback; - const replyEventId = event.content['m.relates_to']?.['m.in_reply_to']?.event_id; + const replyEventId = relation?.['m.in_reply_to']?.event_id; + const threadRootId = + relation?.rel_type === RelationType.Thread ? relation.event_id : undefined; return ( {replyEventId && ( )} diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 8375d2f7..3c78ff3e 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -10,7 +10,7 @@ import React, { } from 'react'; import { useAtom, useAtomValue } from 'jotai'; import { isKeyHotkey } from 'is-hotkey'; -import { EventType, IContent, MsgType, Room } from 'matrix-js-sdk'; +import { EventType, IContent, MsgType, RelationType, Room } from 'matrix-js-sdk'; import { ReactEditor } from 'slate-react'; import { Transforms, Editor } from 'slate'; import { @@ -106,7 +106,7 @@ import { CommandAutocomplete } from './CommandAutocomplete'; import { Command, SHRUG, useCommands } from '../../hooks/useCommands'; import { mobileOrTablet } from '../../utils/user-agent'; import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; -import { ReplyLayout } from '../../components/message'; +import { ReplyLayout, ThreadIndicator } from '../../components/message'; import { roomToParentsAtom } from '../../state/room/roomToParents'; interface RoomInputProps { @@ -310,6 +310,11 @@ export const RoomInput = forwardRef( event_id: replyDraft.eventId, }, }; + if (replyDraft.relation?.rel_type === RelationType.Thread) { + content['m.relates_to'].event_id = replyDraft.relation.event_id; + content['m.relates_to'].rel_type = RelationType.Thread; + content['m.relates_to'].is_falling_back = false; + } } mx.sendMessage(roomId, content); resetEditor(editor); @@ -489,22 +494,25 @@ export const RoomInput = forwardRef( > - + {replyDraft.relation?.rel_type === RelationType.Thread && } + + + {getMemberDisplayName(room, replyDraft.userId) ?? + getMxIdLocalPart(replyDraft.userId) ?? + replyDraft.userId} + + + } + > - - {getMemberDisplayName(room, replyDraft.userId) ?? - getMxIdLocalPart(replyDraft.userId) ?? - replyDraft.userId} - + {trimReplyFromBody(replyDraft.body)} - } - > - - {trimReplyFromBody(replyDraft.body)} - - + +
    ) diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 84ce8af1..01ba14f5 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -16,6 +16,7 @@ import { EventTimeline, EventTimelineSet, EventTimelineSetHandlerMap, + IContent, IEncryptedFile, MatrixClient, MatrixEvent, @@ -837,13 +838,13 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli markAsRead(mx, room.roomId); }; - const handleOpenReply: MouseEventHandler = useCallback( + const handleOpenReply: MouseEventHandler = useCallback( async (evt) => { - const replyId = evt.currentTarget.getAttribute('data-reply-id'); - if (typeof replyId !== 'string') return; - const replyTimeline = getEventTimeline(room, replyId); + const targetId = evt.currentTarget.getAttribute('data-event-id'); + if (!targetId) return; + const replyTimeline = getEventTimeline(room, targetId); const absoluteIndex = - replyTimeline && getEventIdAbsoluteIndex(timeline.linkedTimelines, replyTimeline, replyId); + replyTimeline && getEventIdAbsoluteIndex(timeline.linkedTimelines, replyTimeline, targetId); if (typeof absoluteIndex === 'number') { scrollToItem(absoluteIndex, { @@ -858,7 +859,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli }); } else { setTimeline(getEmptyTimeline()); - loadEventTimeline(replyId); + loadEventTimeline(targetId); } }, [room, timeline, scrollToItem, loadEventTimeline] @@ -909,8 +910,9 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const replyEvt = room.findEventById(replyId); if (!replyEvt) return; const editedReply = getEditedEvent(replyId, replyEvt, room.getUnfilteredTimelineSet()); - const { body, formatted_body: formattedBody }: Record = - editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent(); + const content: IContent = editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent(); + const { body, formatted_body: formattedBody } = content; + const { 'm.relates_to': relation } = replyEvt.getOriginalContent(); const senderId = replyEvt.getSender(); if (senderId && typeof body === 'string') { setReplyDraft({ @@ -918,6 +920,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli eventId: replyId, body, formattedBody, + relation, }); setTimeout(() => ReactEditor.focus(editor), 100); } @@ -969,7 +972,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const reactionRelations = getEventReactions(timelineSet, mEventId); const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); const hasReactions = reactions && reactions.length > 0; - const { replyEventId } = mEvent; + const { replyEventId, threadRootId } = mEvent; const highlighted = focusItem?.index === item && focusItem.highlight; const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); @@ -1004,12 +1007,11 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli reply={ replyEventId && ( ) @@ -1050,7 +1052,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const reactionRelations = getEventReactions(timelineSet, mEventId); const reactions = reactionRelations && reactionRelations.getSortedAnnotationsByKey(); const hasReactions = reactions && reactions.length > 0; - const { replyEventId } = mEvent; + const { replyEventId, threadRootId } = mEvent; const highlighted = focusItem?.index === item && focusItem.highlight; return ( @@ -1077,12 +1079,11 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli reply={ replyEventId && ( ) diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 6a8160d8..aa878216 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -20,6 +20,7 @@ import { IRoomEvent, JoinRule, Method, + RelationType, Room, } from 'matrix-js-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; @@ -352,7 +353,7 @@ function RoomNotificationsGroupComp({ } ); - const handleOpenClick: MouseEventHandler = (evt) => { + const handleOpenClick: MouseEventHandler = (evt) => { const eventId = evt.currentTarget.getAttribute('data-event-id'); if (!eventId) return; onOpen(room.roomId, eventId); @@ -403,7 +404,10 @@ function RoomNotificationsGroupComp({ const senderAvatarMxc = getMemberAvatarMxc(room, event.sender); const getContent = (() => event.content) as GetContentCallback; - const replyEventId = event.content['m.relates_to']?.['m.in_reply_to']?.event_id; + const relation = event.content['m.relates_to']; + const replyEventId = relation?.['m.in_reply_to']?.event_id; + const threadRootId = + relation?.rel_type === RelationType.Thread ? relation.event_id : undefined; return ( {replyEventId && ( )} diff --git a/src/app/state/room/roomInputDrafts.ts b/src/app/state/room/roomInputDrafts.ts index 60b42fdb..33bd0607 100644 --- a/src/app/state/room/roomInputDrafts.ts +++ b/src/app/state/room/roomInputDrafts.ts @@ -2,6 +2,7 @@ import { atom } from 'jotai'; import { atomFamily } from 'jotai/utils'; import { Descendant } from 'slate'; import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { IEventRelation } from 'matrix-js-sdk'; import { TListAtom, createListAtom } from '../list'; import { createUploadAtomFamily } from '../upload'; import { TUploadContent } from '../../utils/matrix'; @@ -39,7 +40,8 @@ export type IReplyDraft = { userId: string; eventId: string; body: string; - formattedBody?: string; + formattedBody?: string | undefined; + relation?: IEventRelation | undefined; }; const createReplyDraftAtom = () => atom(undefined); export type TReplyDraftAtom = ReturnType; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index 750dd6ca..8cf33a8f 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -389,13 +389,18 @@ export const getEditedEvent = ( return edits && getLatestEdit(mEvent, edits.getRelations()); }; -export const canEditEvent = (mx: MatrixClient, mEvent: MatrixEvent) => - mEvent.getSender() === mx.getUserId() && - !mEvent.isRelation() && - mEvent.getType() === MessageEvent.RoomMessage && - (mEvent.getContent().msgtype === MsgType.Text || - mEvent.getContent().msgtype === MsgType.Emote || - mEvent.getContent().msgtype === MsgType.Notice); +export const canEditEvent = (mx: MatrixClient, mEvent: MatrixEvent) => { + const content = mEvent.getContent(); + const relationType = content['m.relates_to']?.rel_type; + return ( + mEvent.getSender() === mx.getUserId() && + (!relationType || relationType === RelationType.Thread) && + mEvent.getType() === MessageEvent.RoomMessage && + (content.msgtype === MsgType.Text || + content.msgtype === MsgType.Emote || + content.msgtype === MsgType.Notice) + ); +}; export const getLatestEditableEvt = ( timeline: EventTimeline, From 16be69c104f760e491e36684a48492ef661cd01b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 00:21:25 +1000 Subject: [PATCH 622/824] Bump docker/build-push-action from 6.6.1 to 6.7.0 (#1906) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.6.1 to 6.7.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.6.1...v6.7.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/prod-deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 827ca66e..7c67c27a 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4.1.7 - name: Build Docker image - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: context: . push: false diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index d340cb77..f8f13a7e 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -90,7 +90,7 @@ jobs: ${{ secrets.DOCKER_USERNAME }}/cinny ghcr.io/${{ github.repository }} - name: Build and push Docker image - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: context: . platforms: linux/amd64,linux/arm64 From bdba0332e1494c8a71be3d0fe6837238f3d967d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 00:22:26 +1000 Subject: [PATCH 623/824] Bump cla-assistant/github-action from 2.4.0 to 2.5.1 (#1905) Bumps [cla-assistant/github-action](https://github.com/cla-assistant/github-action) from 2.4.0 to 2.5.1. - [Release notes](https://github.com/cla-assistant/github-action/releases) - [Commits](https://github.com/cla-assistant/github-action/compare/v2.4.0...v2.5.1) --- updated-dependencies: - dependency-name: cla-assistant/github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 2ad3d145..65513427 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -12,7 +12,7 @@ jobs: - name: 'CLA Assistant' if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' # Beta Release - uses: cla-assistant/github-action@v2.4.0 + uses: cla-assistant/github-action@v2.5.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # the below token should have repo scope and must be manually added by you in the repository's secret From 22b7f6dd7d211b9d66b0ff8e237eade9eb473b6e Mon Sep 17 00:00:00 2001 From: Krishan <33421343+kfiven@users.noreply.github.com> Date: Wed, 21 Aug 2024 20:13:40 +1000 Subject: [PATCH 624/824] Create Code of Conduct (#1908) --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..f1ef5d46 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +cinnyapp@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 5c9ee1a988eedf8efa34b7065164f10018002009 Mon Sep 17 00:00:00 2001 From: utf <25370216+utf-4096@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:56:03 +0200 Subject: [PATCH 625/824] Fix IPv6 support for the Docker container (#1884) * Fix `docker-nginx.conf` indentation * Listen on IPv4 and IPv6 inside Docker --- docker-nginx.conf | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docker-nginx.conf b/docker-nginx.conf index 6994b8c8..efe21fac 100644 --- a/docker-nginx.conf +++ b/docker-nginx.conf @@ -1,8 +1,11 @@ server { - location / { - root /usr/share/nginx/html; + listen 80; + listen [::]:80; - rewrite ^/config.json$ /config.json break; + location / { + root /usr/share/nginx/html; + + rewrite ^/config.json$ /config.json break; rewrite ^/manifest.json$ /manifest.json break; rewrite ^.*/olm.wasm$ /olm.wasm break; @@ -12,5 +15,5 @@ server { rewrite ^/assets/(.*)$ /assets/$1 break; rewrite ^(.+)$ /index.html break; - } -} \ No newline at end of file + } +} From 043012e809a262a9453f1c81dddee183407ddf01 Mon Sep 17 00:00:00 2001 From: Dylan Hackworth Date: Sat, 7 Sep 2024 08:08:16 -0500 Subject: [PATCH 626/824] pressing up to edit should take you to end of line (#1928) --- src/app/features/room/RoomTimeline.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 01ba14f5..d86ea4d9 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -726,6 +726,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const editableEvtId = editableEvt?.getId(); if (!editableEvtId) return; setEditId(editableEvtId); + evt.preventDefault() } }, [mx, room, editor] From c6a8fb1117d2ec52545d96f8a2fa7e291d8aada5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Sat, 7 Sep 2024 21:45:55 +0800 Subject: [PATCH 627/824] Add authenticated media support (#1930) * chore: Bump matrix-js-sdk to 34.4.0 * feat: Authenticated media support * chore: Use Vite PWA for service worker support * fix: Fix Vite PWA SW entry point Forget this. :P * fix: Also add Nginx rewrite for sw.js * fix: Correct Nginx rewrite * fix: Add Netlify redirect for sw.js Otherwise the generic SPA rewrite to index.html would take effect, breaking Service Worker. * fix: Account for subpath when regisering service worker * chore: Correct types --- .npmrc | 3 +- contrib/nginx/cinny.domain.tld.conf | 1 + docker-nginx.conf | 1 + netlify.toml | 7 +- package-lock.json | 3365 +++++++++++++++-- package.json | 6 +- src/app/components/editor/Elements.tsx | 6 +- .../autocomplete/EmoticonAutocomplete.tsx | 6 +- .../autocomplete/UserMentionAutocomplete.tsx | 6 +- src/app/components/emoji-board/EmojiBoard.tsx | 115 +- .../components/event-readers/EventReaders.tsx | 8 +- src/app/components/message/Reaction.tsx | 8 +- .../message/content/AudioContent.tsx | 8 +- .../message/content/FileContent.tsx | 20 +- .../message/content/ImageContent.tsx | 8 +- .../message/content/ThumbnailContent.tsx | 8 +- .../message/content/VideoContent.tsx | 8 +- src/app/components/room-card/RoomCard.tsx | 9 +- src/app/components/room-intro/RoomIntro.tsx | 7 +- .../components/url-preview/UrlPreviewCard.tsx | 6 +- src/app/features/lobby/LobbyHeader.tsx | 6 +- src/app/features/lobby/LobbyHero.tsx | 6 +- src/app/features/lobby/RoomItem.tsx | 10 +- src/app/features/lobby/SpaceItem.tsx | 10 +- .../message-search/SearchResultGroup.tsx | 12 +- src/app/features/room-nav/RoomNavItem.tsx | 5 +- src/app/features/room/MembersDrawer.tsx | 18 +- src/app/features/room/RoomInput.tsx | 7 +- src/app/features/room/RoomTimeline.tsx | 43 +- src/app/features/room/RoomViewHeader.tsx | 7 +- src/app/features/room/message/Message.tsx | 93 +- src/app/features/room/message/Reactions.tsx | 4 + .../room/reaction-viewer/ReactionViewer.tsx | 14 +- src/app/pages/client/ClientNonUIFeatures.tsx | 7 +- src/app/pages/client/inbox/Invites.tsx | 5 +- src/app/pages/client/inbox/Notifications.tsx | 12 +- src/app/pages/client/sidebar/SpaceTabs.tsx | 40 +- src/app/pages/client/sidebar/UserTab.tsx | 7 +- src/app/plugins/react-custom-html-parser.tsx | 10 +- src/app/utils/matrix.ts | 20 + src/app/utils/room.ts | 22 +- src/client/initMatrix.ts | 2 +- src/index.tsx | 18 + src/sw.ts | 43 + tsconfig.json | 3 +- vite.config.js | 19 +- 46 files changed, 3562 insertions(+), 487 deletions(-) create mode 100644 src/sw.ts diff --git a/.npmrc b/.npmrc index 8833acba..e28ce002 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,2 @@ legacy-peer-deps=true -save-exact=true -@matrix-org:registry=https://gitlab.matrix.org/api/v4/projects/27/packages/npm/ \ No newline at end of file +save-exact=true \ No newline at end of file diff --git a/contrib/nginx/cinny.domain.tld.conf b/contrib/nginx/cinny.domain.tld.conf index 360302c0..0ba70f7e 100644 --- a/contrib/nginx/cinny.domain.tld.conf +++ b/contrib/nginx/cinny.domain.tld.conf @@ -24,6 +24,7 @@ server { rewrite ^/manifest.json$ /manifest.json break; rewrite ^.*/olm.wasm$ /olm.wasm break; + rewrite ^/sw.js$ /sw.js break; rewrite ^/pdf.worker.min.js$ /pdf.worker.min.js break; rewrite ^/public/(.*)$ /public/$1 break; diff --git a/docker-nginx.conf b/docker-nginx.conf index efe21fac..fca10746 100644 --- a/docker-nginx.conf +++ b/docker-nginx.conf @@ -9,6 +9,7 @@ server { rewrite ^/manifest.json$ /manifest.json break; rewrite ^.*/olm.wasm$ /olm.wasm break; + rewrite ^/sw.js$ /sw.js break; rewrite ^/pdf.worker.min.js$ /pdf.worker.min.js break; rewrite ^/public/(.*)$ /public/$1 break; diff --git a/netlify.toml b/netlify.toml index d79aa91c..1b192bec 100644 --- a/netlify.toml +++ b/netlify.toml @@ -7,7 +7,12 @@ from = "/manifest.json" to = "/manifest.json" status = 200 - + +[[redirects]] + from = "/sw.js" + to = "/sw.js" + status = 200 + [[redirects]] from = "*/olm.wasm" to = "/olm.wasm" diff --git a/package-lock.json b/package-lock.json index 061d3ded..1dcff435 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", - "@matrix-org/olm": "3.2.14", + "@matrix-org/olm": "3.2.15", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", "@tanstack/react-virtual": "3.2.0", @@ -45,7 +45,7 @@ "jotai": "2.6.0", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", - "matrix-js-sdk": "29.1.0", + "matrix-js-sdk": "34.4.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", @@ -79,6 +79,7 @@ "@types/react-dom": "18.2.17", "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", + "@types/serviceworker": "0.0.95", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", @@ -95,6 +96,7 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", + "vite-plugin-pwa": "0.20.5", "vite-plugin-static-copy": "1.0.4", "vite-plugin-top-level-await": "1.4.1" }, @@ -114,6 +116,24 @@ "node": ">=6.0.0" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, "node_modules/@atlaskit/pragmatic-drag-and-drop": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-1.1.6.tgz", @@ -143,40 +163,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -192,13 +215,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", - "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -206,26 +230,55 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -237,6 +290,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -244,60 +298,23 @@ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -306,90 +323,249 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", - "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.4", - "@babel/types": "^7.23.4" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -397,6 +573,339 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "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-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "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-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, + "license": "MIT", + "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.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", @@ -411,6 +920,676 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", @@ -441,6 +1620,307 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/runtime": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", @@ -473,32 +1953,31 @@ "dev": true }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -506,12 +1985,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1077,9 +2557,36 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { "node": ">=6.0.0" } @@ -1090,12 +2597,13 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@juggle/resize-observer": { @@ -1139,17 +2647,19 @@ } }, "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-2.2.0.tgz", - "integrity": "sha512-txmvaTiZpVV0/kWCRcE7tZvRESCEc1ynLJDVh9OUsFlaXfl13c7qdD3E6IJEJ8YiPMIn+PHogdfBZsO84reaMg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-7.0.0.tgz", + "integrity": "sha512-MOencXiW/gI5MuTtCNsuojjwT5DXCrjMqv9xOslJC9h2tPdLFFFMGr58dY5Lis4DRd9MRWcgrGowUIHOqieWTA==", + "license": "Apache-2.0", "engines": { "node": ">= 10" } }, "node_modules/@matrix-org/olm": { - "version": "3.2.14", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", - "integrity": "sha1-rNlsAKiB0PRi4fl6Vsc3QsjbyYQ=" + "version": "3.2.15", + "resolved": "https://registry.npmjs.org/@matrix-org/olm/-/olm-3.2.15.tgz", + "integrity": "sha512-S7lOrndAK9/8qOtaTq/WhttJC/o4GAzdfK0MUPpo8ApzsJEC0QjtwrkC3KBXdFP1cD1MXi/mlKR7aaoVMKgs6Q==", + "license": "Apache-2.0" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -2608,6 +4118,55 @@ "node": ">=14.0.0" } }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", @@ -2636,6 +4195,114 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-virtual": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", @@ -2867,6 +4534,29 @@ "win32" ] }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@swc/core": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", @@ -3227,9 +4917,10 @@ "dev": true }, "node_modules/@types/events": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.2.tgz", - "integrity": "sha512-v4Mr60wJuF069iZZCdY5DKhfj0l6eXNJtbSM/oMDNdRLoBEUsktmKnswkz0X3OAic5W8Qy/YU6owKE4A66Y46A==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.3.tgz", + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==", + "license": "MIT" }, "node_modules/@types/file-saver": { "version": "2.0.5", @@ -3313,6 +5004,13 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -3338,6 +5036,20 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@types/serviceworker": { + "version": "0.0.95", + "resolved": "https://registry.npmjs.org/@types/serviceworker/-/serviceworker-0.0.95.tgz", + "integrity": "sha512-Zw7kLIehLvaXf/9RnxAUiYyHmYC5pfvIJD3b1uSPkZGzp+OVmXgmPzVW5fbhYHKcqkeGzsv89uGm+JmMCAPa8Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ua-parser-js": { "version": "0.7.36", "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", @@ -3766,10 +5478,11 @@ "optional": true }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3836,6 +5549,7 @@ "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==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -4041,6 +5755,23 @@ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/autosize": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", @@ -4084,6 +5815,48 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4091,9 +5864,10 @@ "devOptional": true }, "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -4162,9 +5936,9 @@ "integrity": "sha512-L7siI766UCH6+arP9yT5wpA5AFxnmGbKiGSsxEVACl1tE0pvDJeQvMmbY2UmJiuffrr0ZJ2+U6Om46wQBqh1Lw==" }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -4179,11 +5953,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4193,11 +5968,12 @@ } }, "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", "dependencies": { - "base-x": "^4.0.0" + "base-x": "^5.0.0" } }, "node_modules/buffer": { @@ -4224,6 +6000,26 @@ "ieee754": "^1.2.1" } }, + "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, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -4253,9 +6049,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001565", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", - "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "version": "1.0.30001658", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", "funding": [ { "type": "opencollective", @@ -4269,7 +6065,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canvas": { "version": "2.11.2", @@ -4290,6 +6087,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4377,6 +6175,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -4384,7 +6183,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", @@ -4395,6 +6195,23 @@ "color-support": "bin.js" } }, + "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, + "license": "MIT" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -4436,6 +6253,20 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-pure": { "version": "3.26.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", @@ -4469,10 +6300,15 @@ "node": ">= 8" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/css-what": { "version": "5.1.0", @@ -4572,11 +6408,12 @@ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4754,10 +6591,27 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.596", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz", - "integrity": "sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg==" + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz", + "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4967,9 +6821,10 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4978,6 +6833,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -5481,6 +7337,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5505,6 +7368,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -5560,6 +7424,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", @@ -5614,6 +7485,21 @@ "node": "*" } }, + "node_modules/fdir": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", + "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5631,6 +7517,39 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5761,6 +7680,22 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -5896,6 +7831,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -5949,6 +7891,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -6038,6 +7981,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -6270,6 +8214,13 @@ } } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6446,6 +8397,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6534,6 +8501,13 @@ "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -6570,6 +8544,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -6603,6 +8587,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -6618,6 +8612,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -6687,6 +8694,101 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/jake/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/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, + "license": "MIT" + }, + "node_modules/jake/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -6743,6 +8845,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -6750,6 +8853,13 @@ "node": ">=4" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6773,6 +8883,29 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -6787,9 +8920,13 @@ } }, "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/language-subtag-registry": { "version": "0.3.22", @@ -6820,6 +8957,16 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6890,12 +9037,26 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "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/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, "node_modules/loglevel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", @@ -6964,33 +9125,49 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-29.1.0.tgz", - "integrity": "sha512-nF+ACFioDltGCf2KFfXK7QoJ70Ytnzm4Jse2UI+BDXeR9WCjtKefXJtboN2rmU4MFmLCTHcnBTmu6yig67YUqw==", + "version": "34.4.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-34.4.0.tgz", + "integrity": "sha512-bI5xJZS3/qhjPQqQL5HhOQ1iBvnHxiqhS2zgzk9SarEuXiH08wbVl9gAAuDqOYE3miNGs4WQQJ19MoaUEOnNwg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-wasm": "^2.0.0", + "@matrix-org/matrix-sdk-crypto-wasm": "^7.0.0", + "@matrix-org/olm": "3.2.15", "another-json": "^0.2.0", - "bs58": "^5.0.0", + "bs58": "^6.0.0", "content-type": "^1.0.4", - "jwt-decode": "^3.1.2", + "jwt-decode": "^4.0.0", "loglevel": "^1.7.1", "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.6.0", - "oidc-client-ts": "^2.2.4", + "matrix-widget-api": "^1.8.2", + "oidc-client-ts": "^3.0.1", "p-retry": "4", "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6", - "uuid": "9" + "uuid": "10" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/matrix-js-sdk/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/matrix-widget-api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.6.0.tgz", - "integrity": "sha512-VXIJyAZ/WnBmT4C7ePqevgMYGneKMCP/0JuCOqntSsaNlCRHJvwvTxmqUU+ufOpzIF5gYNyIrAjbgrEbK3iqJQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.9.0.tgz", + "integrity": "sha512-au8mqralNDqrEvaVAkU37bXOb8I9SCe+ACdPk11QWw58FKstVq31q2wRz+qWA6J+42KJ6s1DggWbG/S3fEs3jw==", + "license": "Apache-2.0", "dependencies": { "@types/events": "^3.0.0", "events": "^3.2.0" @@ -7117,9 +9294,10 @@ } }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nan": { "version": "2.17.0", @@ -7176,9 +9354,10 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "license": "MIT" }, "node_modules/nopt": { "version": "5.0.0", @@ -7337,15 +9516,15 @@ } }, "node_modules/oidc-client-ts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", - "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.0.1.tgz", + "integrity": "sha512-xX8unZNtmtw3sOz4FPSqDhkLFnxCDsdo2qhFEH2opgWnF/iXMFoYdBQzkwCxAZVgt3FT3DnuBY3k80EZHT0RYg==", + "license": "Apache-2.0", "dependencies": { - "crypto-js": "^4.2.0", - "jwt-decode": "^3.1.2" + "jwt-decode": "^4.0.0" }, "engines": { - "node": ">=12.13.0" + "node": ">=18" } }, "node_modules/once": { @@ -7499,9 +9678,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -7603,6 +9783,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -7663,6 +9856,16 @@ "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -7925,12 +10128,42 @@ "node": ">=8.10.0" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -7961,6 +10194,46 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7969,6 +10242,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", @@ -8110,6 +10393,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "devOptional": true, "funding": [ { "type": "github", @@ -8123,8 +10407,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "optional": true + ] }, "node_modules/safe-regex-test": { "version": "1.0.3", @@ -8224,6 +10507,16 @@ "semver": "bin/semver.js" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -8395,6 +10688,26 @@ "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.1.8.tgz", "integrity": "sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==" }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -8403,6 +10716,64 @@ "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, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/source-map/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/source-map/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -8498,6 +10869,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8518,6 +10904,16 @@ "node": ">=4" } }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8550,6 +10946,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -8591,6 +10988,67 @@ "node": ">=10" } }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -8607,6 +11065,33 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "node_modules/tinyglobby": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.5.tgz", + "integrity": "sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==", + "dev": true, + "license": "ISC", + "dependencies": { + "fdir": "^6.2.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -8833,10 +11318,88 @@ "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -8851,9 +11414,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -8881,6 +11445,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -8944,6 +11509,37 @@ } } }, + "node_modules/vite-plugin-pwa": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", + "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, "node_modules/vite-plugin-static-copy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.4.tgz", @@ -8976,27 +11572,6 @@ "node": ">=14.14" } }, - "node_modules/vite-plugin-static-copy/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/vite-plugin-static-copy/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/vite-plugin-top-level-await": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.1.tgz", @@ -9500,6 +12075,266 @@ "node": ">=0.10.0" } }, + "node_modules/workbox-background-sync": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", + "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", + "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-build": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz", + "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.1.0", + "workbox-broadcast-update": "7.1.0", + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-google-analytics": "7.1.0", + "workbox-navigation-preload": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-range-requests": "7.1.0", + "workbox-recipes": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0", + "workbox-streams": "7.1.0", + "workbox-sw": "7.1.0", + "workbox-window": "7.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", + "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-core": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", + "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", + "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-background-sync": "7.1.0", + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", + "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", + "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", + "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz", + "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", + "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz", + "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-window": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz", + "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.1.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9611,4 +12446,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 8c66068b..09efccb7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "1.3.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@fontsource/inter": "4.5.14", - "@matrix-org/olm": "3.2.14", + "@matrix-org/olm": "3.2.15", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", "@tanstack/react-virtual": "3.2.0", @@ -56,7 +56,7 @@ "jotai": "2.6.0", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", - "matrix-js-sdk": "29.1.0", + "matrix-js-sdk": "34.4.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", @@ -90,6 +90,7 @@ "@types/react-dom": "18.2.17", "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", + "@types/serviceworker": "0.0.95", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", @@ -106,6 +107,7 @@ "sass": "1.56.2", "typescript": "4.9.4", "vite": "5.0.13", + "vite-plugin-pwa": "0.20.5", "vite-plugin-static-copy": "1.0.4", "vite-plugin-top-level-await": "1.4.1" } diff --git a/src/app/components/editor/Elements.tsx b/src/app/components/editor/Elements.tsx index c4767ab9..aee50ac8 100644 --- a/src/app/components/editor/Elements.tsx +++ b/src/app/components/editor/Elements.tsx @@ -13,6 +13,8 @@ import { CommandElement, EmoticonElement, LinkElement, MentionElement } from './ import { useMatrixClient } from '../../hooks/useMatrixClient'; import { getBeginCommand } from './utils'; import { BlockType } from './types'; +import { mxcUrlToHttp } from '../../utils/matrix'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; // Put this at the start and end of an inline component to work around this Chromium bug: // https://bugs.chromium.org/p/chromium/issues/detail?id=1249405 @@ -76,6 +78,8 @@ function RenderEmoticonElement({ children, }: { element: EmoticonElement } & RenderElementProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const selected = useSelected(); const focused = useFocused(); @@ -90,7 +94,7 @@ function RenderEmoticonElement({ {element.key.startsWith('mxc://') ? ( {element.shortcode} ) : ( diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index bc98667e..b77ae746 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -18,6 +18,8 @@ import { useRelevantImagePacks } from '../../../hooks/useImagePacks'; import { IEmoji, emojis } from '../../../plugins/emoji'; import { ExtendedPackImage, PackUsage } from '../../../plugins/custom-emoji'; import { useKeyDown } from '../../../hooks/useKeyDown'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type EmoticonCompleteHandler = (key: string, shortcode: string) => void; @@ -48,6 +50,8 @@ export function EmoticonAutocomplete({ requestClose, }: EmoticonAutocompleteProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const imagePacks = useRelevantImagePacks(mx, PackUsage.Emoticon, imagePackRooms); const recentEmoji = useRecentEmoji(mx, 20); @@ -103,7 +107,7 @@ export function EmoticonAutocomplete({ diff --git a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx index 642ce50a..05d303a2 100644 --- a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx @@ -18,6 +18,7 @@ import { useKeyDown } from '../../../hooks/useKeyDown'; import { getMxIdLocalPart, getMxIdServer, validMxId } from '../../../utils/matrix'; import { getMemberDisplayName, getMemberSearchStr } from '../../../utils/room'; import { UserAvatar } from '../../user-avatar'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type MentionAutoCompleteHandler = (userId: string, name: string) => void; @@ -84,6 +85,8 @@ export function UserMentionAutocomplete({ requestClose, }: UserMentionAutocompleteProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const roomId: string = room.roomId!; const roomAliasOrId = room.getCanonicalAlias() || roomId; const members = useRoomMembers(mx, roomId); @@ -143,7 +146,8 @@ export function UserMentionAutocomplete({ /> ) : ( autoCompleteMembers.map((roomMember) => { - const avatarUrl = roomMember.getAvatarUrl(mx.baseUrl, 32, 32, 'crop', undefined, false); + const avatarMxcUrl = roomMember.getMxcAvatarUrl(); + const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp(avatarMxcUrl, 32, 32, 'crop', undefined, false, useAuthentication) : undefined; return ( void; + useAuthentication?: boolean; }) { const activeGroupId = useAtomValue(activeGroupIdAtom); return ( @@ -381,7 +384,7 @@ function ImagePackSidebarStack({ height: toRem(24), objectFit: 'contain', }} - src={mx.mxcUrlToHttp(pack.getPackAvatarUrl(usage) ?? '') || pack.avatarUrl} + src={mxcUrlToHttp(mx, pack.getPackAvatarUrl(usage) ?? '', useAuthentication) || pack.avatarUrl} alt={label || 'Unknown Pack'} /> @@ -453,68 +456,70 @@ export function SearchEmojiGroup({ label, id, emojis: searchResult, + useAuthentication, }: { mx: MatrixClient; tab: EmojiBoardTab; label: string; id: string; emojis: Array; + useAuthentication?: boolean; }) { return ( {tab === EmojiBoardTab.Emoji ? searchResult.map((emoji) => - 'unicode' in emoji ? ( - - {emoji.unicode} - - ) : ( - - {emoji.body - - ) + 'unicode' in emoji ? ( + + {emoji.unicode} + + ) : ( + + {emoji.body + ) + ) : searchResult.map((emoji) => - 'unicode' in emoji ? null : ( - - {emoji.body - - ) - )} + 'unicode' in emoji ? null : ( + + {emoji.body + + ) + )} ); } export const CustomEmojiGroups = memo( - ({ mx, groups }: { mx: MatrixClient; groups: ImagePack[] }) => ( + ({ mx, groups, useAuthentication }: { mx: MatrixClient; groups: ImagePack[]; useAuthentication?: boolean }) => ( <> {groups.map((pack) => ( @@ -530,7 +535,7 @@ export const CustomEmojiGroups = memo( loading="lazy" className={css.CustomEmojiImg} alt={image.body || image.shortcode} - src={mx.mxcUrlToHttp(image.url) ?? image.url} + src={mxcUrlToHttp(mx, image.url, useAuthentication) ?? image.url} /> ))} @@ -540,7 +545,7 @@ export const CustomEmojiGroups = memo( ) ); -export const StickerGroups = memo(({ mx, groups }: { mx: MatrixClient; groups: ImagePack[] }) => ( +export const StickerGroups = memo(({ mx, groups, useAuthentication }: { mx: MatrixClient; groups: ImagePack[]; useAuthentication?: boolean }) => ( <> {groups.length === 0 && ( ))} @@ -645,6 +650,8 @@ export function EmojiBoard({ const setActiveGroupId = useSetAtom(activeGroupIdAtom); const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const emojiGroupLabels = useEmojiGroupLabels(); const emojiGroupIcons = useEmojiGroupIcons(); const imagePacks = useRelevantImagePacks(mx, usage, imagePackRooms); @@ -729,14 +736,14 @@ export function EmojiBoard({ } else if (emojiInfo.type === EmojiType.CustomEmoji && emojiPreviewRef.current) { const img = document.createElement('img'); img.className = css.CustomEmojiImg; - img.setAttribute('src', mx.mxcUrlToHttp(emojiInfo.data) || emojiInfo.data); + img.setAttribute('src', mxcUrlToHttp(mx, emojiInfo.data, useAuthentication) || emojiInfo.data); img.setAttribute('alt', emojiInfo.shortcode); emojiPreviewRef.current.textContent = ''; emojiPreviewRef.current.appendChild(img); } emojiPreviewTextRef.current.textContent = `:${emojiInfo.shortcode}:`; }, - [mx] + [mx, useAuthentication] ); const throttleEmojiHover = useThrottle(handleEmojiPreview, { @@ -829,6 +836,7 @@ export function EmojiBoard({ usage={usage} packs={imagePacks} onItemClick={handleScrollToGroup} + useAuthentication={useAuthentication} /> )} {emojiTab && ( @@ -890,13 +898,14 @@ export function EmojiBoard({ id={SEARCH_GROUP_ID} label={result.items.length ? 'Search Results' : 'No Results found'} emojis={result.items} + useAuthentication={useAuthentication} /> )} {emojiTab && recentEmojis.length > 0 && ( )} - {emojiTab && } - {stickerTab && } + {emojiTab && } + {stickerTab && } {emojiTab && } diff --git a/src/app/components/event-readers/EventReaders.tsx b/src/app/components/event-readers/EventReaders.tsx index 08e24a52..a6163b8b 100644 --- a/src/app/components/event-readers/EventReaders.tsx +++ b/src/app/components/event-readers/EventReaders.tsx @@ -21,6 +21,7 @@ import * as css from './EventReaders.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { openProfileViewer } from '../../../client/action/navigation'; import { UserAvatar } from '../user-avatar'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; export type EventReadersProps = { room: Room; @@ -30,6 +31,8 @@ export type EventReadersProps = { export const EventReaders = as<'div', EventReadersProps>( ({ className, room, eventId, requestClose, ...props }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const latestEventReaders = useRoomEventReaders(room, eventId); const getName = (userId: string) => @@ -55,9 +58,10 @@ export const EventReaders = as<'div', EventReadersProps>( {latestEventReaders.map((readerId) => { const name = getName(readerId); - const avatarUrl = room + const avatarMxcUrl = room .getMember(readerId) - ?.getAvatarUrl(mx.baseUrl, 100, 100, 'crop', undefined, false); + ?.getMxcAvatarUrl(); + const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication) : undefined; return ( (({ className, mx, count, reaction, ...props }, ref) => ( +>(({ className, mx, count, reaction, useAuthentication, ...props }, ref) => ( ) : ( diff --git a/src/app/components/message/content/AudioContent.tsx b/src/app/components/message/content/AudioContent.tsx index 34777cc4..38fa9515 100644 --- a/src/app/components/message/content/AudioContent.tsx +++ b/src/app/components/message/content/AudioContent.tsx @@ -17,6 +17,8 @@ import { } from '../../../hooks/media'; import { useThrottle } from '../../../hooks/useThrottle'; import { secondsToMinutesAndSeconds } from '../../../utils/common'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; const PLAY_TIME_THROTTLE_OPS = { wait: 500, @@ -44,11 +46,13 @@ export function AudioContent({ renderMediaControl, }: AudioContentProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [srcState, loadSrc] = useAsyncCallback( useCallback( - () => getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo), - [mx, url, mimeType, encInfo] + () => getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType, encInfo), + [mx, url, useAuthentication, mimeType, encInfo] ) ); diff --git a/src/app/components/message/content/FileContent.tsx b/src/app/components/message/content/FileContent.tsx index f09c1e07..379d1456 100644 --- a/src/app/components/message/content/FileContent.tsx +++ b/src/app/components/message/content/FileContent.tsx @@ -30,6 +30,8 @@ import { } from '../../../utils/mimeTypes'; import * as css from './style.css'; import { stopPropagation } from '../../../utils/keyboard'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; const renderErrorButton = (retry: () => void, text: string) => ( getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo), - [mx, url, mimeType, encInfo] + () => getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType, encInfo), + [mx, url, useAuthentication, mimeType, encInfo] ); const [textState, loadText] = useAsyncCallback( @@ -166,14 +170,16 @@ export type ReadPdfFileProps = { }; export function ReadPdfFile({ body, mimeType, url, encInfo, renderViewer }: ReadPdfFileProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [pdfViewer, setPdfViewer] = useState(false); const [pdfState, loadPdf] = useAsyncCallback( useCallback(async () => { - const httpUrl = await getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo); + const httpUrl = await getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType, encInfo); setPdfViewer(true); return httpUrl; - }, [mx, url, mimeType, encInfo]) + }, [mx, url, useAuthentication, mimeType, encInfo]) ); return ( @@ -240,13 +246,15 @@ export type DownloadFileProps = { }; export function DownloadFile({ body, mimeType, url, info, encInfo }: DownloadFileProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [downloadState, download] = useAsyncCallback( useCallback(async () => { - const httpUrl = await getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo); + const httpUrl = await getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType, encInfo); FileSaver.saveAs(httpUrl, body); return httpUrl; - }, [mx, url, mimeType, encInfo, body]) + }, [mx, url, useAuthentication, mimeType, encInfo, body]) ); return downloadState.status === AsyncStatus.Error ? ( diff --git a/src/app/components/message/content/ImageContent.tsx b/src/app/components/message/content/ImageContent.tsx index 90c46354..798c60c5 100644 --- a/src/app/components/message/content/ImageContent.tsx +++ b/src/app/components/message/content/ImageContent.tsx @@ -27,6 +27,8 @@ import * as css from './style.css'; import { bytesToSize } from '../../../utils/common'; import { FALLBACK_MIMETYPE } from '../../../utils/mimeTypes'; import { stopPropagation } from '../../../utils/keyboard'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type RenderViewerProps = { src: string; @@ -69,6 +71,8 @@ export const ImageContent = as<'div', ImageContentProps>( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const blurHash = info?.[MATRIX_BLUR_HASH_PROPERTY_NAME]; const [load, setLoad] = useState(false); @@ -77,8 +81,8 @@ export const ImageContent = as<'div', ImageContentProps>( const [srcState, loadSrc] = useAsyncCallback( useCallback( - () => getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType || FALLBACK_MIMETYPE, encInfo), - [mx, url, mimeType, encInfo] + () => getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType || FALLBACK_MIMETYPE, encInfo), + [mx, url, useAuthentication, mimeType, encInfo] ) ); diff --git a/src/app/components/message/content/ThumbnailContent.tsx b/src/app/components/message/content/ThumbnailContent.tsx index 9d940f3a..4324376d 100644 --- a/src/app/components/message/content/ThumbnailContent.tsx +++ b/src/app/components/message/content/ThumbnailContent.tsx @@ -3,6 +3,8 @@ import { IThumbnailContent } from '../../../../types/matrix/common'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { getFileSrcUrl } from './util'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; export type ThumbnailContentProps = { info: IThumbnailContent; @@ -10,6 +12,8 @@ export type ThumbnailContentProps = { }; export function ThumbnailContent({ info, renderImage }: ThumbnailContentProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [thumbSrcState, loadThumbSrc] = useAsyncCallback( useCallback(() => { @@ -19,11 +23,11 @@ export function ThumbnailContent({ info, renderImage }: ThumbnailContentProps) { throw new Error('Failed to load thumbnail'); } return getFileSrcUrl( - mx.mxcUrlToHttp(thumbMxcUrl) ?? '', + mxcUrlToHttp(mx, thumbMxcUrl, useAuthentication) ?? '', thumbInfo.mimetype, info.thumbnail_file ); - }, [mx, info]) + }, [mx, info, useAuthentication]) ); useEffect(() => { diff --git a/src/app/components/message/content/VideoContent.tsx b/src/app/components/message/content/VideoContent.tsx index b08512a4..e83e4595 100644 --- a/src/app/components/message/content/VideoContent.tsx +++ b/src/app/components/message/content/VideoContent.tsx @@ -25,6 +25,8 @@ import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { getFileSrcUrl } from './util'; import { bytesToSize } from '../../../../util/common'; import { millisecondsToMinutesAndSeconds } from '../../../utils/common'; +import { mxcUrlToHttp } from '../../../utils/matrix'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type RenderVideoProps = { title: string; @@ -61,6 +63,8 @@ export const VideoContent = as<'div', VideoContentProps>( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const blurHash = info.thumbnail_info?.[MATRIX_BLUR_HASH_PROPERTY_NAME]; const [load, setLoad] = useState(false); @@ -68,8 +72,8 @@ export const VideoContent = as<'div', VideoContentProps>( const [srcState, loadSrc] = useAsyncCallback( useCallback( - () => getFileSrcUrl(mx.mxcUrlToHttp(url) ?? '', mimeType, encInfo), - [mx, url, mimeType, encInfo] + () => getFileSrcUrl(mxcUrlToHttp(mx, url, useAuthentication) ?? '', mimeType, encInfo), + [mx, url, useAuthentication, mimeType, encInfo] ) ); diff --git a/src/app/components/room-card/RoomCard.tsx b/src/app/components/room-card/RoomCard.tsx index 2bb10e3c..1ca7813f 100644 --- a/src/app/components/room-card/RoomCard.tsx +++ b/src/app/components/room-card/RoomCard.tsx @@ -21,7 +21,7 @@ import classNames from 'classnames'; import FocusTrap from 'focus-trap-react'; import * as css from './style.css'; import { RoomAvatar } from '../room-avatar'; -import { getMxIdLocalPart } from '../../utils/matrix'; +import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { nameInitials } from '../../utils/common'; import { millify } from '../../plugins/millify'; import { useMatrixClient } from '../../hooks/useMatrixClient'; @@ -32,6 +32,7 @@ import { useJoinedRoomId } from '../../hooks/useJoinedRoomId'; import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; import { getRoomAvatarUrl, getStateEvent } from '../../utils/room'; import { useStateEventCallback } from '../../hooks/useStateEventCallback'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; type GridColumnCount = '1' | '2' | '3'; const getGridColumnCount = (gridWidth: number): GridColumnCount => { @@ -161,6 +162,8 @@ export const RoomCard = as<'div', RoomCardProps>( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const joinedRoomId = useJoinedRoomId(allRooms, roomIdOrAlias); const joinedRoom = mx.getRoom(joinedRoomId); const [topicEvent, setTopicEvent] = useState(() => @@ -171,8 +174,8 @@ export const RoomCard = as<'div', RoomCardProps>( const fallbackTopic = roomIdOrAlias; const avatar = joinedRoom - ? getRoomAvatarUrl(mx, joinedRoom, 96) - : avatarUrl && mx.mxcUrlToHttp(avatarUrl, 96, 96, 'crop'); + ? getRoomAvatarUrl(mx, joinedRoom, 96, useAuthentication) + : avatarUrl && mxcUrlToHttp(mx, avatarUrl, useAuthentication, 96, 96, 'crop'); const roomName = joinedRoom?.name || name || fallbackName; const roomTopic = diff --git a/src/app/components/room-intro/RoomIntro.tsx b/src/app/components/room-intro/RoomIntro.tsx index 0fed123d..28be5daf 100644 --- a/src/app/components/room-intro/RoomIntro.tsx +++ b/src/app/components/room-intro/RoomIntro.tsx @@ -6,7 +6,7 @@ import { openInviteUser } from '../../../client/action/navigation'; import { IRoomCreateContent, Membership, StateEvent } from '../../../types/matrix/room'; import { getMemberDisplayName, getStateEvent } from '../../utils/room'; import { useMatrixClient } from '../../hooks/useMatrixClient'; -import { getMxIdLocalPart } from '../../utils/matrix'; +import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { timeDayMonthYear, timeHourMinute } from '../../utils/time'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; @@ -14,6 +14,7 @@ import { RoomAvatar } from '../room-avatar'; import { nameInitials } from '../../utils/common'; import { useRoomAvatar, useRoomName, useRoomTopic } from '../../hooks/useRoomMeta'; import { mDirectAtom } from '../../state/mDirectList'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; export type RoomIntroProps = { room: Room; @@ -21,6 +22,8 @@ export type RoomIntroProps = { export const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const { navigateRoom } = useRoomNavigate(); const mDirects = useAtomValue(mDirectAtom); @@ -28,7 +31,7 @@ export const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => const avatarMxc = useRoomAvatar(room, mDirects.has(room.roomId)); const name = useRoomName(room); const topic = useRoomTopic(room); - const avatarHttpUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc) : undefined; + const avatarHttpUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication) : undefined; const createContent = createEvent?.getContent(); const ts = createEvent?.getTs(); diff --git a/src/app/components/url-preview/UrlPreviewCard.tsx b/src/app/components/url-preview/UrlPreviewCard.tsx index 07c25f8a..c33b9850 100644 --- a/src/app/components/url-preview/UrlPreviewCard.tsx +++ b/src/app/components/url-preview/UrlPreviewCard.tsx @@ -10,12 +10,16 @@ import { } from '../../hooks/useIntersectionObserver'; import * as css from './UrlPreviewCard.css'; import { tryDecodeURIComponent } from '../../utils/dom'; +import { mxcUrlToHttp } from '../../utils/matrix'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; const linkStyles = { color: color.Success.Main }; export const UrlPreviewCard = as<'div', { url: string; ts: number }>( ({ url, ts, ...props }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [previewStatus, loadPreview] = useAsyncCallback( useCallback(() => mx.getUrlPreview(url, ts), [url, ts, mx]) ); @@ -27,7 +31,7 @@ export const UrlPreviewCard = as<'div', { url: string; ts: number }>( if (previewStatus.status === AsyncStatus.Error) return null; const renderContent = (prev: IPreviewUrlResponse) => { - const imgUrl = mx.mxcUrlToHttp(prev['og:image'] || '', 256, 256, 'scale', false); + const imgUrl = mxcUrlToHttp(mx, prev['og:image'] || '', useAuthentication, 256, 256, 'scale', false); return ( <> diff --git a/src/app/features/lobby/LobbyHeader.tsx b/src/app/features/lobby/LobbyHeader.tsx index fa415bd2..ed5373b3 100644 --- a/src/app/features/lobby/LobbyHeader.tsx +++ b/src/app/features/lobby/LobbyHeader.tsx @@ -33,6 +33,8 @@ import { LeaveSpacePrompt } from '../../components/leave-space-prompt'; import { stopPropagation } from '../../utils/keyboard'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { BackRouteHandler } from '../../components/BackRouteHandler'; +import { mxcUrlToHttp } from '../../utils/matrix'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; type LobbyMenuProps = { roomId: string; @@ -122,6 +124,8 @@ type LobbyHeaderProps = { }; export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const space = useSpace(); const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); const [menuAnchor, setMenuAnchor] = useState(); @@ -129,7 +133,7 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { const name = useRoomName(space); const avatarMxc = useRoomAvatar(space); - const avatarUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined : undefined; + const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; const handleOpenMenu: MouseEventHandler = (evt) => { setMenuAnchor(evt.currentTarget.getBoundingClientRect()); diff --git a/src/app/features/lobby/LobbyHero.tsx b/src/app/features/lobby/LobbyHero.tsx index a2b31e8f..e652fd91 100644 --- a/src/app/features/lobby/LobbyHero.tsx +++ b/src/app/features/lobby/LobbyHero.tsx @@ -11,15 +11,19 @@ import { RoomTopicViewer } from '../../components/room-topic-viewer'; import * as css from './LobbyHero.css'; import { PageHero } from '../../components/page'; import { onEnterOrSpace, stopPropagation } from '../../utils/keyboard'; +import { mxcUrlToHttp } from '../../utils/matrix'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; export function LobbyHero() { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const space = useSpace(); const name = useRoomName(space); const topic = useRoomTopic(space); const avatarMxc = useRoomAvatar(space); - const avatarUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined : undefined; + const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; return ( ( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const { roomId, content } = item; const room = getRoom(roomId); const targetRef = useRef(null); @@ -364,7 +368,7 @@ export const RoomItemCard = as<'div', RoomItemCardProps>( name={localSummary.name} topic={localSummary.topic} avatarUrl={ - dm ? getDirectRoomAvatarUrl(mx, room, 96) : getRoomAvatarUrl(mx, room, 96) + dm ? getDirectRoomAvatarUrl(mx, room, 96, useAuthentication) : getRoomAvatarUrl(mx, room, 96, useAuthentication) } memberCount={localSummary.memberCount} suggested={content.suggested} @@ -418,8 +422,8 @@ export const RoomItemCard = as<'div', RoomItemCardProps>( topic={summaryState.data.topic} avatarUrl={ summaryState.data?.avatar_url - ? mx.mxcUrlToHttp(summaryState.data.avatar_url, 96, 96, 'crop') ?? - undefined + ? mxcUrlToHttp(mx, summaryState.data.avatar_url, useAuthentication, 96, 96, 'crop') ?? + undefined : undefined } memberCount={summaryState.data.num_joined_members} diff --git a/src/app/features/lobby/SpaceItem.tsx b/src/app/features/lobby/SpaceItem.tsx index 04f7e2cc..3e3c3214 100644 --- a/src/app/features/lobby/SpaceItem.tsx +++ b/src/app/features/lobby/SpaceItem.tsx @@ -35,6 +35,8 @@ import { ErrorCode } from '../../cs-errorcode'; import { useDraggableItem } from './DnD'; import { openCreateRoom, openSpaceAddExisting } from '../../../client/action/navigation'; import { stopPropagation } from '../../utils/keyboard'; +import { mxcUrlToHttp } from '../../utils/matrix'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; function SpaceProfileLoading() { return ( @@ -408,6 +410,8 @@ export const SpaceItemCard = as<'div', SpaceItemCardProps>( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const { roomId, content } = item; const space = getRoom(roomId); const targetRef = useRef(null); @@ -432,7 +436,7 @@ export const SpaceItemCard = as<'div', SpaceItemCardProps>( ( name={summaryState.data.name || summaryState.data.canonical_alias || roomId} avatarUrl={ summaryState.data?.avatar_url - ? mx.mxcUrlToHttp(summaryState.data.avatar_url, 96, 96, 'crop') ?? - undefined + ? mxcUrlToHttp(mx, summaryState.data.avatar_url, useAuthentication, 96, 96, 'crop') ?? + undefined : undefined } suggested={content.suggested} diff --git a/src/app/features/message-search/SearchResultGroup.tsx b/src/app/features/message-search/SearchResultGroup.tsx index 84ba3a76..a3a67eda 100644 --- a/src/app/features/message-search/SearchResultGroup.tsx +++ b/src/app/features/message-search/SearchResultGroup.tsx @@ -13,7 +13,7 @@ import { makeMentionCustomProps, renderMatrixMention, } from '../../plugins/react-custom-html-parser'; -import { getMxIdLocalPart } from '../../utils/matrix'; +import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { useMatrixEventRenderer } from '../../hooks/useMatrixEventRenderer'; import { GetContentCallback, MessageEvent, StateEvent } from '../../../types/matrix/room'; import { @@ -38,6 +38,7 @@ import { SequenceCard } from '../../components/sequence-card'; import { UserAvatar } from '../../components/user-avatar'; import { useMentionClickHandler } from '../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../hooks/useSpoilerClickHandler'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; type SearchResultGroupProps = { room: Room; @@ -56,6 +57,8 @@ export function SearchResultGroup({ onOpen, }: SearchResultGroupProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const highlightRegex = useMemo(() => makeHighlightRegex(highlights), [highlights]); const mentionClickHandler = useMentionClickHandler(room.roomId); @@ -75,10 +78,11 @@ export function SearchResultGroup({ getReactCustomHtmlParser(mx, room.roomId, { linkifyOpts, highlightRegex, + useAuthentication, handleSpoilerClick: spoilerClickHandler, handleMentionClick: mentionClickHandler, }), - [mx, room, linkifyOpts, highlightRegex, mentionClickHandler, spoilerClickHandler] + [mx, room, linkifyOpts, highlightRegex, mentionClickHandler, spoilerClickHandler, useAuthentication] ); const renderMatrixEvent = useMatrixEventRenderer<[IEventWithRoomId, string, GetContentCallback]>( @@ -161,7 +165,7 @@ export function SearchResultGroup({ ( @@ -209,7 +213,7 @@ export function SearchResultGroup({ userId={event.sender} src={ senderAvatarMxc - ? mx.mxcUrlToHttp(senderAvatarMxc, 48, 48, 'crop') ?? undefined + ? mxcUrlToHttp(mx, senderAvatarMxc, useAuthentication, 48, 48, 'crop') ?? undefined : undefined } alt={displayName} diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index aa7b468e..c525ab2a 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -38,6 +38,7 @@ import { stopPropagation } from '../../utils/keyboard'; import { getMatrixToRoom } from '../../plugins/matrix-to'; import { getCanonicalAliasOrRoomId, isRoomAlias } from '../../utils/matrix'; import { getViaServers } from '../../plugins/via-servers'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; type RoomNavItemMenuProps = { room: Room; @@ -175,6 +176,8 @@ export function RoomNavItem({ linkPath, }: RoomNavItemProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [hover, setHover] = useState(false); const { hoverProps } = useHover({ onHoverChange: setHover }); const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setHover }); @@ -217,7 +220,7 @@ export function RoomNavItem({ ( diff --git a/src/app/features/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx index 15d07412..1b538ffc 100644 --- a/src/app/features/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -55,6 +55,7 @@ import { ScrollTopContainer } from '../../components/scroll-top-container'; import { UserAvatar } from '../../components/user-avatar'; import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; import { stopPropagation } from '../../utils/keyboard'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; export const MembershipFilters = { filterJoined: (m: RoomMember) => m.membership === Membership.Join, @@ -171,6 +172,8 @@ type MembersDrawerProps = { }; export function MembersDrawer({ room, members }: MembersDrawerProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const scrollRef = useRef(null); const searchInputRef = useRef(null); const scrollTopAnchorRef = useRef(null); @@ -426,9 +429,8 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) { }} after={} > - {`${result.items.length || 'No'} ${ - result.items.length === 1 ? 'Result' : 'Results' - }`} + {`${result.items.length || 'No'} ${result.items.length === 1 ? 'Result' : 'Results' + }`} ) } @@ -483,14 +485,16 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) { const member = tagOrMember; const name = getName(member); - const avatarUrl = member.getAvatarUrl( - mx.baseUrl, + const avatarMxcUrl = member.getMxcAvatarUrl(); + const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp( + avatarMxcUrl, 100, 100, 'crop', undefined, - false - ); + false, + useAuthentication + ) : undefined; return ( ( ({ editor, fileDropContainerRef, roomId, room }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline'); const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const commands = useCommands(mx, room); @@ -366,7 +369,7 @@ export const RoomInput = forwardRef( }; const handleStickerSelect = async (mxc: string, shortcode: string, label: string) => { - const stickerUrl = mx.mxcUrlToHttp(mxc); + const stickerUrl = mxcUrlToHttp(mx, mxc, useAuthentication); if (!stickerUrl) return; const info = await getImageInfo( diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index d86ea4d9..c47cb35b 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -122,6 +122,7 @@ import { roomToUnreadAtom } from '../../state/room/roomToUnread'; import { useMentionClickHandler } from '../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../hooks/useSpoilerClickHandler'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -310,9 +311,9 @@ const useTimelinePagination = ( range: offsetRange > 0 ? { - start: currentTimeline.range.start + offsetRange, - end: currentTimeline.range.end + offsetRange, - } + start: currentTimeline.range.start + offsetRange, + end: currentTimeline.range.end + offsetRange, + } : { ...currentTimeline.range }, })); }; @@ -331,7 +332,7 @@ const useTimelinePagination = ( if ( !paginationToken && getTimelinesEventsCount(lTimelines) !== - getTimelinesEventsCount(getLinkedTimelines(timelineToPaginate)) + getTimelinesEventsCount(getLinkedTimelines(timelineToPaginate)) ) { recalibratePagination(lTimelines, timelinesEventsCount, backwards); return; @@ -437,6 +438,8 @@ const getRoomUnreadInfo = (room: Room, scrollTo = false) => { export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimelineProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const encryptedRoom = mx.isRoomEncrypted(room.roomId); const [messageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing'); @@ -490,10 +493,10 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const [focusItem, setFocusItem] = useState< | { - index: number; - scrollTo: boolean; - highlight: boolean; - } + index: number; + scrollTo: boolean; + highlight: boolean; + } | undefined >(); const alive = useAlive(); @@ -511,10 +514,11 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli () => getReactCustomHtmlParser(mx, room.roomId, { linkifyOpts, + useAuthentication, handleSpoilerClick: spoilerClickHandler, handleMentionClick: mentionClickHandler, }), - [mx, room, linkifyOpts, spoilerClickHandler, mentionClickHandler] + [mx, room, linkifyOpts, spoilerClickHandler, mentionClickHandler, useAuthentication] ); const parseMemberEvent = useMemberEventParser(); @@ -1466,14 +1470,14 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const eventJSX = reactionOrEditEvent(mEvent) ? null : renderMatrixEvent( - mEvent.getType(), - typeof mEvent.getStateKey() === 'string', - mEventId, - mEvent, - item, - timelineSet, - collapsed - ); + mEvent.getType(), + typeof mEvent.getStateKey() === 'string', + mEventId, + mEvent, + item, + timelineSet, + collapsed + ); prevEvent = mEvent; isPrevRendered = !!eventJSX; @@ -1555,9 +1559,8 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli {!canPaginateBack && rangeAtStart && getItems().length > 0 && (
    diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index 0b8ef74e..eaa90970 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -36,7 +36,7 @@ import { useSetSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { useSpaceOptionally } from '../../hooks/useSpace'; import { getHomeSearchPath, getSpaceSearchPath, withSearchParam } from '../../pages/pathUtils'; -import { getCanonicalAliasOrRoomId, isRoomAlias } from '../../utils/matrix'; +import { getCanonicalAliasOrRoomId, isRoomAlias, mxcUrlToHttp } from '../../utils/matrix'; import { _SearchPathSearchParams } from '../../pages/paths'; import * as css from './RoomViewHeader.css'; import { useRoomUnread } from '../../state/hooks/unread'; @@ -53,6 +53,7 @@ import { stopPropagation } from '../../utils/keyboard'; import { getMatrixToRoom } from '../../plugins/matrix-to'; import { getViaServers } from '../../plugins/via-servers'; import { BackRouteHandler } from '../../components/BackRouteHandler'; +import { useSpecVersions } from '../../hooks/useSpecVersions'; type RoomMenuProps = { room: Room; @@ -174,6 +175,8 @@ const RoomMenu = forwardRef(({ room, requestClose export function RoomViewHeader() { const navigate = useNavigate(); const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const screenSize = useScreenSizeContext(); const room = useRoom(); const space = useSpaceOptionally(); @@ -185,7 +188,7 @@ export function RoomViewHeader() { const avatarMxc = useRoomAvatar(room, mDirects.has(room.roomId)); const name = useRoomName(room); const topic = useRoomTopic(room); - const avatarUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined : undefined; + const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); diff --git a/src/app/features/room/message/Message.tsx b/src/app/features/room/message/Message.tsx index d8b2b3e5..94a5825c 100644 --- a/src/app/features/room/message/Message.tsx +++ b/src/app/features/room/message/Message.tsx @@ -51,7 +51,7 @@ import { getMemberAvatarMxc, getMemberDisplayName, } from '../../../utils/room'; -import { getCanonicalAliasOrRoomId, getMxIdLocalPart, isRoomAlias } from '../../../utils/matrix'; +import { getCanonicalAliasOrRoomId, getMxIdLocalPart, isRoomAlias, mxcUrlToHttp } from '../../../utils/matrix'; import { MessageLayout, MessageSpacing } from '../../../state/settings'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useRecentEmoji } from '../../../hooks/useRecentEmoji'; @@ -67,6 +67,7 @@ import { copyToClipboard } from '../../../utils/dom'; import { stopPropagation } from '../../../utils/keyboard'; import { getMatrixToRoomEvent } from '../../../plugins/matrix-to'; import { getViaServers } from '../../../plugins/via-servers'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; export type ReactionHandler = (keyOrMxc: string, shortcode: string) => void; @@ -234,9 +235,9 @@ export const MessageSourceCodeItem = as< const getContent = (evt: MatrixEvent) => evt.isEncrypted() ? { - [`<== DECRYPTED_EVENT ==>`]: evt.getEffectiveEvent(), - [`<== ORIGINAL_EVENT ==>`]: evt.event, - } + [`<== DECRYPTED_EVENT ==>`]: evt.getEffectiveEvent(), + [`<== ORIGINAL_EVENT ==>`]: evt.event, + } : evt.event; const getText = (): string => { @@ -650,6 +651,8 @@ export const Message = as<'div', MessageProps>( ref ) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const senderId = mEvent.getSender() ?? ''; const [hover, setHover] = useState(false); const { hoverProps } = useHover({ onHoverChange: setHover }); @@ -709,7 +712,7 @@ export const Message = as<'div', MessageProps>( userId={senderId} src={ senderAvatarMxc - ? mx.mxcUrlToHttp(senderAvatarMxc, 48, 48, 'crop') ?? undefined + ? mxcUrlToHttp(mx, senderAvatarMxc, useAuthentication, 48, 48, 'crop') ?? undefined : undefined } alt={senderDisplayName} @@ -950,26 +953,26 @@ export const Message = as<'div', MessageProps>( {((!mEvent.isRedacted() && canDelete) || mEvent.getSender() !== mx.getUserId()) && ( - <> - - - {!mEvent.isRedacted() && canDelete && ( - - )} - {mEvent.getSender() !== mx.getUserId() && ( - - )} - - - )} + <> + + + {!mEvent.isRedacted() && canDelete && ( + + )} + {mEvent.getSender() !== mx.getUserId() && ( + + )} + + + )}
    } @@ -1093,26 +1096,26 @@ export const Event = as<'div', EventProps>( {((!mEvent.isRedacted() && canDelete && !stateEvent) || (mEvent.getSender() !== mx.getUserId() && !stateEvent)) && ( - <> - - - {!mEvent.isRedacted() && canDelete && ( - - )} - {mEvent.getSender() !== mx.getUserId() && ( - - )} - - - )} + <> + + + {!mEvent.isRedacted() && canDelete && ( + + )} + {mEvent.getSender() !== mx.getUserId() && ( + + )} + + + )} } diff --git a/src/app/features/room/message/Reactions.tsx b/src/app/features/room/message/Reactions.tsx index a6d7f553..258ab629 100644 --- a/src/app/features/room/message/Reactions.tsx +++ b/src/app/features/room/message/Reactions.tsx @@ -22,6 +22,7 @@ import { useRelations } from '../../../hooks/useRelations'; import * as css from './styles.css'; import { ReactionViewer } from '../reaction-viewer'; import { stopPropagation } from '../../../utils/keyboard'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; export type ReactionsProps = { room: Room; @@ -33,6 +34,8 @@ export type ReactionsProps = { export const Reactions = as<'div', ReactionsProps>( ({ className, room, relations, mEventId, canSendReaction, onReactionToggle, ...props }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [viewer, setViewer] = useState(false); const myUserId = mx.getUserId(); const reactions = useRelations( @@ -86,6 +89,7 @@ export const Reactions = as<'div', ReactionsProps>( onClick={canSendReaction ? () => onReactionToggle(mEventId, key) : undefined} onContextMenu={handleViewReaction} aria-disabled={!canSendReaction} + useAuthentication={useAuthentication} /> )} diff --git a/src/app/features/room/reaction-viewer/ReactionViewer.tsx b/src/app/features/room/reaction-viewer/ReactionViewer.tsx index 1c1b79a7..9e166a9e 100644 --- a/src/app/features/room/reaction-viewer/ReactionViewer.tsx +++ b/src/app/features/room/reaction-viewer/ReactionViewer.tsx @@ -25,6 +25,7 @@ import { useRelations } from '../../../hooks/useRelations'; import { Reaction } from '../../../components/message'; import { getHexcodeForEmoji, getShortcodeFor } from '../../../plugins/emoji'; import { UserAvatar } from '../../../components/user-avatar'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; export type ReactionViewerProps = { room: Room; @@ -35,6 +36,8 @@ export type ReactionViewerProps = { export const ReactionViewer = as<'div', ReactionViewerProps>( ({ className, room, initialKey, relations, requestClose, ...props }, ref) => { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const reactions = useRelations( relations, useCallback((rel) => [...(rel.getSortedAnnotationsByKey() ?? [])], []) @@ -81,6 +84,7 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( count={evts.size} aria-selected={key === selectedKey} onClick={() => setSelectedKey(key)} + useAuthentication={useAuthentication} /> ); })} @@ -107,14 +111,16 @@ export const ReactionViewer = as<'div', ReactionViewerProps>( const member = room.getMember(senderId); const name = (member ? getName(member) : getMxIdLocalPart(senderId)) ?? senderId; - const avatarUrl = member?.getAvatarUrl( - mx.baseUrl, + const avatarMxcUrl = member?.getMxcAvatarUrl(); + const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp( + avatarMxcUrl, 100, 100, 'crop', undefined, - false - ); + false, + useAuthentication + ) : undefined; return ( (); const unreadCacheRef = useRef>(new Map()); const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const [showNotifications] = useSetting(settingsAtom, 'showNotifications'); const [notificationSound] = useSetting(settingsAtom, 'isNotificationSounds'); @@ -216,7 +219,7 @@ function MessageNotifications() { notify({ roomName: room.name ?? 'Unknown', roomAvatar: avatarMxc - ? mx.mxcUrlToHttp(avatarMxc, 96, 96, 'crop') ?? undefined + ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined : undefined, username: getMemberDisplayName(room, sender) ?? getMxIdLocalPart(sender) ?? sender, roomId: room.roomId, diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx index 18993081..12ca65bb 100644 --- a/src/app/pages/client/inbox/Invites.tsx +++ b/src/app/pages/client/inbox/Invites.tsx @@ -42,6 +42,7 @@ import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { useRoomTopic } from '../../../hooks/useRoomMeta'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; const COMPACT_CARD_WIDTH = 548; @@ -54,6 +55,8 @@ type InviteCardProps = { }; function InviteCard({ room, userId, direct, compact, onNavigate }: InviteCardProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const roomName = room.name || room.getCanonicalAlias() || room.roomId; const member = room.getMember(userId); const memberEvent = member?.events.member; @@ -110,7 +113,7 @@ function InviteCard({ room, userId, direct, compact, onNavigate }: InviteCardPro ( diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index aa878216..95f9b9ff 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -28,7 +28,7 @@ import { HTMLReactParserOptions } from 'html-react-parser'; import { Opts as LinkifyOpts } from 'linkifyjs'; import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import { getMxIdLocalPart } from '../../../utils/matrix'; +import { getMxIdLocalPart, mxcUrlToHttp } from '../../../utils/matrix'; import { InboxNotificationsPathSearchParams } from '../../paths'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { SequenceCard } from '../../../components/sequence-card'; @@ -81,6 +81,7 @@ import { useMentionClickHandler } from '../../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../../hooks/useSpoilerClickHandler'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type RoomNotificationsGroup = { roomId: string; @@ -191,6 +192,8 @@ function RoomNotificationsGroupComp({ onOpen, }: RoomNotificationsGroupProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const unread = useRoomUnread(room.roomId, roomToUnreadAtom); const mentionClickHandler = useMentionClickHandler(room.roomId); const spoilerClickHandler = useSpoilerClickHandler(); @@ -208,10 +211,11 @@ function RoomNotificationsGroupComp({ () => getReactCustomHtmlParser(mx, room.roomId, { linkifyOpts, + useAuthentication, handleSpoilerClick: spoilerClickHandler, handleMentionClick: mentionClickHandler, }), - [mx, room, linkifyOpts, mentionClickHandler, spoilerClickHandler] + [mx, room, linkifyOpts, mentionClickHandler, spoilerClickHandler, useAuthentication] ); const renderMatrixEvent = useMatrixEventRenderer<[IRoomEvent, string, GetContentCallback]>( @@ -369,7 +373,7 @@ function RoomNotificationsGroupComp({ ( @@ -424,7 +428,7 @@ function RoomNotificationsGroupComp({ userId={event.sender} src={ senderAvatarMxc - ? mx.mxcUrlToHttp(senderAvatarMxc, 48, 48, 'crop') ?? undefined + ? mxcUrlToHttp(mx, senderAvatarMxc, useAuthentication, 48, 48, 'crop') ?? undefined : undefined } alt={displayName} diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index f14976fb..d63bb24d 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -86,6 +86,8 @@ import { openInviteUser, openSpaceSettings } from '../../../../client/action/nav import { stopPropagation } from '../../../utils/keyboard'; import { getMatrixToRoom } from '../../../plugins/matrix-to'; import { getViaServers } from '../../../plugins/via-servers'; +import { getRoomAvatarUrl } from '../../../utils/room'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type SpaceMenuProps = { room: Room; @@ -225,18 +227,18 @@ const useDraggableItem = ( return !target ? undefined : draggable({ - element: target, - dragHandle, - getInitialData: () => ({ item }), - onDragStart: () => { - setDragging(true); - onDragging?.(item); - }, - onDrop: () => { - setDragging(false); - onDragging?.(undefined); - }, - }); + element: target, + dragHandle, + getInitialData: () => ({ item }), + onDragStart: () => { + setDragging(true); + onDragging?.(item); + }, + onDrop: () => { + setDragging(false); + onDragging?.(undefined); + }, + }); }, [targetRef, dragHandleRef, item, onDragging]); return dragging; @@ -379,15 +381,17 @@ function SpaceTab({ onUnpin, }: SpaceTabProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const targetRef = useRef(null); const spaceDraggable: SidebarDraggable = useMemo( () => folder ? { - folder, - spaceId: space.roomId, - } + folder, + spaceId: space.roomId, + } : space.roomId, [folder, space] ); @@ -431,7 +435,7 @@ function SpaceTab({ > ( {nameInitials(space.name, 2)} @@ -524,6 +528,8 @@ function ClosedSpaceFolder({ disabled, }: ClosedSpaceFolderProps) { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const handlerRef = useRef(null); const spaceDraggable: FolderDraggable = useMemo(() => ({ folder }), [folder]); @@ -556,7 +562,7 @@ function ClosedSpaceFolder({ ( diff --git a/src/app/pages/client/sidebar/UserTab.tsx b/src/app/pages/client/sidebar/UserTab.tsx index 89c035bb..09b3f251 100644 --- a/src/app/pages/client/sidebar/UserTab.tsx +++ b/src/app/pages/client/sidebar/UserTab.tsx @@ -5,8 +5,9 @@ import { SidebarItem, SidebarItemTooltip, SidebarAvatar } from '../../../compone import { openSettings } from '../../../../client/action/navigation'; import { UserAvatar } from '../../../components/user-avatar'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import { getMxIdLocalPart } from '../../../utils/matrix'; +import { getMxIdLocalPart, mxcUrlToHttp } from '../../../utils/matrix'; import { nameInitials } from '../../../utils/common'; +import { useSpecVersions } from '../../../hooks/useSpecVersions'; type UserProfile = { avatar_url?: string; @@ -14,12 +15,14 @@ type UserProfile = { }; export function UserTab() { const mx = useMatrixClient(); + const { versions } = useSpecVersions(); + const useAuthentication = versions.includes('v1.11'); const userId = mx.getUserId()!; const [profile, setProfile] = useState({}); const displayName = profile.displayname ?? getMxIdLocalPart(userId) ?? userId; const avatarUrl = profile.avatar_url - ? mx.mxcUrlToHttp(profile.avatar_url, 96, 96, 'crop') ?? undefined + ? mxcUrlToHttp(mx, profile.avatar_url, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; useEffect(() => { diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index 95e2f334..ab333704 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -14,7 +14,7 @@ import { IntermediateRepresentation, Opts as LinkifyOpts, OptFn } from 'linkifyj import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; -import { getMxIdLocalPart, getCanonicalAliasRoomId, isRoomAlias } from '../utils/matrix'; +import { getMxIdLocalPart, getCanonicalAliasRoomId, isRoomAlias, mxcUrlToHttp } from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; @@ -72,9 +72,8 @@ export const renderMatrixMention = ( className={css.Mention({ highlight: mx.getUserId() === userId })} data-mention-id={userId} > - {`@${ - (currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) - }`} + {`@${(currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) + }`} ); } @@ -192,6 +191,7 @@ export const getReactCustomHtmlParser = ( highlightRegex?: RegExp; handleSpoilerClick?: ReactEventHandler; handleMentionClick?: ReactEventHandler; + useAuthentication?: boolean; } ): HTMLReactParserOptions => { const opts: HTMLReactParserOptions = { @@ -354,7 +354,7 @@ export const getReactCustomHtmlParser = ( } if (name === 'img') { - const htmlSrc = mx.mxcUrlToHttp(props.src); + const htmlSrc = mxcUrlToHttp(mx, props.src, params.useAuthentication); if (htmlSrc && props.src.startsWith('mxc://') === false) { return ( diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 8613f36a..65a1080b 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -253,3 +253,23 @@ export const removeRoomIdFromMDirect = async (mx: MatrixClient, roomId: string): await mx.setAccountData(AccountDataEvent.Direct, userIdToRoomIds); }; + +export const mxcUrlToHttp = ( + mx: MatrixClient, + mxcUrl: string, + useAuthentication?: boolean, + width?: number, + height?: number, + resizeMethod?: string, + allowDirectLinks?: boolean, + allowRedirects?: boolean +): string | null => + mx.mxcUrlToHttp( + mxcUrl, + width, + height, + resizeMethod, + allowDirectLinks, + allowRedirects, + useAuthentication + ); diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index 8cf33a8f..5f4615a6 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -273,16 +273,26 @@ export const joinRuleToIconSrc = ( export const getRoomAvatarUrl = ( mx: MatrixClient, room: Room, - size: 32 | 96 = 32 -): string | undefined => room.getAvatarUrl(mx.baseUrl, size, size, 'crop') ?? undefined; + size: 32 | 96 = 32, + useAuthentication = false +): string | undefined => { + const mxcUrl = room.getMxcAvatarUrl(); + return mxcUrl + ? mx.mxcUrlToHttp(mxcUrl, size, size, 'crop', undefined, false, useAuthentication) ?? undefined + : undefined; +}; export const getDirectRoomAvatarUrl = ( mx: MatrixClient, room: Room, - size: 32 | 96 = 32 -): string | undefined => - room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, size, size, 'crop', undefined, false) ?? - undefined; + size: 32 | 96 = 32, + useAuthentication = false +): string | undefined => { + const mxcUrl = room.getAvatarFallbackMember()?.getMxcAvatarUrl(); + return mxcUrl + ? mx.mxcUrlToHttp(mxcUrl, size, size, 'crop', undefined, false, useAuthentication) ?? undefined + : undefined; +}; export const trimReplyFromBody = (body: string): string => { const match = body.match(/^> <.+?> .+\n(>.*\n)*?\n/m); diff --git a/src/client/initMatrix.ts b/src/client/initMatrix.ts index 5a156ad8..52e8317e 100644 --- a/src/client/initMatrix.ts +++ b/src/client/initMatrix.ts @@ -23,7 +23,6 @@ export const initClient = async (session: Session): Promise => { localStorage: global.localStorage, dbName: 'web-sync-store', }); - await indexedDBStore.startup(); const mx = createClient({ baseUrl: session.baseUrl, @@ -38,6 +37,7 @@ export const initClient = async (session: Session): Promise => { }); await mx.initCrypto(); + await indexedDBStore.startup(); mx.setGlobalErrorOnUnknownDevices(false); mx.setMaxListeners(50); diff --git a/src/index.tsx b/src/index.tsx index a289ed1c..58ecc42a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -12,6 +12,7 @@ import './index.scss'; import settings from './client/state/settings'; +import { trimTrailingSlash } from './app/utils/common'; import App from './app/pages/App'; // import i18n (needs to be bundled ;)) @@ -20,6 +21,23 @@ import './app/i18n'; document.body.classList.add(configClass, varsClass); settings.applyTheme(); +// Register Service Worker +if ('serviceWorker' in navigator) { + navigator.serviceWorker.register( + import.meta.env.MODE === 'production' ? `${trimTrailingSlash(import.meta.env.BASE_URL)}/sw.js` : '/dev-sw.js?dev-sw' + ) + navigator.serviceWorker.addEventListener('message', (event) => { + if (event.data?.type === 'token' && event.data?.responseKey) { + // Get the token for SW. + const token = localStorage.getItem('cinny_access_token'); + event.source!.postMessage({ + responseKey: event.data.responseKey, + token, + }) + } + }) +} + const mountApp = () => { const rootContainer = document.getElementById('root'); diff --git a/src/sw.ts b/src/sw.ts new file mode 100644 index 00000000..11953917 --- /dev/null +++ b/src/sw.ts @@ -0,0 +1,43 @@ +async function askForAccessToken(client: Client): Promise { + return new Promise((resolve) => { + const responseKey = Math.random().toString(36); + const listener = (event: ExtendableMessageEvent) => { + if (event.data.responseKey !== responseKey) return; + resolve(event.data.token); + self.removeEventListener('message', listener); + }; + self.addEventListener('message', listener); + client.postMessage({ responseKey, type: 'token' }); + }); +} + +function fetchConfig(token?: string): RequestInit | undefined { + if (!token) return undefined; + + return { + headers: { + Authorization: `Bearer ${token}`, + }, + }; +} + +self.addEventListener('fetch', (event: FetchEvent) => { + const { url, method } = event.request; + if (method !== 'GET') return; + if ( + !url.includes('/_matrix/client/v1/media/download') && + !url.includes('/_matrix/client/v1/media/thumbnail') + ) { + return; + } + event.respondWith( + (async (): Promise => { + const client = await clients.get(event.clientId); + let token: string | undefined; + if (client) token = await askForAccessToken(client); + + // eslint-disable-next-line consistent-return + return fetch(url, fetchConfig(token)); + })() + ); +}); diff --git a/tsconfig.json b/tsconfig.json index 60ff1853..7608e557 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,8 @@ "moduleResolution": "Node", "resolveJsonModule": true, "outDir": "dist", - "skipLibCheck": true + "skipLibCheck": true, + "lib": ["ES2016", "DOM"] }, "exclude": ["node_modules", "dist"], "include": ["src"] diff --git a/vite.config.js b/vite.config.js index 7b5ec250..e629c751 100644 --- a/vite.config.js +++ b/vite.config.js @@ -6,6 +6,7 @@ import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import inject from '@rollup/plugin-inject'; import topLevelAwait from 'vite-plugin-top-level-await'; +import { VitePWA } from 'vite-plugin-pwa'; import buildConfig from './build.config'; const copyFiles = { @@ -50,11 +51,11 @@ export default defineConfig({ port: 8080, host: true, proxy: { - "^\\/.*?\\/olm\\.wasm$": { + '^\\/.*?\\/olm\\.wasm$': { target: 'http://localhost:8080', - rewrite: () => '/olm.wasm' - } - } + rewrite: () => '/olm.wasm', + }, + }, }, plugins: [ topLevelAwait({ @@ -67,6 +68,16 @@ export default defineConfig({ vanillaExtractPlugin(), wasm(), react(), + VitePWA({ + srcDir: 'src', + filename: 'sw.ts', + strategies: 'injectManifest', + injectRegister: false, + manifest: false, + injectManifest: { + injectionPoint: undefined, + }, + }), ], optimizeDeps: { esbuildOptions: { From 09444f9e08bd4ab3452480f1016721cf81b4807d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:51:43 +1000 Subject: [PATCH 628/824] fix sso login without identity providers (#1934) --- src/app/hooks/useParsedLoginFlows.ts | 16 ++-- src/app/pages/auth/SSOLogin.tsx | 110 +++++++++++++---------- src/app/pages/auth/login/Login.tsx | 4 +- src/app/pages/auth/register/Register.tsx | 5 +- 4 files changed, 72 insertions(+), 63 deletions(-) diff --git a/src/app/hooks/useParsedLoginFlows.ts b/src/app/hooks/useParsedLoginFlows.ts index 14ecfb9d..088a514e 100644 --- a/src/app/hooks/useParsedLoginFlows.ts +++ b/src/app/hooks/useParsedLoginFlows.ts @@ -1,16 +1,10 @@ import { useMemo } from 'react'; import { ILoginFlow, IPasswordFlow, ISSOFlow, LoginFlow } from 'matrix-js-sdk/lib/@types/auth'; -import { WithRequiredProp } from '../../types/utils'; -export type Required_SSOFlow = WithRequiredProp; -export const getSSOFlow = (loginFlows: LoginFlow[]): Required_SSOFlow | undefined => - loginFlows.find( - (flow) => - (flow.type === 'm.login.sso' || flow.type === 'm.login.cas') && - 'identity_providers' in flow && - Array.isArray(flow.identity_providers) && - flow.identity_providers.length > 0 - ) as Required_SSOFlow | undefined; +export const getSSOFlow = (loginFlows: LoginFlow[]): ISSOFlow | undefined => + loginFlows.find((flow) => flow.type === 'm.login.sso' || flow.type === 'm.login.cas') as + | ISSOFlow + | undefined; export const getPasswordFlow = (loginFlows: LoginFlow[]): IPasswordFlow | undefined => loginFlows.find((flow) => flow.type === 'm.login.password') as IPasswordFlow; @@ -22,7 +16,7 @@ export const getTokenFlow = (loginFlows: LoginFlow[]): LoginFlow | undefined => export type ParsedLoginFlows = { password?: LoginFlow; token?: LoginFlow; - sso?: Required_SSOFlow; + sso?: ISSOFlow; }; export const useParsedLoginFlows = (loginFlows: LoginFlow[]) => { const parsedFlow: ParsedLoginFlows = useMemo( diff --git a/src/app/pages/auth/SSOLogin.tsx b/src/app/pages/auth/SSOLogin.tsx index 0d3d917f..d0cdaeb6 100644 --- a/src/app/pages/auth/SSOLogin.tsx +++ b/src/app/pages/auth/SSOLogin.tsx @@ -4,69 +4,89 @@ import React, { useMemo } from 'react'; import { useAutoDiscoveryInfo } from '../../hooks/useAutoDiscoveryInfo'; type SSOLoginProps = { - providers: IIdentityProvider[]; - asIcons?: boolean; + providers?: IIdentityProvider[]; redirectUrl: string; + saveScreenSpace?: boolean; }; -export function SSOLogin({ providers, redirectUrl, asIcons }: SSOLoginProps) { +export function SSOLogin({ providers, redirectUrl, saveScreenSpace }: SSOLoginProps) { const discovery = useAutoDiscoveryInfo(); const baseUrl = discovery['m.homeserver'].base_url; const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); - const getSSOIdUrl = (ssoId: string): string => mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId); + const getSSOIdUrl = (ssoId?: string): string => mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId); - const anyAsBtn = providers.find( - (provider) => !provider.icon || !mx.mxcUrlToHttp(provider.icon, 96, 96, 'crop', false) - ); + const withoutIcon = providers + ? providers.find( + (provider) => !provider.icon || !mx.mxcUrlToHttp(provider.icon, 96, 96, 'crop', false) + ) + : true; + + const renderAsIcons = withoutIcon ? false : saveScreenSpace && providers && providers.length > 2; return ( - {providers.map((provider) => { - const { id, name, icon } = provider; - const iconUrl = icon && mx.mxcUrlToHttp(icon, 96, 96, 'crop', false); + {providers ? ( + providers.map((provider) => { + const { id, name, icon } = provider; + const iconUrl = icon && mx.mxcUrlToHttp(icon, 96, 96, 'crop', false); - const buttonTitle = `Continue with ${name}`; + const buttonTitle = `Continue with ${name}`; + + if (renderAsIcons) { + return ( + + + + ); + } - if (!anyAsBtn && iconUrl && asIcons) { return ( - + + + ) + } > - - + + {buttonTitle} + + ); - } - - return ( - - ); - })} + }) + ) : ( + + )} ); } diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx index e1689d1e..6b9f1223 100644 --- a/src/app/pages/auth/login/Login.tsx +++ b/src/app/pages/auth/login/Login.tsx @@ -76,9 +76,7 @@ export function Login() { 2 - } + saveScreenSpace={parsedFlows.password !== undefined} /> diff --git a/src/app/pages/auth/register/Register.tsx b/src/app/pages/auth/register/Register.tsx index c859d0e5..d2986d70 100644 --- a/src/app/pages/auth/register/Register.tsx +++ b/src/app/pages/auth/register/Register.tsx @@ -83,10 +83,7 @@ export function Register() { 2 - } + saveScreenSpace={registerFlows.status === RegisterFlowStatus.FlowRequired} /> From 388f606ad2a1c52a51bcfa422341f83149138035 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:53:17 +1000 Subject: [PATCH 629/824] fix escape to mark as read (#1935) --- src/app/features/room/Room.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/features/room/Room.tsx b/src/app/features/room/Room.tsx index a4ec7165..ee3e7027 100644 --- a/src/app/features/room/Room.tsx +++ b/src/app/features/room/Room.tsx @@ -13,7 +13,6 @@ import { useKeyDown } from '../../hooks/useKeyDown'; import { markAsRead } from '../../../client/action/notifications'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRoomMembers } from '../../hooks/useRoomMembers'; -import { editableActiveElement } from '../../utils/dom'; export function Room() { const { eventId } = useParams(); @@ -29,7 +28,7 @@ export function Room() { window, useCallback( (evt) => { - if (isKeyHotkey('escape', evt) && !editableActiveElement()) { + if (isKeyHotkey('escape', evt)) { markAsRead(mx, room.roomId); } }, From 4dfce32730137c319c646d24293216a31d39da43 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:53:59 +1000 Subject: [PATCH 630/824] fix mention url is encoded wrong (#1936) --- src/app/components/editor/output.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 864aee3d..d6136d99 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -62,7 +62,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { } const matrixTo = `https://matrix.to/#/${fragment}`; - return `${sanitizeText(node.name)}`; + return `${sanitizeText(node.name)}`; } case BlockType.Emoticon: return node.key.startsWith('mxc://') @@ -71,7 +71,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { )}" title="${sanitizeText(node.shortcode)}" height="32" />` : sanitizeText(node.key); case BlockType.Link: - return `${node.children}`; + return `${node.children}`; case BlockType.Command: return `/${sanitizeText(node.command)}`; default: From 96df1401535ccea14eae18937ac4a1cf0503e46e Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 9 Sep 2024 18:45:20 +1000 Subject: [PATCH 631/824] Improve-auth-media (#1933) * fix set power level broken after sdk update * add media authentication hook * fix service worker types * fix service worker not working in dev mode * fix env mode check when registering sw --- package-lock.json | 11 +---------- package.json | 1 - src/app/components/editor/Elements.tsx | 5 ++--- .../editor/autocomplete/EmoticonAutocomplete.tsx | 5 ++--- .../autocomplete/UserMentionAutocomplete.tsx | 9 +++++---- src/app/components/emoji-board/EmojiBoard.tsx | 5 ++--- src/app/components/event-readers/EventReaders.tsx | 5 ++--- .../components/message/content/AudioContent.tsx | 5 ++--- .../components/message/content/FileContent.tsx | 11 ++++------- .../components/message/content/ImageContent.tsx | 5 ++--- .../message/content/ThumbnailContent.tsx | 5 ++--- .../components/message/content/VideoContent.tsx | 5 ++--- src/app/components/room-card/RoomCard.tsx | 5 ++--- src/app/components/room-intro/RoomIntro.tsx | 5 ++--- src/app/components/url-preview/UrlPreviewCard.tsx | 5 ++--- src/app/features/lobby/LobbyHeader.tsx | 5 ++--- src/app/features/lobby/LobbyHero.tsx | 5 ++--- src/app/features/lobby/RoomItem.tsx | 5 ++--- src/app/features/lobby/SpaceItem.tsx | 5 ++--- .../features/message-search/SearchResultGroup.tsx | 5 ++--- src/app/features/room-nav/RoomNavItem.tsx | 5 ++--- src/app/features/room/MembersDrawer.tsx | 5 ++--- src/app/features/room/RoomInput.tsx | 5 ++--- src/app/features/room/RoomTimeline.tsx | 5 ++--- src/app/features/room/RoomViewHeader.tsx | 5 ++--- src/app/features/room/message/Message.tsx | 5 ++--- src/app/features/room/message/Reactions.tsx | 5 ++--- .../room/reaction-viewer/ReactionViewer.tsx | 5 ++--- src/app/hooks/useMediaAuthentication.ts | 10 ++++++++++ src/app/pages/client/ClientNonUIFeatures.tsx | 6 +++--- src/app/pages/client/inbox/Invites.tsx | 5 ++--- src/app/pages/client/inbox/Notifications.tsx | 5 ++--- src/app/pages/client/sidebar/SpaceTabs.tsx | 8 +++----- src/app/pages/client/sidebar/UserTab.tsx | 5 ++--- src/client/action/room.js | 6 +----- src/index.tsx | 15 +++++++++------ src/sw.ts | 8 ++++++-- vite.config.js | 4 ++++ 38 files changed, 100 insertions(+), 124 deletions(-) create mode 100644 src/app/hooks/useMediaAuthentication.ts diff --git a/package-lock.json b/package-lock.json index 1dcff435..9c4520ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,6 @@ "@types/react-dom": "18.2.17", "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", - "@types/serviceworker": "0.0.95", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", @@ -5036,13 +5035,6 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "node_modules/@types/serviceworker": { - "version": "0.0.95", - "resolved": "https://registry.npmjs.org/@types/serviceworker/-/serviceworker-0.0.95.tgz", - "integrity": "sha512-Zw7kLIehLvaXf/9RnxAUiYyHmYC5pfvIJD3b1uSPkZGzp+OVmXgmPzVW5fbhYHKcqkeGzsv89uGm+JmMCAPa8Q==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -11514,7 +11506,6 @@ "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.6", "pretty-bytes": "^6.1.1", @@ -12446,4 +12437,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 09efccb7..ecc52c8b 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,6 @@ "@types/react-dom": "18.2.17", "@types/react-google-recaptcha": "2.1.8", "@types/sanitize-html": "2.9.0", - "@types/serviceworker": "0.0.95", "@types/ua-parser-js": "0.7.36", "@typescript-eslint/eslint-plugin": "5.46.1", "@typescript-eslint/parser": "5.46.1", diff --git a/src/app/components/editor/Elements.tsx b/src/app/components/editor/Elements.tsx index aee50ac8..a7438ecd 100644 --- a/src/app/components/editor/Elements.tsx +++ b/src/app/components/editor/Elements.tsx @@ -14,7 +14,7 @@ import { useMatrixClient } from '../../hooks/useMatrixClient'; import { getBeginCommand } from './utils'; import { BlockType } from './types'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; // Put this at the start and end of an inline component to work around this Chromium bug: // https://bugs.chromium.org/p/chromium/issues/detail?id=1249405 @@ -78,8 +78,7 @@ function RenderEmoticonElement({ children, }: { element: EmoticonElement } & RenderElementProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const selected = useSelected(); const focused = useFocused(); diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index b77ae746..9722c795 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -19,7 +19,7 @@ import { IEmoji, emojis } from '../../../plugins/emoji'; import { ExtendedPackImage, PackUsage } from '../../../plugins/custom-emoji'; import { useKeyDown } from '../../../hooks/useKeyDown'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type EmoticonCompleteHandler = (key: string, shortcode: string) => void; @@ -50,8 +50,7 @@ export function EmoticonAutocomplete({ requestClose, }: EmoticonAutocompleteProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const imagePacks = useRelevantImagePacks(mx, PackUsage.Emoticon, imagePackRooms); const recentEmoji = useRecentEmoji(mx, 20); diff --git a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx index 05d303a2..7794bcd1 100644 --- a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx @@ -18,7 +18,7 @@ import { useKeyDown } from '../../../hooks/useKeyDown'; import { getMxIdLocalPart, getMxIdServer, validMxId } from '../../../utils/matrix'; import { getMemberDisplayName, getMemberSearchStr } from '../../../utils/room'; import { UserAvatar } from '../../user-avatar'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type MentionAutoCompleteHandler = (userId: string, name: string) => void; @@ -85,8 +85,7 @@ export function UserMentionAutocomplete({ requestClose, }: UserMentionAutocompleteProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const roomId: string = room.roomId!; const roomAliasOrId = room.getCanonicalAlias() || roomId; const members = useRoomMembers(mx, roomId); @@ -147,7 +146,9 @@ export function UserMentionAutocomplete({ ) : ( autoCompleteMembers.map((roomMember) => { const avatarMxcUrl = roomMember.getMxcAvatarUrl(); - const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp(avatarMxcUrl, 32, 32, 'crop', undefined, false, useAuthentication) : undefined; + const avatarUrl = avatarMxcUrl + ? mx.mxcUrlToHttp(avatarMxcUrl, 32, 32, 'crop', undefined, false, useAuthentication) + : undefined; return ( ( ({ className, room, eventId, requestClose, ...props }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const latestEventReaders = useRoomEventReaders(room, eventId); const getName = (userId: string) => diff --git a/src/app/components/message/content/AudioContent.tsx b/src/app/components/message/content/AudioContent.tsx index 38fa9515..b426654f 100644 --- a/src/app/components/message/content/AudioContent.tsx +++ b/src/app/components/message/content/AudioContent.tsx @@ -18,7 +18,7 @@ import { import { useThrottle } from '../../../hooks/useThrottle'; import { secondsToMinutesAndSeconds } from '../../../utils/common'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; const PLAY_TIME_THROTTLE_OPS = { wait: 500, @@ -46,8 +46,7 @@ export function AudioContent({ renderMediaControl, }: AudioContentProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [srcState, loadSrc] = useAsyncCallback( useCallback( diff --git a/src/app/components/message/content/FileContent.tsx b/src/app/components/message/content/FileContent.tsx index 379d1456..62b8c56d 100644 --- a/src/app/components/message/content/FileContent.tsx +++ b/src/app/components/message/content/FileContent.tsx @@ -31,7 +31,7 @@ import { import * as css from './style.css'; import { stopPropagation } from '../../../utils/keyboard'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; const renderErrorButton = (retry: () => void, text: string) => ( { diff --git a/src/app/components/message/content/ImageContent.tsx b/src/app/components/message/content/ImageContent.tsx index 798c60c5..d0a31c39 100644 --- a/src/app/components/message/content/ImageContent.tsx +++ b/src/app/components/message/content/ImageContent.tsx @@ -28,7 +28,7 @@ import { bytesToSize } from '../../../utils/common'; import { FALLBACK_MIMETYPE } from '../../../utils/mimeTypes'; import { stopPropagation } from '../../../utils/keyboard'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type RenderViewerProps = { src: string; @@ -71,8 +71,7 @@ export const ImageContent = as<'div', ImageContentProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const blurHash = info?.[MATRIX_BLUR_HASH_PROPERTY_NAME]; const [load, setLoad] = useState(false); diff --git a/src/app/components/message/content/ThumbnailContent.tsx b/src/app/components/message/content/ThumbnailContent.tsx index 4324376d..b667e57e 100644 --- a/src/app/components/message/content/ThumbnailContent.tsx +++ b/src/app/components/message/content/ThumbnailContent.tsx @@ -4,7 +4,7 @@ import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { getFileSrcUrl } from './util'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; export type ThumbnailContentProps = { info: IThumbnailContent; @@ -12,8 +12,7 @@ export type ThumbnailContentProps = { }; export function ThumbnailContent({ info, renderImage }: ThumbnailContentProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [thumbSrcState, loadThumbSrc] = useAsyncCallback( useCallback(() => { diff --git a/src/app/components/message/content/VideoContent.tsx b/src/app/components/message/content/VideoContent.tsx index e83e4595..46f82fae 100644 --- a/src/app/components/message/content/VideoContent.tsx +++ b/src/app/components/message/content/VideoContent.tsx @@ -26,7 +26,7 @@ import { getFileSrcUrl } from './util'; import { bytesToSize } from '../../../../util/common'; import { millisecondsToMinutesAndSeconds } from '../../../utils/common'; import { mxcUrlToHttp } from '../../../utils/matrix'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type RenderVideoProps = { title: string; @@ -63,8 +63,7 @@ export const VideoContent = as<'div', VideoContentProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const blurHash = info.thumbnail_info?.[MATRIX_BLUR_HASH_PROPERTY_NAME]; const [load, setLoad] = useState(false); diff --git a/src/app/components/room-card/RoomCard.tsx b/src/app/components/room-card/RoomCard.tsx index 1ca7813f..34a7e24b 100644 --- a/src/app/components/room-card/RoomCard.tsx +++ b/src/app/components/room-card/RoomCard.tsx @@ -32,7 +32,7 @@ import { useJoinedRoomId } from '../../hooks/useJoinedRoomId'; import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; import { getRoomAvatarUrl, getStateEvent } from '../../utils/room'; import { useStateEventCallback } from '../../hooks/useStateEventCallback'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type GridColumnCount = '1' | '2' | '3'; const getGridColumnCount = (gridWidth: number): GridColumnCount => { @@ -162,8 +162,7 @@ export const RoomCard = as<'div', RoomCardProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const joinedRoomId = useJoinedRoomId(allRooms, roomIdOrAlias); const joinedRoom = mx.getRoom(joinedRoomId); const [topicEvent, setTopicEvent] = useState(() => diff --git a/src/app/components/room-intro/RoomIntro.tsx b/src/app/components/room-intro/RoomIntro.tsx index 28be5daf..9e1a4f12 100644 --- a/src/app/components/room-intro/RoomIntro.tsx +++ b/src/app/components/room-intro/RoomIntro.tsx @@ -14,7 +14,7 @@ import { RoomAvatar } from '../room-avatar'; import { nameInitials } from '../../utils/common'; import { useRoomAvatar, useRoomName, useRoomTopic } from '../../hooks/useRoomMeta'; import { mDirectAtom } from '../../state/mDirectList'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; export type RoomIntroProps = { room: Room; @@ -22,8 +22,7 @@ export type RoomIntroProps = { export const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const { navigateRoom } = useRoomNavigate(); const mDirects = useAtomValue(mDirectAtom); diff --git a/src/app/components/url-preview/UrlPreviewCard.tsx b/src/app/components/url-preview/UrlPreviewCard.tsx index c33b9850..2a51969a 100644 --- a/src/app/components/url-preview/UrlPreviewCard.tsx +++ b/src/app/components/url-preview/UrlPreviewCard.tsx @@ -11,15 +11,14 @@ import { import * as css from './UrlPreviewCard.css'; import { tryDecodeURIComponent } from '../../utils/dom'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; const linkStyles = { color: color.Success.Main }; export const UrlPreviewCard = as<'div', { url: string; ts: number }>( ({ url, ts, ...props }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [previewStatus, loadPreview] = useAsyncCallback( useCallback(() => mx.getUrlPreview(url, ts), [url, ts, mx]) ); diff --git a/src/app/features/lobby/LobbyHeader.tsx b/src/app/features/lobby/LobbyHeader.tsx index ed5373b3..6ef0044b 100644 --- a/src/app/features/lobby/LobbyHeader.tsx +++ b/src/app/features/lobby/LobbyHeader.tsx @@ -34,7 +34,7 @@ import { stopPropagation } from '../../utils/keyboard'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { BackRouteHandler } from '../../components/BackRouteHandler'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type LobbyMenuProps = { roomId: string; @@ -124,8 +124,7 @@ type LobbyHeaderProps = { }; export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const space = useSpace(); const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); const [menuAnchor, setMenuAnchor] = useState(); diff --git a/src/app/features/lobby/LobbyHero.tsx b/src/app/features/lobby/LobbyHero.tsx index e652fd91..1cd0b8e2 100644 --- a/src/app/features/lobby/LobbyHero.tsx +++ b/src/app/features/lobby/LobbyHero.tsx @@ -12,12 +12,11 @@ import * as css from './LobbyHero.css'; import { PageHero } from '../../components/page'; import { onEnterOrSpace, stopPropagation } from '../../utils/keyboard'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; export function LobbyHero() { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const space = useSpace(); const name = useRoomName(space); diff --git a/src/app/features/lobby/RoomItem.tsx b/src/app/features/lobby/RoomItem.tsx index 14852b3d..f8db3991 100644 --- a/src/app/features/lobby/RoomItem.tsx +++ b/src/app/features/lobby/RoomItem.tsx @@ -40,7 +40,7 @@ import { ErrorCode } from '../../cs-errorcode'; import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../../utils/room'; import { ItemDraggableTarget, useDraggableItem } from './DnD'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type RoomJoinButtonProps = { roomId: string; @@ -336,8 +336,7 @@ export const RoomItemCard = as<'div', RoomItemCardProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const { roomId, content } = item; const room = getRoom(roomId); const targetRef = useRef(null); diff --git a/src/app/features/lobby/SpaceItem.tsx b/src/app/features/lobby/SpaceItem.tsx index 3e3c3214..deaf9ba5 100644 --- a/src/app/features/lobby/SpaceItem.tsx +++ b/src/app/features/lobby/SpaceItem.tsx @@ -36,7 +36,7 @@ import { useDraggableItem } from './DnD'; import { openCreateRoom, openSpaceAddExisting } from '../../../client/action/navigation'; import { stopPropagation } from '../../utils/keyboard'; import { mxcUrlToHttp } from '../../utils/matrix'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; function SpaceProfileLoading() { return ( @@ -410,8 +410,7 @@ export const SpaceItemCard = as<'div', SpaceItemCardProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const { roomId, content } = item; const space = getRoom(roomId); const targetRef = useRef(null); diff --git a/src/app/features/message-search/SearchResultGroup.tsx b/src/app/features/message-search/SearchResultGroup.tsx index a3a67eda..29fce7bf 100644 --- a/src/app/features/message-search/SearchResultGroup.tsx +++ b/src/app/features/message-search/SearchResultGroup.tsx @@ -38,7 +38,7 @@ import { SequenceCard } from '../../components/sequence-card'; import { UserAvatar } from '../../components/user-avatar'; import { useMentionClickHandler } from '../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../hooks/useSpoilerClickHandler'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type SearchResultGroupProps = { room: Room; @@ -57,8 +57,7 @@ export function SearchResultGroup({ onOpen, }: SearchResultGroupProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const highlightRegex = useMemo(() => makeHighlightRegex(highlights), [highlights]); const mentionClickHandler = useMentionClickHandler(room.roomId); diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index c525ab2a..19d04f35 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -38,7 +38,7 @@ import { stopPropagation } from '../../utils/keyboard'; import { getMatrixToRoom } from '../../plugins/matrix-to'; import { getCanonicalAliasOrRoomId, isRoomAlias } from '../../utils/matrix'; import { getViaServers } from '../../plugins/via-servers'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type RoomNavItemMenuProps = { room: Room; @@ -176,8 +176,7 @@ export function RoomNavItem({ linkPath, }: RoomNavItemProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [hover, setHover] = useState(false); const { hoverProps } = useHover({ onHoverChange: setHover }); const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setHover }); diff --git a/src/app/features/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx index 1b538ffc..a4305e45 100644 --- a/src/app/features/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -55,7 +55,7 @@ import { ScrollTopContainer } from '../../components/scroll-top-container'; import { UserAvatar } from '../../components/user-avatar'; import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; import { stopPropagation } from '../../utils/keyboard'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; export const MembershipFilters = { filterJoined: (m: RoomMember) => m.membership === Membership.Join, @@ -172,8 +172,7 @@ type MembersDrawerProps = { }; export function MembersDrawer({ room, members }: MembersDrawerProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const scrollRef = useRef(null); const searchInputRef = useRef(null); const scrollTopAnchorRef = useRef(null); diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 03bc9655..8fcfbc97 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -108,7 +108,7 @@ import { mobileOrTablet } from '../../utils/user-agent'; import { useElementSizeObserver } from '../../hooks/useElementSizeObserver'; import { ReplyLayout, ThreadIndicator } from '../../components/message'; import { roomToParentsAtom } from '../../state/room/roomToParents'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; interface RoomInputProps { editor: Editor; @@ -119,8 +119,7 @@ interface RoomInputProps { export const RoomInput = forwardRef( ({ editor, fileDropContainerRef, roomId, room }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline'); const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); const commands = useCommands(mx, room); diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index c47cb35b..34f54868 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -122,7 +122,7 @@ import { roomToUnreadAtom } from '../../state/room/roomToUnread'; import { useMentionClickHandler } from '../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../hooks/useSpoilerClickHandler'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -438,8 +438,7 @@ const getRoomUnreadInfo = (room: Room, scrollTo = false) => { export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimelineProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const encryptedRoom = mx.isRoomEncrypted(room.roomId); const [messageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing'); diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index eaa90970..ae80deb6 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -53,7 +53,7 @@ import { stopPropagation } from '../../utils/keyboard'; import { getMatrixToRoom } from '../../plugins/matrix-to'; import { getViaServers } from '../../plugins/via-servers'; import { BackRouteHandler } from '../../components/BackRouteHandler'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; type RoomMenuProps = { room: Room; @@ -175,8 +175,7 @@ const RoomMenu = forwardRef(({ room, requestClose export function RoomViewHeader() { const navigate = useNavigate(); const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const screenSize = useScreenSizeContext(); const room = useRoom(); const space = useSpaceOptionally(); diff --git a/src/app/features/room/message/Message.tsx b/src/app/features/room/message/Message.tsx index 94a5825c..e9a2d797 100644 --- a/src/app/features/room/message/Message.tsx +++ b/src/app/features/room/message/Message.tsx @@ -67,7 +67,7 @@ import { copyToClipboard } from '../../../utils/dom'; import { stopPropagation } from '../../../utils/keyboard'; import { getMatrixToRoomEvent } from '../../../plugins/matrix-to'; import { getViaServers } from '../../../plugins/via-servers'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; export type ReactionHandler = (keyOrMxc: string, shortcode: string) => void; @@ -651,8 +651,7 @@ export const Message = as<'div', MessageProps>( ref ) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const senderId = mEvent.getSender() ?? ''; const [hover, setHover] = useState(false); const { hoverProps } = useHover({ onHoverChange: setHover }); diff --git a/src/app/features/room/message/Reactions.tsx b/src/app/features/room/message/Reactions.tsx index 258ab629..f0f308bb 100644 --- a/src/app/features/room/message/Reactions.tsx +++ b/src/app/features/room/message/Reactions.tsx @@ -22,7 +22,7 @@ import { useRelations } from '../../../hooks/useRelations'; import * as css from './styles.css'; import { ReactionViewer } from '../reaction-viewer'; import { stopPropagation } from '../../../utils/keyboard'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; export type ReactionsProps = { room: Room; @@ -34,8 +34,7 @@ export type ReactionsProps = { export const Reactions = as<'div', ReactionsProps>( ({ className, room, relations, mEventId, canSendReaction, onReactionToggle, ...props }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [viewer, setViewer] = useState(false); const myUserId = mx.getUserId(); const reactions = useRelations( diff --git a/src/app/features/room/reaction-viewer/ReactionViewer.tsx b/src/app/features/room/reaction-viewer/ReactionViewer.tsx index 9e166a9e..d4b39845 100644 --- a/src/app/features/room/reaction-viewer/ReactionViewer.tsx +++ b/src/app/features/room/reaction-viewer/ReactionViewer.tsx @@ -25,7 +25,7 @@ import { useRelations } from '../../../hooks/useRelations'; import { Reaction } from '../../../components/message'; import { getHexcodeForEmoji, getShortcodeFor } from '../../../plugins/emoji'; import { UserAvatar } from '../../../components/user-avatar'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; export type ReactionViewerProps = { room: Room; @@ -36,8 +36,7 @@ export type ReactionViewerProps = { export const ReactionViewer = as<'div', ReactionViewerProps>( ({ className, room, initialKey, relations, requestClose, ...props }, ref) => { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const reactions = useRelations( relations, useCallback((rel) => [...(rel.getSortedAnnotationsByKey() ?? [])], []) diff --git a/src/app/hooks/useMediaAuthentication.ts b/src/app/hooks/useMediaAuthentication.ts new file mode 100644 index 00000000..04b25e19 --- /dev/null +++ b/src/app/hooks/useMediaAuthentication.ts @@ -0,0 +1,10 @@ +import { useSpecVersions } from './useSpecVersions'; + +export const useMediaAuthentication = (): boolean => { + const { versions } = useSpecVersions(); + + // Media authentication is introduced in spec version 1.11 + const authenticatedMedia = versions.includes('v1.11'); + + return authenticatedMedia; +}; diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 9f3f129b..8678e619 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -25,7 +25,7 @@ import { NotificationType, UnreadInfo } from '../../../types/matrix/room'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; import { useInboxNotificationsSelected } from '../../hooks/router/useInbox'; -import { useSpecVersions } from '../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; function SystemEmojiFeature() { const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); @@ -133,8 +133,7 @@ function MessageNotifications() { const notifRef = useRef(); const unreadCacheRef = useRef>(new Map()); const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const [showNotifications] = useSetting(settingsAtom, 'showNotifications'); const [notificationSound] = useSetting(settingsAtom, 'isNotificationSounds'); @@ -243,6 +242,7 @@ function MessageNotifications() { playSound, notify, selectedRoomId, + useAuthentication, ]); return ( diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx index 12ca65bb..8dcfa1c2 100644 --- a/src/app/pages/client/inbox/Invites.tsx +++ b/src/app/pages/client/inbox/Invites.tsx @@ -42,7 +42,7 @@ import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { useRoomTopic } from '../../../hooks/useRoomMeta'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; const COMPACT_CARD_WIDTH = 548; @@ -55,8 +55,7 @@ type InviteCardProps = { }; function InviteCard({ room, userId, direct, compact, onNavigate }: InviteCardProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const roomName = room.name || room.getCanonicalAlias() || room.roomId; const member = room.getMember(userId); const memberEvent = member?.events.member; diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 95f9b9ff..64eabc99 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -81,7 +81,7 @@ import { useMentionClickHandler } from '../../../hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '../../../hooks/useSpoilerClickHandler'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type RoomNotificationsGroup = { roomId: string; @@ -192,8 +192,7 @@ function RoomNotificationsGroupComp({ onOpen, }: RoomNotificationsGroupProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const unread = useRoomUnread(room.roomId, roomToUnreadAtom); const mentionClickHandler = useMentionClickHandler(room.roomId); const spoilerClickHandler = useSpoilerClickHandler(); diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index d63bb24d..343afae4 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -87,7 +87,7 @@ import { stopPropagation } from '../../../utils/keyboard'; import { getMatrixToRoom } from '../../../plugins/matrix-to'; import { getViaServers } from '../../../plugins/via-servers'; import { getRoomAvatarUrl } from '../../../utils/room'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type SpaceMenuProps = { room: Room; @@ -381,8 +381,7 @@ function SpaceTab({ onUnpin, }: SpaceTabProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const targetRef = useRef(null); const spaceDraggable: SidebarDraggable = useMemo( @@ -528,8 +527,7 @@ function ClosedSpaceFolder({ disabled, }: ClosedSpaceFolderProps) { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const handlerRef = useRef(null); const spaceDraggable: FolderDraggable = useMemo(() => ({ folder }), [folder]); diff --git a/src/app/pages/client/sidebar/UserTab.tsx b/src/app/pages/client/sidebar/UserTab.tsx index 09b3f251..5e6c82ab 100644 --- a/src/app/pages/client/sidebar/UserTab.tsx +++ b/src/app/pages/client/sidebar/UserTab.tsx @@ -7,7 +7,7 @@ import { UserAvatar } from '../../../components/user-avatar'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../../utils/matrix'; import { nameInitials } from '../../../utils/common'; -import { useSpecVersions } from '../../../hooks/useSpecVersions'; +import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; type UserProfile = { avatar_url?: string; @@ -15,8 +15,7 @@ type UserProfile = { }; export function UserTab() { const mx = useMatrixClient(); - const { versions } = useSpecVersions(); - const useAuthentication = versions.includes('v1.11'); + const useAuthentication = useMediaAuthentication(); const userId = mx.getUserId()!; const [profile, setProfile] = useState({}); diff --git a/src/client/action/room.js b/src/client/action/room.js index cd4995b9..48ae7c47 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -244,11 +244,7 @@ async function unignore(mx, userIds) { } async function setPowerLevel(mx, roomId, userId, powerLevel) { - const room = mx.getRoom(roomId); - - const powerlevelEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; - - const result = await mx.setPowerLevel(roomId, userId, powerLevel, powerlevelEvent); + const result = await mx.setPowerLevel(roomId, userId, powerLevel); return result; } diff --git a/src/index.tsx b/src/index.tsx index 58ecc42a..805847f1 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -23,19 +23,22 @@ settings.applyTheme(); // Register Service Worker if ('serviceWorker' in navigator) { - navigator.serviceWorker.register( - import.meta.env.MODE === 'production' ? `${trimTrailingSlash(import.meta.env.BASE_URL)}/sw.js` : '/dev-sw.js?dev-sw' - ) + const swUrl = + import.meta.env.MODE === 'production' + ? `${trimTrailingSlash(import.meta.env.BASE_URL)}/sw.js` + : `/dev-sw.js?dev-sw`; + + navigator.serviceWorker.register(swUrl); navigator.serviceWorker.addEventListener('message', (event) => { if (event.data?.type === 'token' && event.data?.responseKey) { // Get the token for SW. - const token = localStorage.getItem('cinny_access_token'); + const token = localStorage.getItem('cinny_access_token') ?? undefined; event.source!.postMessage({ responseKey: event.data.responseKey, token, - }) + }); } - }) + }); } const mountApp = () => { diff --git a/src/sw.ts b/src/sw.ts index 11953917..11f7f8b2 100644 --- a/src/sw.ts +++ b/src/sw.ts @@ -1,3 +1,8 @@ +/// + +export type {}; +declare const self: ServiceWorkerGlobalScope; + async function askForAccessToken(client: Client): Promise { return new Promise((resolve) => { const responseKey = Math.random().toString(36); @@ -32,11 +37,10 @@ self.addEventListener('fetch', (event: FetchEvent) => { } event.respondWith( (async (): Promise => { - const client = await clients.get(event.clientId); + const client = await self.clients.get(event.clientId); let token: string | undefined; if (client) token = await askForAccessToken(client); - // eslint-disable-next-line consistent-return return fetch(url, fetchConfig(token)); })() ); diff --git a/vite.config.js b/vite.config.js index e629c751..2771538c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -77,6 +77,10 @@ export default defineConfig({ injectManifest: { injectionPoint: undefined, }, + devOptions: { + enabled: true, + type: 'module' + } }), ], optimizeDeps: { From 5482f8e72e72ba1323d5991454c9c36b608d6256 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:51:52 +1000 Subject: [PATCH 632/824] render matrix room and event link content (#1938) --- src/app/plugins/react-custom-html-parser.tsx | 31 +++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index ab333704..6a4d0530 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -14,7 +14,12 @@ import { IntermediateRepresentation, Opts as LinkifyOpts, OptFn } from 'linkifyj import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; -import { getMxIdLocalPart, getCanonicalAliasRoomId, isRoomAlias, mxcUrlToHttp } from '../utils/matrix'; +import { + getMxIdLocalPart, + getCanonicalAliasRoomId, + isRoomAlias, + mxcUrlToHttp, +} from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; @@ -44,7 +49,8 @@ export const LINKIFY_OPTS: LinkifyOpts = { }; export const makeMentionCustomProps = ( - handleMentionClick?: ReactEventHandler + handleMentionClick?: ReactEventHandler, + content?: string ): ComponentPropsWithoutRef<'a'> => ({ style: { cursor: 'pointer' }, target: '_blank', @@ -53,6 +59,7 @@ export const makeMentionCustomProps = ( tabIndex: handleMentionClick ? 0 : -1, onKeyDown: handleMentionClick ? onEnterOrSpace(handleMentionClick) : undefined, onClick: handleMentionClick, + children: content, }); export const renderMatrixMention = ( @@ -72,8 +79,9 @@ export const renderMatrixMention = ( className={css.Mention({ highlight: mx.getUserId() === userId })} data-mention-id={userId} > - {`@${(currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) - }`} + {`@${ + (currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) + }`} ); } @@ -85,6 +93,8 @@ export const renderMatrixMention = ( isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias ); + const fallbackContent = mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias; + return ( - {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + {customProps.children ? customProps.children : fallbackContent} ); } @@ -118,7 +128,9 @@ export const renderMatrixMention = ( data-mention-event-id={eventId} data-mention-via={viaServers?.join(',')} > - Message: {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + {customProps.children + ? customProps.children + : `Message: ${mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias}`} ); } @@ -327,12 +339,17 @@ export const getReactCustomHtmlParser = ( } if (name === 'a' && testMatrixTo(tryDecodeURIComponent(props.href))) { + const content = children.find((child) => !(child instanceof DOMText)) + ? undefined + : children.map((c) => (c instanceof DOMText ? c.data : '')).join(); + const mention = renderMatrixMention( mx, roomId, tryDecodeURIComponent(props.href), - makeMentionCustomProps(params.handleMentionClick) + makeMentionCustomProps(params.handleMentionClick, content) ); + if (mention) return mention; } From f2c31d29a287f6d2cf9e92be1a1b7ba312a3034c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Wed, 11 Sep 2024 13:13:15 +0800 Subject: [PATCH 633/824] fix: Fix video and audio loading with authenicated media (#1946) Appeareantly Firefox (and maybe Chrome) won't let service workers take over requests from