diff --git a/webui-src/.eslintrc.json b/webui-src/.eslintrc.json deleted file mode 100644 index ac99773..0000000 --- a/webui-src/.eslintrc.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "root": true, - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": "eslint:recommended", - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly", - "window": "readonly", - "document": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2020 - }, - "ignorePatterns": ["mithril.js", "assets/*", "make-src/*"], - "rules": { - "linebreak-style": ["off", "unix"], - "quotes": ["error", "single"], - "semi": ["error", "always"], - "arrow-spacing": ["error", { "before": true, "after": true }], - "arrow-parens": ["error", "always"], - "comma-style": ["error", "last"], - "comma-spacing": ["error", { "before": false, "after": true }], - "camelcase": [ - "error", - { - "allow": ["^UNSAFE_"], - "properties": "never", - "ignoreGlobals": true - } - ], - "eol-last": "error", - "eqeqeq": ["error", "always", { "null": "ignore" }], - "no-irregular-whitespace": ["error"], - "no-trailing-spaces": ["error"], - "no-unexpected-multiline": ["error"], - "no-unreachable": ["error"], - "no-var": "warn", - "no-unused-vars": [ - "error", - { - "args": "none", - "caughtErrors": "none", - "ignoreRestSiblings": true, - "vars": "all" - } - ], - "no-use-before-define": ["warn", { "functions": true, "classes": false }], - "object-shorthand": "error", - "prefer-const": ["error", { "destructuring": "all" }], - "semi-style": ["warn", "last"], - "spaced-comment": ["warn", "always"] - } -} diff --git a/webui-src/.nvmrc b/webui-src/.nvmrc new file mode 100644 index 0000000..f3c8820 --- /dev/null +++ b/webui-src/.nvmrc @@ -0,0 +1 @@ +v24.15.0 diff --git a/webui-src/app/boards/board_view.js b/webui-src/app/boards/board_view.js index 7a69e67..fe60498 100644 --- a/webui-src/app/boards/board_view.js +++ b/webui-src/app/boards/board_view.js @@ -39,7 +39,7 @@ function createboard() { m('label[for=thumbnail]', 'Thumbnail: '), m('input[type=file][name=files][id=thumbnail][accept=image/*]', { onchange: async (e) => { - let reader = new FileReader(); + const reader = new FileReader(); reader.onloadend = function () { thumbnail = reader.result.substring(reader.result.indexOf(',') + 1); }; diff --git a/webui-src/app/boards/boards_util.js b/webui-src/app/boards/boards_util.js index 15c72eb..1519b81 100644 --- a/webui-src/app/boards/boards_util.js +++ b/webui-src/app/boards/boards_util.js @@ -1,17 +1,17 @@ const m = require('mithril'); const rs = require('rswebui'); -const GROUP_SUBSCRIBE_ADMIN = 0x01;// means: you have the admin key for this group -const GROUP_SUBSCRIBE_PUBLISH = 0x02;// means: you have the publish key for thiss group. Typical use: publish key in channels are shared with specific friends. -const GROUP_SUBSCRIBE_SUBSCRIBED = 0x04;// means: you are subscribed to a group, which makes you a source for this group to your friend nodes. +const GROUP_SUBSCRIBE_ADMIN = 0x01; // means: you have the admin key for this group +const GROUP_SUBSCRIBE_PUBLISH = 0x02; // means: you have the publish key for thiss group. Typical use: publish key in channels are shared with specific friends. +const GROUP_SUBSCRIBE_SUBSCRIBED = 0x04; // means: you are subscribed to a group, which makes you a source for this group to your friend nodes. const GROUP_SUBSCRIBE_NOT_SUBSCRIBED = 0x08; const GROUP_MY_BOARD = GROUP_SUBSCRIBE_ADMIN + GROUP_SUBSCRIBE_SUBSCRIBED + GROUP_SUBSCRIBE_PUBLISH; const GXS_VOTE_DOWN = 0x0001; const GXS_VOTE_UP = 0x0002; -//rsgxscircles.h:50 -const PUBLIC = 1; /// Public distribution -const EXTERNAL = 2; /// Restricted to an external circle, based on GxsIds +// rsgxscircles.h:50 +const PUBLIC = 1; // Public distribution +const EXTERNAL = 2; // Restricted to an external circle, based on GxsIds const NODES_GROUP = 3; const Data = { @@ -20,34 +20,6 @@ const Data = { Comments: {}, // threadID, msgID -> {Comment, showReplies} }; -async function updateContent(content, boardid) { - const res = await rs.rsJsonApiRequest('/rsPosted/getBoardContent', { - boardId: boardid, - contentsIds: [content.mMsgId], - }); - if (res.body.retval && res.body.posts.length > 0) { - Data.Posts[boardid][content.mMsgId] = { post: res.body.posts[0], isSearched: true }; - } else if (res.body.retval && res.body.comments.length > 0) { - if (Data.Comments[content.mThreadId] === undefined) { - Data.Comments[content.mThreadId] = {}; - } - Data.Comments[content.mThreadId][content.mMsgId] = res.body.comments[0]; - } else if (res.body.retval && res.body.votes.length > 0) { - const vote = res.body.votes[0]; - if ( - Data.Comments[vote.mMeta.mThreadId] && - Data.Comments[vote.mMeta.mThreadId][vote.mMeta.mParentId] - ) { - if (vote.mVoteType === GXS_VOTE_UP) { - Data.Comments[vote.mMeta.mThreadId][vote.mMeta.mParentId].mUpVotes += 1; - } - if (vote.mVoteType === GXS_VOTE_DOWN) { - Data.Comments[vote.mMeta.mThreadId][vote.mMeta.mParentId].mDownVotes += 1; - } - } - } -} - async function updateDisplayBoards(keyid, details) { const res1 = await rs.rsJsonApiRequest('/rsPosted/getBoardsInfo', { boardsIds: [keyid], @@ -72,7 +44,7 @@ async function updateDisplayBoards(keyid, details) { Data.Posts[keyid] = {}; } - /*const res2 = await rs.rsJsonApiRequest('/rsPosted/getContentSummaries', { + /* const res2 = await rs.rsJsonApiRequest('/rsPosted/getContentSummaries', { boardId: keyid, }); @@ -81,7 +53,6 @@ async function updateDisplayBoards(keyid, details) { updateContent(content, keyid); }); }*/ - } const DisplayBoardsFromList = () => { diff --git a/webui-src/app/channels/channel_view.js b/webui-src/app/channels/channel_view.js index 81adda2..31101cc 100644 --- a/webui-src/app/channels/channel_view.js +++ b/webui-src/app/channels/channel_view.js @@ -109,7 +109,7 @@ function createchannel() { m('label[for=thumbnail]', 'Thumbnail: '), m('input[type=file][name=files][id=thumbnail][accept=image/*]', { onchange: async (e) => { - let reader = new FileReader(); + const reader = new FileReader(); reader.onloadend = function () { thumbnail = reader.result.substring(reader.result.indexOf(',') + 1); }; @@ -238,7 +238,7 @@ const AddPost = () => { m('label[for=thumbnail]', 'Thumbnail: '), m('input[type=file][name=files][id=thumbnail][accept=image/*]', { onchange: async (e) => { - let reader = new FileReader(); + const reader = new FileReader(); reader.onloadend = function () { pthumbnail = reader.result.substring(reader.result.indexOf(',') + 1); }; diff --git a/webui-src/app/chat/chat.js b/webui-src/app/chat/chat.js index 6f27b49..ff8e215 100644 --- a/webui-src/app/chat/chat.js +++ b/webui-src/app/chat/chat.js @@ -7,18 +7,11 @@ const chatEmoji = require('chat/chat_emoji'); const HistoryBrowserModal = require('people/people_history'); const { - get64Num, - loadLobbyDetails, - loadDistantChatDetails, sortLobbies, - getNicknameColor, getStatusColor, getStatusTooltip, - renderTextWithEmoji, getSafeAvatar, - MobileState, ChatRoomsModel, - Message, ChatLobbyModel, ChatHubState, } = chatState; @@ -123,13 +116,13 @@ function pollHashStatus(localpath) { const info = data.info; const sizeNum = info.size.xint64 || parseInt(info.size.xstr64) || info.size; const fileLink = `${info.name} (${rs.formatBytes(sizeNum)})`; - + const textarea = document.querySelector('.chat-hub-textarea'); if (textarea) { const val = textarea.value; textarea.value = val ? val + '\n' + fileLink : fileLink; } - + ChatHubState.showAttachModal = false; ChatHubState.isHashing = false; ChatHubState.attachPath = ''; @@ -144,75 +137,6 @@ function pollHashStatus(localpath) { // ************************* views **************************** -const Lobby = () => { - return { - view: (vnode) => { - const { info, tagname, onclick, lobbytagname = 'mainname' } = vnode.attrs; - return m( - ChatLobbyModel.selected(info, '.selected-lobby', tagname), - { - key: rs.idToHex(info.lobby_id), - onclick, - }, - [ - m('h5', { class: lobbytagname }, info.lobby_name === '' ? '' : info.lobby_name), - m('.topic', info.lobby_topic), - ] - ); - }, - }; -}; - -const LobbyList = { - view(vnode) { - const tagname = vnode.attrs.tagname; - const lobbytagname = vnode.attrs.lobbytagname; - const onclick = vnode.attrs.onclick || (() => null); - return [ - vnode.attrs.rooms.map((info) => - m(Lobby, { - info, - tagname, - lobbytagname, - onclick: onclick(info), - }) - ), - ]; - }, -}; - -const SubscribedLobbies = { - view() { - return m('.widget', [ - m('.widget__heading', m('h3', 'Subscribed chat rooms')), - m('.widget__body', [ - m(LobbyList, { - rooms: sortLobbies(Object.values(ChatRoomsModel.subscribedRooms)), - tagname: '.lobby.subscribed', - onclick: ChatLobbyModel.switchToEvent, - }), - ]), - ]); - }, -}; - -const PublicLobbies = { - view() { - return m('.widget', [ - m('.widget__heading', m('h3', 'Public chat rooms')), - m('.widget__body', [ - m(LobbyList, { - rooms: (ChatRoomsModel.allRooms || []).filter((info) => !ChatRoomsModel.subscribed(info)), - tagname: '.lobby.public', - onclick: ChatLobbyModel.setupEvent, - }), - ]), - ]); - }, -}; - -// ************************* Chat Hub Sub-Components **************************** - const ChatRoomHeader = () => { return { view: (vnode) => { @@ -982,8 +906,6 @@ const ChatRoomDetailView = () => { const room = ChatHubState.selectedRoom; if (!room) return null; - let participantCount = 0; - let participantNames = []; let participants = []; if (room.gxs_ids) { @@ -994,7 +916,7 @@ const ChatRoomDetailView = () => { })); } else if (typeof room.gxs_ids === 'object') { participants = Object.keys(room.gxs_ids).map((key) => ({ - key: key, + key, name: rs.userList.username(key) || key })); } @@ -1011,8 +933,8 @@ const ChatRoomDetailView = () => { } } - participantCount = participants.length; - participantNames = participants.map((p) => p.name); + const participantCount = participants.length; + const participantNames = participants.map((p) => p.name); participantNames.sort((a, b) => a.localeCompare(b)); const lobbyHexId = rs.idToHex(room.lobby_id); @@ -1316,7 +1238,7 @@ const Layout = { ChatHubState.showCreateRoomModal && m('.attach-modal-overlay', [ m('.attach-modal', [ m('h4', 'Create New Chat Room'), - + m('.form-field', { style: 'display: flex; flex-direction: column; gap: 0.25rem;' }, [ m('label', { style: 'font-weight: bold; font-size: 0.9rem; color: #475569;' }, 'Room Name:'), m('input[type=text]', { @@ -1326,7 +1248,7 @@ const Layout = { style: 'padding: 0.5rem; border: 1px solid #cbd5e1; border-radius: 0.25rem; font-size: 0.9rem;' }) ]), - + m('.form-field', { style: 'display: flex; flex-direction: column; gap: 0.25rem; margin-top: 0.5rem;' }, [ m('label', { style: 'font-weight: bold; font-size: 0.9rem; color: #475569;' }, 'Topic:'), m('input[type=text]', { @@ -1344,7 +1266,7 @@ const Layout = { onchange: (e) => { ChatHubState.newRoomIdentity = e.target.value; }, style: 'padding: 0.5rem; border: 1px solid #cbd5e1; border-radius: 0.25rem; font-size: 0.9rem; background-color: #ffffff;' }, [ - ChatHubState.ownGxsIdentities && ChatHubState.ownGxsIdentities.map(id => { + ChatHubState.ownGxsIdentities && ChatHubState.ownGxsIdentities.map((id) => { const details = ChatHubState.gxsDetails[id]; const name = details ? (details.mNickname || details.mGroupName) : id; return m('option', { value: id }, name); @@ -1386,7 +1308,7 @@ const Layout = { let flags = 0; if (isPublic) flags |= 4; if (isSigned) flags |= 8; - + rs.rsJsonApiRequest('/rsChats/createChatLobby', { lobby_name: name, lobby_identity: identity, @@ -1601,74 +1523,6 @@ const Layout = { }, }; -const LayoutSingle = () => { - const onResize = () => { - const element = document.querySelector('.messages'); - if (element) element.scrollTop = element.scrollHeight; - }; - return { - oninit: () => { - ChatLobbyModel.loadLobby(m.route.param('lobby')); - window.addEventListener('resize', onResize); - }, - onremove: () => window.removeEventListener('resize', onResize), - view: (vnode) => { - const chatType = ChatLobbyModel.currentLobby.chatType; - const isPrivate = chatType === 1 || chatType === 2; - const isRoom = chatType === 3; - return m( - '.node-panel.chat-panel.chat-room', - { - class: - (MobileState.showLobbies ? 'show-lobbies ' : '') + - (MobileState.showUsers ? 'show-users ' : '') + - (isPrivate ? 'no-lobbies' : ''), - }, - [ - m('.chat-overlay', { onclick: () => MobileState.closeAll() }), - m( - '.messages' + (isRoom ? '.compact-container' : ''), - { onclick: () => MobileState.closeAll() }, - ChatLobbyModel.messages - ), - m( - '.chatMessage', - {}, - [ - m('textarea.chatMsg', { - placeholder: 'Type a message...', - enterkeyhint: 'send', - onkeydown: (e) => { - if ((e.key === 'Enter' || e.keyCode === 13) && !e.shiftKey) { - const msg = e.target.value; - if (msg.trim() === '') return false; - e.target.value = ' sending ... '; - ChatLobbyModel.sendMessage(msg, () => (e.target.value = '')); - return false; - } - }, - }), - m( - 'button.chat-send-btn', - { - onclick: (e) => { - const textarea = e.target.closest('.chatMessage').querySelector('textarea'); - const msg = textarea.value; - if (msg.trim() === '') return; - textarea.value = ' sending ... '; - ChatLobbyModel.sendMessage(msg, () => (textarea.value = '')); - }, - }, - m('i.fas.fa-paper-plane') - ), - ] - ), - ] - ); - }, - }; -}; - /* /rsChats/initiateDistantChatConnexion * @param[in] to_pid RsGxsId to start the connection diff --git a/webui-src/app/chat/chat_emoji.js b/webui-src/app/chat/chat_emoji.js index 32da6d9..bfff2bb 100644 --- a/webui-src/app/chat/chat_emoji.js +++ b/webui-src/app/chat/chat_emoji.js @@ -7,72 +7,72 @@ const EMOJI_ICONS = { }; const EMOJI_DATA = { Smileys: [ - '๐Ÿ˜€','๐Ÿ˜','๐Ÿ˜‚','๐Ÿคฃ','๐Ÿ˜ƒ','๐Ÿ˜„','๐Ÿ˜…','๐Ÿ˜†','๐Ÿ˜‰','๐Ÿ˜Š','๐Ÿ˜‹','๐Ÿ˜Ž','๐Ÿ˜','๐Ÿ˜˜','๐Ÿฅฐ','๐Ÿ˜—','๐Ÿ˜™','๐Ÿ˜š', - '๐Ÿ™‚','๐Ÿค—','๐Ÿคฉ','๐Ÿค”','๐Ÿคจ','๐Ÿ˜','๐Ÿ˜‘','๐Ÿ˜ถ','๐Ÿ™„','๐Ÿ˜','๐Ÿ˜ฃ','๐Ÿ˜ฅ','๐Ÿ˜ฎ','๐Ÿค','๐Ÿ˜ฏ','๐Ÿ˜ช','๐Ÿ˜ซ','๐Ÿฅฑ', - '๐Ÿ˜ด','๐Ÿ˜Œ','๐Ÿ˜›','๐Ÿ˜œ','๐Ÿ˜','๐Ÿคค','๐Ÿ˜’','๐Ÿ˜“','๐Ÿ˜”','๐Ÿ˜•','๐Ÿ™ƒ','๐Ÿค‘','๐Ÿ˜ฒ','โ˜น๏ธ','๐Ÿ™','๐Ÿ˜–','๐Ÿ˜ž','๐Ÿ˜Ÿ', - '๐Ÿ˜ค','๐Ÿ˜ข','๐Ÿ˜ญ','๐Ÿ˜ฆ','๐Ÿ˜ง','๐Ÿ˜จ','๐Ÿ˜ฉ','๐Ÿคฏ','๐Ÿ˜ฌ','๐Ÿ˜ฐ','๐Ÿ˜ฑ','๐Ÿฅต','๐Ÿฅถ','๐Ÿ˜ณ','๐Ÿคช','๐Ÿ˜ต','๐Ÿ˜ก','๐Ÿ˜ ', - '๐Ÿคฌ','๐Ÿ˜ท','๐Ÿค’','๐Ÿค•','๐Ÿคข','๐Ÿคฎ','๐Ÿคง','๐Ÿฅด','๐Ÿ˜‡','๐Ÿฅณ','๐Ÿฅบ','๐Ÿค ','๐Ÿคก','๐Ÿคฅ','๐Ÿคซ','๐Ÿคญ','๐Ÿง','๐Ÿค“', - '๐Ÿ˜ˆ','๐Ÿ‘ฟ','๐Ÿ‘น','๐Ÿ‘บ','๐Ÿ’€','โ˜ ๏ธ','๐Ÿ‘ป','๐Ÿ‘ฝ','๐Ÿ‘พ','๐Ÿค–','๐Ÿ˜บ','๐Ÿ˜ธ','๐Ÿ˜น','๐Ÿ˜ป','๐Ÿ˜ผ','๐Ÿ˜ฝ','๐Ÿ™€','๐Ÿ˜ฟ','๐Ÿ˜พ', + '๐Ÿ˜€', '๐Ÿ˜', '๐Ÿ˜‚', '๐Ÿคฃ', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜…', '๐Ÿ˜†', '๐Ÿ˜‰', '๐Ÿ˜Š', '๐Ÿ˜‹', '๐Ÿ˜Ž', '๐Ÿ˜', '๐Ÿ˜˜', '๐Ÿฅฐ', '๐Ÿ˜—', '๐Ÿ˜™', '๐Ÿ˜š', + '๐Ÿ™‚', '๐Ÿค—', '๐Ÿคฉ', '๐Ÿค”', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ™„', '๐Ÿ˜', '๐Ÿ˜ฃ', '๐Ÿ˜ฅ', '๐Ÿ˜ฎ', '๐Ÿค', '๐Ÿ˜ฏ', '๐Ÿ˜ช', '๐Ÿ˜ซ', '๐Ÿฅฑ', + '๐Ÿ˜ด', '๐Ÿ˜Œ', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿ˜', '๐Ÿคค', '๐Ÿ˜’', '๐Ÿ˜“', '๐Ÿ˜”', '๐Ÿ˜•', '๐Ÿ™ƒ', '๐Ÿค‘', '๐Ÿ˜ฒ', 'โ˜น๏ธ', '๐Ÿ™', '๐Ÿ˜–', '๐Ÿ˜ž', '๐Ÿ˜Ÿ', + '๐Ÿ˜ค', '๐Ÿ˜ข', '๐Ÿ˜ญ', '๐Ÿ˜ฆ', '๐Ÿ˜ง', '๐Ÿ˜จ', '๐Ÿ˜ฉ', '๐Ÿคฏ', '๐Ÿ˜ฌ', '๐Ÿ˜ฐ', '๐Ÿ˜ฑ', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿ˜ณ', '๐Ÿคช', '๐Ÿ˜ต', '๐Ÿ˜ก', '๐Ÿ˜ ', + '๐Ÿคฌ', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•', '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅด', '๐Ÿ˜‡', '๐Ÿฅณ', '๐Ÿฅบ', '๐Ÿค ', '๐Ÿคก', '๐Ÿคฅ', '๐Ÿคซ', '๐Ÿคญ', '๐Ÿง', '๐Ÿค“', + '๐Ÿ˜ˆ', '๐Ÿ‘ฟ', '๐Ÿ‘น', '๐Ÿ‘บ', '๐Ÿ’€', 'โ˜ ๏ธ', '๐Ÿ‘ป', '๐Ÿ‘ฝ', '๐Ÿ‘พ', '๐Ÿค–', '๐Ÿ˜บ', '๐Ÿ˜ธ', '๐Ÿ˜น', '๐Ÿ˜ป', '๐Ÿ˜ผ', '๐Ÿ˜ฝ', '๐Ÿ™€', '๐Ÿ˜ฟ', '๐Ÿ˜พ', ], People: [ - '๐Ÿ‘‹','๐Ÿคš','๐Ÿ–๏ธ','โœ‹','๐Ÿ––','๐Ÿ‘Œ','๐ŸคŒ','๐Ÿค','โœŒ๏ธ','๐Ÿคž','๐ŸคŸ','๐Ÿค˜','๐Ÿค™','๐Ÿ‘ˆ','๐Ÿ‘‰','๐Ÿ‘†','๐Ÿ–•','๐Ÿ‘‡', - 'โ˜๏ธ','๐Ÿ‘','๐Ÿ‘Ž','โœŠ','๐Ÿ‘Š','๐Ÿค›','๐Ÿคœ','๐Ÿ‘','๐Ÿ™Œ','๐Ÿ‘','๐Ÿคฒ','๐Ÿค','๐Ÿ™','โœ๏ธ','๐Ÿ’…','๐Ÿคณ','๐Ÿ’ช','๐Ÿฆพ', - '๐Ÿฆฟ','๐Ÿฆต','๐Ÿฆถ','๐Ÿ‘‚','๐Ÿฆป','๐Ÿ‘ƒ','๐Ÿซ€','๐Ÿซ','๐Ÿง ','๐Ÿฆท','๐Ÿฆด','๐Ÿ‘€','๐Ÿ‘๏ธ','๐Ÿ‘…','๐Ÿ‘„','๐Ÿซฆ','๐Ÿ‘ถ','๐Ÿง’', - '๐Ÿ‘ฆ','๐Ÿ‘ง','๐Ÿง‘','๐Ÿ‘ฑ','๐Ÿ‘จ','๐Ÿง”','๐Ÿ‘ฉ','๐Ÿง“','๐Ÿ‘ด','๐Ÿ‘ต','๐Ÿ™','๐Ÿ™Ž','๐Ÿ™…','๐Ÿ™†','๐Ÿ’','๐Ÿ™‹','๐Ÿง','๐Ÿ™‡', - '๐Ÿคฆ','๐Ÿคท','๐Ÿ‘ฎ','๐Ÿ•ต๏ธ','๐Ÿ’‚','๐Ÿฅท','๐Ÿ‘ท','๐Ÿซ…','๐Ÿคด','๐Ÿ‘ธ','๐Ÿ‘ฒ','๐Ÿง•','๐Ÿคต','๐Ÿ‘ฐ','๐Ÿคฐ','๐Ÿซƒ','๐Ÿซ„','๐Ÿคฑ', - '๐Ÿ‘ผ','๐ŸŽ…','๐Ÿคถ','๐Ÿง‘โ€๐ŸŽ„','๐Ÿฆธ','๐Ÿฆน','๐Ÿง™','๐Ÿง','๐Ÿง›','๐ŸงŸ','๐Ÿงž','๐Ÿงœ','๐Ÿงš','๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘','๐Ÿ‘ซ','๐Ÿ‘ฌ','๐Ÿ‘ญ','๐Ÿ’','๐Ÿ’‘','๐Ÿ‘ช', + '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐ŸคŒ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž', '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', + 'โ˜๏ธ', '๐Ÿ‘', '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค', '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', '๐Ÿฆพ', + '๐Ÿฆฟ', '๐Ÿฆต', '๐Ÿฆถ', '๐Ÿ‘‚', '๐Ÿฆป', '๐Ÿ‘ƒ', '๐Ÿซ€', '๐Ÿซ', '๐Ÿง ', '๐Ÿฆท', '๐Ÿฆด', '๐Ÿ‘€', '๐Ÿ‘๏ธ', '๐Ÿ‘…', '๐Ÿ‘„', '๐Ÿซฆ', '๐Ÿ‘ถ', '๐Ÿง’', + '๐Ÿ‘ฆ', '๐Ÿ‘ง', '๐Ÿง‘', '๐Ÿ‘ฑ', '๐Ÿ‘จ', '๐Ÿง”', '๐Ÿ‘ฉ', '๐Ÿง“', '๐Ÿ‘ด', '๐Ÿ‘ต', '๐Ÿ™', '๐Ÿ™Ž', '๐Ÿ™…', '๐Ÿ™†', '๐Ÿ’', '๐Ÿ™‹', '๐Ÿง', '๐Ÿ™‡', + '๐Ÿคฆ', '๐Ÿคท', '๐Ÿ‘ฎ', '๐Ÿ•ต๏ธ', '๐Ÿ’‚', '๐Ÿฅท', '๐Ÿ‘ท', '๐Ÿซ…', '๐Ÿคด', '๐Ÿ‘ธ', '๐Ÿ‘ฒ', '๐Ÿง•', '๐Ÿคต', '๐Ÿ‘ฐ', '๐Ÿคฐ', '๐Ÿซƒ', '๐Ÿซ„', '๐Ÿคฑ', + '๐Ÿ‘ผ', '๐ŸŽ…', '๐Ÿคถ', '๐Ÿง‘โ€๐ŸŽ„', '๐Ÿฆธ', '๐Ÿฆน', '๐Ÿง™', '๐Ÿง', '๐Ÿง›', '๐ŸงŸ', '๐Ÿงž', '๐Ÿงœ', '๐Ÿงš', '๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘', '๐Ÿ‘ซ', '๐Ÿ‘ฌ', '๐Ÿ‘ญ', '๐Ÿ’', '๐Ÿ’‘', '๐Ÿ‘ช', ], Animals: [ - '๐Ÿถ','๐Ÿฑ','๐Ÿญ','๐Ÿน','๐Ÿฐ','๐ŸฆŠ','๐Ÿป','๐Ÿผ','๐Ÿปโ€โ„๏ธ','๐Ÿจ','๐Ÿฏ','๐Ÿฆ','๐Ÿฎ','๐Ÿท','๐Ÿธ','๐Ÿต','๐Ÿ™ˆ','๐Ÿ™‰', - '๐Ÿ™Š','๐Ÿ’','๐Ÿฆ†','๐Ÿฆ…','๐Ÿฆ‰','๐Ÿฆ‡','๐Ÿ','๐Ÿชฑ','๐Ÿ›','๐Ÿฆ‹','๐ŸŒ','๐Ÿž','๐Ÿœ','๐Ÿชฒ','๐Ÿฆ—','๐Ÿชณ','๐Ÿ•ท๏ธ','๐Ÿฆ‚', - '๐Ÿข','๐Ÿ','๐ŸฆŽ','๐Ÿฆ–','๐Ÿฆ•','๐Ÿ™','๐Ÿฆ‘','๐Ÿฆ','๐Ÿฆž','๐Ÿฆ€','๐Ÿก','๐Ÿ ','๐ŸŸ','๐Ÿฌ','๐Ÿณ','๐Ÿ‹','๐Ÿฆˆ','๐Ÿฆญ', - '๐ŸŠ','๐Ÿ…','๐Ÿ†','๐Ÿฆ“','๐Ÿฆ','๐Ÿฆง','๐Ÿฆฃ','๐Ÿ˜','๐Ÿฆ›','๐Ÿฆ','๐Ÿช','๐Ÿซ','๐Ÿฆ’','๐Ÿฆ˜','๐Ÿฆฌ','๐Ÿƒ','๐Ÿ‚','๐Ÿ„', - '๐ŸŽ','๐Ÿ–','๐Ÿ','๐Ÿ‘','๐Ÿฆ™','๐Ÿ','๐ŸฆŒ','๐Ÿ•','๐Ÿฉ','๐Ÿฆฎ','๐Ÿ•โ€๐Ÿฆบ','๐Ÿˆ','๐Ÿˆโ€โฌ›','๐Ÿ“','๐Ÿฆƒ','๐Ÿฆค','๐Ÿฆš','๐Ÿฆœ', - '๐Ÿฆข','๐Ÿฆฉ','๐Ÿ•Š๏ธ','๐Ÿ‡','๐Ÿฆ','๐Ÿฆจ','๐Ÿฆก','๐Ÿฆซ','๐Ÿฆฆ','๐Ÿฆฅ','๐Ÿ','๐Ÿ€','๐Ÿฟ๏ธ','๐Ÿฆ”','๐Ÿพ','๐Ÿ‰','๐Ÿฒ','๐ŸŒต', + '๐Ÿถ', '๐Ÿฑ', '๐Ÿญ', '๐Ÿน', '๐Ÿฐ', '๐ŸฆŠ', '๐Ÿป', '๐Ÿผ', '๐Ÿปโ€โ„๏ธ', '๐Ÿจ', '๐Ÿฏ', '๐Ÿฆ', '๐Ÿฎ', '๐Ÿท', '๐Ÿธ', '๐Ÿต', '๐Ÿ™ˆ', '๐Ÿ™‰', + '๐Ÿ™Š', '๐Ÿ’', '๐Ÿฆ†', '๐Ÿฆ…', '๐Ÿฆ‰', '๐Ÿฆ‡', '๐Ÿ', '๐Ÿชฑ', '๐Ÿ›', '๐Ÿฆ‹', '๐ŸŒ', '๐Ÿž', '๐Ÿœ', '๐Ÿชฒ', '๐Ÿฆ—', '๐Ÿชณ', '๐Ÿ•ท๏ธ', '๐Ÿฆ‚', + '๐Ÿข', '๐Ÿ', '๐ŸฆŽ', '๐Ÿฆ–', '๐Ÿฆ•', '๐Ÿ™', '๐Ÿฆ‘', '๐Ÿฆ', '๐Ÿฆž', '๐Ÿฆ€', '๐Ÿก', '๐Ÿ ', '๐ŸŸ', '๐Ÿฌ', '๐Ÿณ', '๐Ÿ‹', '๐Ÿฆˆ', '๐Ÿฆญ', + '๐ŸŠ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฆ“', '๐Ÿฆ', '๐Ÿฆง', '๐Ÿฆฃ', '๐Ÿ˜', '๐Ÿฆ›', '๐Ÿฆ', '๐Ÿช', '๐Ÿซ', '๐Ÿฆ’', '๐Ÿฆ˜', '๐Ÿฆฌ', '๐Ÿƒ', '๐Ÿ‚', '๐Ÿ„', + '๐ŸŽ', '๐Ÿ–', '๐Ÿ', '๐Ÿ‘', '๐Ÿฆ™', '๐Ÿ', '๐ŸฆŒ', '๐Ÿ•', '๐Ÿฉ', '๐Ÿฆฎ', '๐Ÿ•โ€๐Ÿฆบ', '๐Ÿˆ', '๐Ÿˆโ€โฌ›', '๐Ÿ“', '๐Ÿฆƒ', '๐Ÿฆค', '๐Ÿฆš', '๐Ÿฆœ', + '๐Ÿฆข', '๐Ÿฆฉ', '๐Ÿ•Š๏ธ', '๐Ÿ‡', '๐Ÿฆ', '๐Ÿฆจ', '๐Ÿฆก', '๐Ÿฆซ', '๐Ÿฆฆ', '๐Ÿฆฅ', '๐Ÿ', '๐Ÿ€', '๐Ÿฟ๏ธ', '๐Ÿฆ”', '๐Ÿพ', '๐Ÿ‰', '๐Ÿฒ', '๐ŸŒต', ], Food: [ - '๐ŸŽ','๐ŸŠ','๐Ÿ‹','๐ŸŒ','๐Ÿ','๐Ÿฅญ','๐Ÿ“','๐Ÿ’','๐Ÿ‘','๐Ÿฅ','๐Ÿ…','๐Ÿฅฅ','๐Ÿฅ‘','๐Ÿ†','๐Ÿฅ”','๐Ÿฅ•','๐ŸŒฝ','๐ŸŒถ๏ธ', - '๐Ÿซ‘','๐Ÿฅ’','๐Ÿฅฌ','๐Ÿฅฆ','๐Ÿง„','๐Ÿง…','๐Ÿ„','๐Ÿฅœ','๐ŸŒฐ','๐Ÿž','๐Ÿฅ','๐Ÿฅ–','๐Ÿซ“','๐Ÿฅจ','๐Ÿง€','๐Ÿฅš','๐Ÿณ','๐Ÿงˆ', - '๐Ÿฅž','๐Ÿง‡','๐Ÿฅ“','๐Ÿฅฉ','๐Ÿ—','๐Ÿ–','๐Ÿฆด','๐ŸŒญ','๐Ÿ”','๐ŸŸ','๐Ÿ•','๐Ÿซ”','๐ŸŒฎ','๐ŸŒฏ','๐Ÿฅ™','๐Ÿง†','๐Ÿฅš','๐Ÿฑ', - '๐Ÿ˜','๐Ÿ™','๐Ÿš','๐Ÿ›','๐Ÿœ','๐Ÿ','๐Ÿ ','๐Ÿข','๐Ÿฃ','๐Ÿค','๐Ÿฅ','๐Ÿฅฎ','๐Ÿก','๐ŸฅŸ','๐Ÿฅ ','๐Ÿฅก','๐Ÿฆช','๐Ÿฆ', - '๐Ÿง','๐Ÿจ','๐Ÿฉ','๐Ÿช','๐ŸŽ‚','๐Ÿฐ','๐Ÿง','๐Ÿฅง','๐Ÿซ','๐Ÿฌ','๐Ÿญ','๐Ÿฎ','๐Ÿฏ','๐Ÿผ','๐Ÿฅ›','โ˜•','๐Ÿซ–','๐Ÿต', - '๐Ÿงƒ','๐Ÿฅค','๐Ÿง‹','๐Ÿถ','๐Ÿบ','๐Ÿป','๐Ÿฅ‚','๐Ÿท','๐Ÿฅƒ','๐Ÿธ','๐Ÿน','๐Ÿง‰','๐Ÿพ','๐ŸงŠ','๐Ÿฅ„','๐Ÿด','๐Ÿฝ๏ธ','๐Ÿฅข', + '๐ŸŽ', '๐ŸŠ', '๐Ÿ‹', '๐ŸŒ', '๐Ÿ', '๐Ÿฅญ', '๐Ÿ“', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ…', '๐Ÿฅฅ', '๐Ÿฅ‘', '๐Ÿ†', '๐Ÿฅ”', '๐Ÿฅ•', '๐ŸŒฝ', '๐ŸŒถ๏ธ', + '๐Ÿซ‘', '๐Ÿฅ’', '๐Ÿฅฌ', '๐Ÿฅฆ', '๐Ÿง„', '๐Ÿง…', '๐Ÿ„', '๐Ÿฅœ', '๐ŸŒฐ', '๐Ÿž', '๐Ÿฅ', '๐Ÿฅ–', '๐Ÿซ“', '๐Ÿฅจ', '๐Ÿง€', '๐Ÿฅš', '๐Ÿณ', '๐Ÿงˆ', + '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฅ“', '๐Ÿฅฉ', '๐Ÿ—', '๐Ÿ–', '๐Ÿฆด', '๐ŸŒญ', '๐Ÿ”', '๐ŸŸ', '๐Ÿ•', '๐Ÿซ”', '๐ŸŒฎ', '๐ŸŒฏ', '๐Ÿฅ™', '๐Ÿง†', '๐Ÿฅš', '๐Ÿฑ', + '๐Ÿ˜', '๐Ÿ™', '๐Ÿš', '๐Ÿ›', '๐Ÿœ', '๐Ÿ', '๐Ÿ ', '๐Ÿข', '๐Ÿฃ', '๐Ÿค', '๐Ÿฅ', '๐Ÿฅฎ', '๐Ÿก', '๐ŸฅŸ', '๐Ÿฅ ', '๐Ÿฅก', '๐Ÿฆช', '๐Ÿฆ', + '๐Ÿง', '๐Ÿจ', '๐Ÿฉ', '๐Ÿช', '๐ŸŽ‚', '๐Ÿฐ', '๐Ÿง', '๐Ÿฅง', '๐Ÿซ', '๐Ÿฌ', '๐Ÿญ', '๐Ÿฎ', '๐Ÿฏ', '๐Ÿผ', '๐Ÿฅ›', 'โ˜•', '๐Ÿซ–', '๐Ÿต', + '๐Ÿงƒ', '๐Ÿฅค', '๐Ÿง‹', '๐Ÿถ', '๐Ÿบ', '๐Ÿป', '๐Ÿฅ‚', '๐Ÿท', '๐Ÿฅƒ', '๐Ÿธ', '๐Ÿน', '๐Ÿง‰', '๐Ÿพ', '๐ŸงŠ', '๐Ÿฅ„', '๐Ÿด', '๐Ÿฝ๏ธ', '๐Ÿฅข', ], Travel: [ - '๐Ÿš—','๐Ÿš•','๐Ÿš™','๐ŸšŒ','๐ŸšŽ','๐ŸŽ๏ธ','๐Ÿš“','๐Ÿš‘','๐Ÿš’','๐Ÿš','๐Ÿ›ป','๐Ÿšš','๐Ÿš›','๐Ÿšœ','๐Ÿฆฏ','๐Ÿฆฝ','๐Ÿฆผ','๐Ÿ›บ', - '๐Ÿšฒ','๐Ÿ›ด','๐Ÿ›ต','๐Ÿ๏ธ','๐Ÿ›บ','๐Ÿšจ','๐Ÿš”','๐Ÿš','๐Ÿš˜','๐Ÿš–','๐Ÿšก','๐Ÿš ','๐ŸšŸ','๐Ÿšƒ','๐Ÿš‹','๐Ÿšž','๐Ÿš','๐Ÿš„', - '๐Ÿš…','๐Ÿšˆ','๐Ÿš‚','๐Ÿš†','๐Ÿš‡','๐ŸšŠ','๐Ÿš‰','โœˆ๏ธ','๐Ÿ›ซ','๐Ÿ›ฌ','๐Ÿ›ฉ๏ธ','๐Ÿ’บ','๐Ÿ›ธ','๐Ÿš','๐Ÿ›ถ','โ›ต','๐Ÿšค','๐Ÿ›ฅ๏ธ', - '๐Ÿ›ณ๏ธ','โ›ด๏ธ','๐Ÿšข','โš“','๐Ÿ—บ๏ธ','๐Ÿงญ','๐Ÿ”๏ธ','โ›ฐ๏ธ','๐ŸŒ‹','๐Ÿ—ป','๐Ÿ•๏ธ','๐Ÿ–๏ธ','๐Ÿœ๏ธ','๐Ÿ๏ธ','๐Ÿž๏ธ','๐ŸŸ๏ธ','๐Ÿ›๏ธ','๐Ÿ—๏ธ', - '๐Ÿงฑ','๐Ÿชจ','๐Ÿชต','๐Ÿ›–','๐Ÿ˜๏ธ','๐Ÿš๏ธ','๐Ÿ ','๐Ÿก','๐Ÿข','๐Ÿฃ','๐Ÿค','๐Ÿฅ','๐Ÿฆ','๐Ÿจ','๐Ÿฉ','๐Ÿช','๐Ÿซ','๐Ÿฌ', - '๐Ÿญ','๐Ÿฏ','๐Ÿฐ','๐Ÿ’’','๐Ÿ—ผ','๐Ÿ—ฝ','โ›ช','๐Ÿ•Œ','๐Ÿ›•','๐Ÿ•','โ›ฉ๏ธ','๐Ÿ•‹','โ›ฒ','โ›บ','๐ŸŒ','๐ŸŒƒ','๐Ÿ™๏ธ','๐ŸŒ„', + '๐Ÿš—', '๐Ÿš•', '๐Ÿš™', '๐ŸšŒ', '๐ŸšŽ', '๐ŸŽ๏ธ', '๐Ÿš“', '๐Ÿš‘', '๐Ÿš’', '๐Ÿš', '๐Ÿ›ป', '๐Ÿšš', '๐Ÿš›', '๐Ÿšœ', '๐Ÿฆฏ', '๐Ÿฆฝ', '๐Ÿฆผ', '๐Ÿ›บ', + '๐Ÿšฒ', '๐Ÿ›ด', '๐Ÿ›ต', '๐Ÿ๏ธ', '๐Ÿ›บ', '๐Ÿšจ', '๐Ÿš”', '๐Ÿš', '๐Ÿš˜', '๐Ÿš–', '๐Ÿšก', '๐Ÿš ', '๐ŸšŸ', '๐Ÿšƒ', '๐Ÿš‹', '๐Ÿšž', '๐Ÿš', '๐Ÿš„', + '๐Ÿš…', '๐Ÿšˆ', '๐Ÿš‚', '๐Ÿš†', '๐Ÿš‡', '๐ŸšŠ', '๐Ÿš‰', 'โœˆ๏ธ', '๐Ÿ›ซ', '๐Ÿ›ฌ', '๐Ÿ›ฉ๏ธ', '๐Ÿ’บ', '๐Ÿ›ธ', '๐Ÿš', '๐Ÿ›ถ', 'โ›ต', '๐Ÿšค', '๐Ÿ›ฅ๏ธ', + '๐Ÿ›ณ๏ธ', 'โ›ด๏ธ', '๐Ÿšข', 'โš“', '๐Ÿ—บ๏ธ', '๐Ÿงญ', '๐Ÿ”๏ธ', 'โ›ฐ๏ธ', '๐ŸŒ‹', '๐Ÿ—ป', '๐Ÿ•๏ธ', '๐Ÿ–๏ธ', '๐Ÿœ๏ธ', '๐Ÿ๏ธ', '๐Ÿž๏ธ', '๐ŸŸ๏ธ', '๐Ÿ›๏ธ', '๐Ÿ—๏ธ', + '๐Ÿงฑ', '๐Ÿชจ', '๐Ÿชต', '๐Ÿ›–', '๐Ÿ˜๏ธ', '๐Ÿš๏ธ', '๐Ÿ ', '๐Ÿก', '๐Ÿข', '๐Ÿฃ', '๐Ÿค', '๐Ÿฅ', '๐Ÿฆ', '๐Ÿจ', '๐Ÿฉ', '๐Ÿช', '๐Ÿซ', '๐Ÿฌ', + '๐Ÿญ', '๐Ÿฏ', '๐Ÿฐ', '๐Ÿ’’', '๐Ÿ—ผ', '๐Ÿ—ฝ', 'โ›ช', '๐Ÿ•Œ', '๐Ÿ›•', '๐Ÿ•', 'โ›ฉ๏ธ', '๐Ÿ•‹', 'โ›ฒ', 'โ›บ', '๐ŸŒ', '๐ŸŒƒ', '๐Ÿ™๏ธ', '๐ŸŒ„', ], Activities: [ - 'โšฝ','๐Ÿ€','๐Ÿˆ','โšพ','๐ŸฅŽ','๐ŸŽพ','๐Ÿ','๐Ÿ‰','๐Ÿฅ','๐ŸŽฑ','๐Ÿ“','๐Ÿธ','๐Ÿ’','๐Ÿ‘','๐Ÿฅ','๐Ÿ','๐Ÿชƒ','๐Ÿฅ…', - 'โ›ณ','๐Ÿช','๐Ÿ›','๐Ÿน','๐ŸŽฃ','๐Ÿคฟ','๐ŸฅŠ','๐Ÿฅ‹','๐ŸŽฝ','๐Ÿ›น','๐Ÿ›ท','โ›ธ๏ธ','๐ŸฅŒ','๐ŸŽฟ','โ›ท๏ธ','๐Ÿ‚','๐Ÿช‚','๐Ÿ‹๏ธ', - '๐Ÿคผ','๐Ÿคธ','โ›น๏ธ','๐Ÿคบ','๐Ÿ‡','๐Ÿง˜','๐Ÿ„','๐ŸŠ','๐Ÿคฝ','๐Ÿšฃ','๐Ÿง—','๐Ÿšต','๐Ÿšด','๐Ÿ†','๐Ÿฅ‡','๐Ÿฅˆ','๐Ÿฅ‰','๐Ÿ…', - '๐ŸŽ–๏ธ','๐Ÿต๏ธ','๐ŸŽ—๏ธ','๐ŸŽซ','๐ŸŽŸ๏ธ','๐ŸŽช','๐Ÿคน','๐ŸŽญ','๐Ÿฉฐ','๐ŸŽจ','๐Ÿ–ผ๏ธ','๐ŸŽฐ','๐ŸŽฒ','๐Ÿงฉ','๐Ÿช„','๐ŸŽฏ','๐Ÿช…','๐ŸŽฎ', - '๐Ÿ•น๏ธ','๐ŸŽณ','๐ŸŽป','๐ŸŽท','๐Ÿฅ','๐Ÿช˜','๐ŸŽบ','๐ŸŽธ','๐Ÿช—','๐ŸŽน','๐ŸŽต','๐ŸŽถ','๐ŸŽผ','๐ŸŽค','๐ŸŽง','๐Ÿ“ป','๐ŸŽ™๏ธ','๐ŸŽš๏ธ', - '๐ŸŽฌ','๐Ÿ“ฝ๏ธ','๐ŸŽž๏ธ','๐Ÿ“ฑ','๐Ÿ“ฒ','โ˜Ž๏ธ','๐Ÿ“ž','๐Ÿ“Ÿ','๐Ÿ“ ','๐Ÿ”‹','๐Ÿชซ','๐Ÿ”Œ','๐Ÿ’ก','๐Ÿ”ฆ','๐Ÿ•ฏ๏ธ','๐Ÿ’ธ','๐Ÿ’ต','๐Ÿช™', + 'โšฝ', '๐Ÿ€', '๐Ÿˆ', 'โšพ', '๐ŸฅŽ', '๐ŸŽพ', '๐Ÿ', '๐Ÿ‰', '๐Ÿฅ', '๐ŸŽฑ', '๐Ÿ“', '๐Ÿธ', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ', '๐Ÿชƒ', '๐Ÿฅ…', + 'โ›ณ', '๐Ÿช', '๐Ÿ›', '๐Ÿน', '๐ŸŽฃ', '๐Ÿคฟ', '๐ŸฅŠ', '๐Ÿฅ‹', '๐ŸŽฝ', '๐Ÿ›น', '๐Ÿ›ท', 'โ›ธ๏ธ', '๐ŸฅŒ', '๐ŸŽฟ', 'โ›ท๏ธ', '๐Ÿ‚', '๐Ÿช‚', '๐Ÿ‹๏ธ', + '๐Ÿคผ', '๐Ÿคธ', 'โ›น๏ธ', '๐Ÿคบ', '๐Ÿ‡', '๐Ÿง˜', '๐Ÿ„', '๐ŸŠ', '๐Ÿคฝ', '๐Ÿšฃ', '๐Ÿง—', '๐Ÿšต', '๐Ÿšด', '๐Ÿ†', '๐Ÿฅ‡', '๐Ÿฅˆ', '๐Ÿฅ‰', '๐Ÿ…', + '๐ŸŽ–๏ธ', '๐Ÿต๏ธ', '๐ŸŽ—๏ธ', '๐ŸŽซ', '๐ŸŽŸ๏ธ', '๐ŸŽช', '๐Ÿคน', '๐ŸŽญ', '๐Ÿฉฐ', '๐ŸŽจ', '๐Ÿ–ผ๏ธ', '๐ŸŽฐ', '๐ŸŽฒ', '๐Ÿงฉ', '๐Ÿช„', '๐ŸŽฏ', '๐Ÿช…', '๐ŸŽฎ', + '๐Ÿ•น๏ธ', '๐ŸŽณ', '๐ŸŽป', '๐ŸŽท', '๐Ÿฅ', '๐Ÿช˜', '๐ŸŽบ', '๐ŸŽธ', '๐Ÿช—', '๐ŸŽน', '๐ŸŽต', '๐ŸŽถ', '๐ŸŽผ', '๐ŸŽค', '๐ŸŽง', '๐Ÿ“ป', '๐ŸŽ™๏ธ', '๐ŸŽš๏ธ', + '๐ŸŽฌ', '๐Ÿ“ฝ๏ธ', '๐ŸŽž๏ธ', '๐Ÿ“ฑ', '๐Ÿ“ฒ', 'โ˜Ž๏ธ', '๐Ÿ“ž', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ”‹', '๐Ÿชซ', '๐Ÿ”Œ', '๐Ÿ’ก', '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿ’ธ', '๐Ÿ’ต', '๐Ÿช™', ], Objects: [ - 'โŒš','๐Ÿ“ฑ','๐Ÿ“ฒ','๐Ÿ’ป','โŒจ๏ธ','๐Ÿ–ฅ๏ธ','๐Ÿ–จ๏ธ','๐Ÿ–ฑ๏ธ','๐Ÿ–ฒ๏ธ','๐Ÿ’พ','๐Ÿ’ฟ','๐Ÿ“€','๐Ÿงฎ','๐Ÿ“ท','๐Ÿ“ธ','๐Ÿ“น','๐ŸŽฅ','๐Ÿ“ฝ๏ธ', - '๐Ÿ“ž','โ˜Ž๏ธ','๐Ÿ“Ÿ','๐Ÿ“ ','๐Ÿ“บ','๐Ÿ“ป','๐Ÿงญ','โฑ๏ธ','โฒ๏ธ','โฐ','๐Ÿ•ฐ๏ธ','โŒ›','โณ','๐Ÿ“ก','๐Ÿ”‹','๐Ÿชซ','๐Ÿ”Œ','๐Ÿ’ก', - '๐Ÿ”ฆ','๐Ÿ•ฏ๏ธ','๐Ÿช”','๐Ÿงฑ','๐Ÿ’ฐ','๐Ÿ’ด','๐Ÿ’ต','๐Ÿ’ถ','๐Ÿ’ท','๐Ÿ’ธ','๐Ÿ’ณ','๐Ÿช™','๐Ÿ’น','โœ‰๏ธ','๐Ÿ“ง','๐Ÿ“จ','๐Ÿ“ฉ','๐Ÿ“ค', - '๐Ÿ“ฅ','๐Ÿ“ฆ','๐Ÿ“ซ','๐Ÿ“ช','๐Ÿ“ฌ','๐Ÿ“ญ','๐Ÿ“ฎ','๐Ÿ—ณ๏ธ','โœ๏ธ','โœ’๏ธ','๐Ÿ–Š๏ธ','๐Ÿ–‹๏ธ','๐Ÿ“','๐Ÿ“','๐Ÿ“‚','๐Ÿ—‚๏ธ','๐Ÿ“…','๐Ÿ“†', - '๐Ÿ—’๏ธ','๐Ÿ—“๏ธ','๐Ÿ“‡','๐Ÿ“ˆ','๐Ÿ“‰','๐Ÿ“Š','๐Ÿ“‹','๐Ÿ“Œ','๐Ÿ“','๐Ÿ—บ๏ธ','๐Ÿ“','๐Ÿ“','โœ‚๏ธ','๐Ÿ—ƒ๏ธ','๐Ÿ—„๏ธ','๐Ÿ—‘๏ธ','๐Ÿ”’','๐Ÿ”“', - '๐Ÿ”','๐Ÿ”','๐Ÿ”‘','๐Ÿ—๏ธ','๐Ÿ”จ','๐Ÿช“','โ›๏ธ','โš’๏ธ','๐Ÿ› ๏ธ','๐Ÿ—ก๏ธ','โš”๏ธ','๐Ÿ”ซ','๐Ÿชƒ','๐Ÿน','๐Ÿ›ก๏ธ','๐Ÿชš','๐Ÿ”ง','๐Ÿช›', + 'โŒš', '๐Ÿ“ฑ', '๐Ÿ“ฒ', '๐Ÿ’ป', 'โŒจ๏ธ', '๐Ÿ–ฅ๏ธ', '๐Ÿ–จ๏ธ', '๐Ÿ–ฑ๏ธ', '๐Ÿ–ฒ๏ธ', '๐Ÿ’พ', '๐Ÿ’ฟ', '๐Ÿ“€', '๐Ÿงฎ', '๐Ÿ“ท', '๐Ÿ“ธ', '๐Ÿ“น', '๐ŸŽฅ', '๐Ÿ“ฝ๏ธ', + '๐Ÿ“ž', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ“บ', '๐Ÿ“ป', '๐Ÿงญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐Ÿ•ฐ๏ธ', 'โŒ›', 'โณ', '๐Ÿ“ก', '๐Ÿ”‹', '๐Ÿชซ', '๐Ÿ”Œ', '๐Ÿ’ก', + '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿช”', '๐Ÿงฑ', '๐Ÿ’ฐ', '๐Ÿ’ด', '๐Ÿ’ต', '๐Ÿ’ถ', '๐Ÿ’ท', '๐Ÿ’ธ', '๐Ÿ’ณ', '๐Ÿช™', '๐Ÿ’น', 'โœ‰๏ธ', '๐Ÿ“ง', '๐Ÿ“จ', '๐Ÿ“ฉ', '๐Ÿ“ค', + '๐Ÿ“ฅ', '๐Ÿ“ฆ', '๐Ÿ“ซ', '๐Ÿ“ช', '๐Ÿ“ฌ', '๐Ÿ“ญ', '๐Ÿ“ฎ', '๐Ÿ—ณ๏ธ', 'โœ๏ธ', 'โœ’๏ธ', '๐Ÿ–Š๏ธ', '๐Ÿ–‹๏ธ', '๐Ÿ“', '๐Ÿ“', '๐Ÿ“‚', '๐Ÿ—‚๏ธ', '๐Ÿ“…', '๐Ÿ“†', + '๐Ÿ—’๏ธ', '๐Ÿ—“๏ธ', '๐Ÿ“‡', '๐Ÿ“ˆ', '๐Ÿ“‰', '๐Ÿ“Š', '๐Ÿ“‹', '๐Ÿ“Œ', '๐Ÿ“', '๐Ÿ—บ๏ธ', '๐Ÿ“', '๐Ÿ“', 'โœ‚๏ธ', '๐Ÿ—ƒ๏ธ', '๐Ÿ—„๏ธ', '๐Ÿ—‘๏ธ', '๐Ÿ”’', '๐Ÿ”“', + '๐Ÿ”', '๐Ÿ”', '๐Ÿ”‘', '๐Ÿ—๏ธ', '๐Ÿ”จ', '๐Ÿช“', 'โ›๏ธ', 'โš’๏ธ', '๐Ÿ› ๏ธ', '๐Ÿ—ก๏ธ', 'โš”๏ธ', '๐Ÿ”ซ', '๐Ÿชƒ', '๐Ÿน', '๐Ÿ›ก๏ธ', '๐Ÿชš', '๐Ÿ”ง', '๐Ÿช›', ], Symbols: [ - 'โค๏ธ','๐Ÿงก','๐Ÿ’›','๐Ÿ’š','๐Ÿ’™','๐Ÿ’œ','๐Ÿ–ค','๐Ÿค','๐ŸคŽ','๐Ÿ’”','โฃ๏ธ','๐Ÿ’•','๐Ÿ’ž','๐Ÿ’“','๐Ÿ’—','๐Ÿ’–','๐Ÿ’˜','๐Ÿ’', - '๐Ÿ’Ÿ','โ˜ฎ๏ธ','โœ๏ธ','โ˜ช๏ธ','๐Ÿ•‰๏ธ','โ˜ธ๏ธ','โœก๏ธ','๐Ÿ”ฏ','๐Ÿ•Ž','โ˜ฏ๏ธ','โ˜ฆ๏ธ','๐Ÿ›','โ›Ž','โ™ˆ','โ™‰','โ™Š','โ™‹','โ™Œ', - 'โ™','โ™Ž','โ™','โ™','โ™‘','โ™’','โ™“','๐Ÿ†”','โš›๏ธ','๐Ÿ‰‘','โ˜ข๏ธ','โ˜ฃ๏ธ','๐Ÿ“ด','๐Ÿ“ณ','๐Ÿˆถ','๐Ÿˆš','๐Ÿˆธ','๐Ÿˆบ', - '๐Ÿˆท๏ธ','โœด๏ธ','๐Ÿ†š','๐Ÿ’ฎ','๐Ÿ‰','ใŠ™๏ธ','ใŠ—๏ธ','๐Ÿˆด','๐Ÿˆต','๐Ÿˆน','๐Ÿˆฒ','๐Ÿ…ฐ๏ธ','๐Ÿ…ฑ๏ธ','๐Ÿ†Ž','๐Ÿ†‘','๐Ÿ…พ๏ธ','๐Ÿ†˜', - 'โŒ','โญ•','๐Ÿ›‘','โ›”','๐Ÿ“›','๐Ÿšซ','๐Ÿ’ฏ','๐Ÿ’ข','โ™จ๏ธ','๐Ÿšท','๐Ÿšฏ','๐Ÿšณ','๐Ÿšฑ','๐Ÿ”ž','๐Ÿ“ต','๐Ÿšญ','โ—','โ•', - 'โ“','โ”','โ€ผ๏ธ','โ‰๏ธ','๐Ÿ”…','๐Ÿ”†','๐Ÿ“ถ','๐Ÿ›œ','๐Ÿ“ณ','๐Ÿ“ด','๐Ÿ”ฑ','๐Ÿ“›','๐Ÿ”ฐ','โ™ป๏ธ','โœ…','๐Ÿˆฏ','๐Ÿ’น','โŽ', - '๐ŸŒ','๐Ÿ’ ','โ“‚๏ธ','๐ŸŒ€','๐Ÿ’ค','๐Ÿง','๐Ÿšพ','โ™ฟ','๐Ÿ…ฟ๏ธ','๐Ÿ›—','๐Ÿˆณ','๐Ÿˆน','๐Ÿšฐ','๐Ÿ”ค','๐Ÿ”ก','๐Ÿ” ','๐Ÿ†–','๐Ÿ†—', - '๐Ÿ†™','๐Ÿ†’','๐Ÿ†•','๐Ÿ†“','๐Ÿ”Ÿ','๐Ÿ“Š','๐Ÿ”ฃ','โœ”๏ธ','โ˜‘๏ธ','๐Ÿ”˜','๐Ÿ”ฒ','๐Ÿ”ณ','โฌ›','โฌœ','โ—ผ๏ธ','โ—ป๏ธ','โ—พ','โ—ฝ', - 'โ–ช๏ธ','โ–ซ๏ธ','๐Ÿ”ถ','๐Ÿ”ท','๐Ÿ”ธ','๐Ÿ”น','๐Ÿ”บ','๐Ÿ”ป','๐Ÿ’ ','๐Ÿ”˜','๐Ÿ”ฒ','๐Ÿ”ณ','๐Ÿ','๐Ÿšฉ','๐ŸŽŒ','๐Ÿด','๐Ÿณ๏ธ','โญ', - '๐ŸŒŸ','๐Ÿ’ซ','โœจ','๐ŸŒˆ','โ˜€๏ธ','๐ŸŒค๏ธ','โ›…','๐ŸŒฅ๏ธ','โ˜๏ธ','๐ŸŒฆ๏ธ','๐ŸŒง๏ธ','โ›ˆ๏ธ','๐ŸŒฉ๏ธ','๐ŸŒจ๏ธ','โ„๏ธ','โ˜ƒ๏ธ','โ›„','๐ŸŒฌ๏ธ', + 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ', '๐Ÿ’”', 'โฃ๏ธ', '๐Ÿ’•', '๐Ÿ’ž', '๐Ÿ’“', '๐Ÿ’—', '๐Ÿ’–', '๐Ÿ’˜', '๐Ÿ’', + '๐Ÿ’Ÿ', 'โ˜ฎ๏ธ', 'โœ๏ธ', 'โ˜ช๏ธ', '๐Ÿ•‰๏ธ', 'โ˜ธ๏ธ', 'โœก๏ธ', '๐Ÿ”ฏ', '๐Ÿ•Ž', 'โ˜ฏ๏ธ', 'โ˜ฆ๏ธ', '๐Ÿ›', 'โ›Ž', 'โ™ˆ', 'โ™‰', 'โ™Š', 'โ™‹', 'โ™Œ', + 'โ™', 'โ™Ž', 'โ™', 'โ™', 'โ™‘', 'โ™’', 'โ™“', '๐Ÿ†”', 'โš›๏ธ', '๐Ÿ‰‘', 'โ˜ข๏ธ', 'โ˜ฃ๏ธ', '๐Ÿ“ด', '๐Ÿ“ณ', '๐Ÿˆถ', '๐Ÿˆš', '๐Ÿˆธ', '๐Ÿˆบ', + '๐Ÿˆท๏ธ', 'โœด๏ธ', '๐Ÿ†š', '๐Ÿ’ฎ', '๐Ÿ‰', 'ใŠ™๏ธ', 'ใŠ—๏ธ', '๐Ÿˆด', '๐Ÿˆต', '๐Ÿˆน', '๐Ÿˆฒ', '๐Ÿ…ฐ๏ธ', '๐Ÿ…ฑ๏ธ', '๐Ÿ†Ž', '๐Ÿ†‘', '๐Ÿ…พ๏ธ', '๐Ÿ†˜', + 'โŒ', 'โญ•', '๐Ÿ›‘', 'โ›”', '๐Ÿ“›', '๐Ÿšซ', '๐Ÿ’ฏ', '๐Ÿ’ข', 'โ™จ๏ธ', '๐Ÿšท', '๐Ÿšฏ', '๐Ÿšณ', '๐Ÿšฑ', '๐Ÿ”ž', '๐Ÿ“ต', '๐Ÿšญ', 'โ—', 'โ•', + 'โ“', 'โ”', 'โ€ผ๏ธ', 'โ‰๏ธ', '๐Ÿ”…', '๐Ÿ”†', '๐Ÿ“ถ', '๐Ÿ›œ', '๐Ÿ“ณ', '๐Ÿ“ด', '๐Ÿ”ฑ', '๐Ÿ“›', '๐Ÿ”ฐ', 'โ™ป๏ธ', 'โœ…', '๐Ÿˆฏ', '๐Ÿ’น', 'โŽ', + '๐ŸŒ', '๐Ÿ’ ', 'โ“‚๏ธ', '๐ŸŒ€', '๐Ÿ’ค', '๐Ÿง', '๐Ÿšพ', 'โ™ฟ', '๐Ÿ…ฟ๏ธ', '๐Ÿ›—', '๐Ÿˆณ', '๐Ÿˆน', '๐Ÿšฐ', '๐Ÿ”ค', '๐Ÿ”ก', '๐Ÿ” ', '๐Ÿ†–', '๐Ÿ†—', + '๐Ÿ†™', '๐Ÿ†’', '๐Ÿ†•', '๐Ÿ†“', '๐Ÿ”Ÿ', '๐Ÿ“Š', '๐Ÿ”ฃ', 'โœ”๏ธ', 'โ˜‘๏ธ', '๐Ÿ”˜', '๐Ÿ”ฒ', '๐Ÿ”ณ', 'โฌ›', 'โฌœ', 'โ—ผ๏ธ', 'โ—ป๏ธ', 'โ—พ', 'โ—ฝ', + 'โ–ช๏ธ', 'โ–ซ๏ธ', '๐Ÿ”ถ', '๐Ÿ”ท', '๐Ÿ”ธ', '๐Ÿ”น', '๐Ÿ”บ', '๐Ÿ”ป', '๐Ÿ’ ', '๐Ÿ”˜', '๐Ÿ”ฒ', '๐Ÿ”ณ', '๐Ÿ', '๐Ÿšฉ', '๐ŸŽŒ', '๐Ÿด', '๐Ÿณ๏ธ', 'โญ', + '๐ŸŒŸ', '๐Ÿ’ซ', 'โœจ', '๐ŸŒˆ', 'โ˜€๏ธ', '๐ŸŒค๏ธ', 'โ›…', '๐ŸŒฅ๏ธ', 'โ˜๏ธ', '๐ŸŒฆ๏ธ', '๐ŸŒง๏ธ', 'โ›ˆ๏ธ', '๐ŸŒฉ๏ธ', '๐ŸŒจ๏ธ', 'โ„๏ธ', 'โ˜ƒ๏ธ', 'โ›„', '๐ŸŒฌ๏ธ', ], }; @@ -115,14 +115,14 @@ const EmojiPicker = () => ({ onclick: () => { ChatHubState.emojiSearch = ''; }, }, m('i.fas.fa-times')), ]), - !search && m('.emoji-categories', EMOJI_CATEGORIES.map(c => + !search && m('.emoji-categories', EMOJI_CATEGORIES.map((c) => m('button.emoji-cat-btn' + (c === cat ? '.active' : ''), { title: c, onclick: () => { ChatHubState.emojiCategory = c; }, }, EMOJI_ICONS[c]) )), m('.emoji-grid', - emojis.map(e => + emojis.map((e) => m('button.emoji-btn', { onclick: () => { insertEmojiIntoTextarea(e, onSelect); diff --git a/webui-src/app/chat/chat_state.js b/webui-src/app/chat/chat_state.js index 4bf1123..2760a63 100644 --- a/webui-src/app/chat/chat_state.js +++ b/webui-src/app/chat/chat_state.js @@ -1,7 +1,5 @@ const m = require('mithril'); const rs = require('rswebui'); -const peopleUtil = require('people/people_util'); -const people = require('people/people'); // **************** utility functions ******************** @@ -35,7 +33,7 @@ function loadDistantChatDetails(pid, apply) { rs.rsJsonApiRequest( '/rsChats/getDistantChatStatus', { - pid: pid, + pid, }, (detail, success) => { if (success && detail.retval) { @@ -118,7 +116,7 @@ function renderChatMessage(rawText) { if (src) { parts.push( m('img.chat-embedded-image', { - src: src, + src, style: { maxWidth: '100%', maxHeight: '300px', @@ -160,7 +158,7 @@ function renderChatMessage(rawText) { if (rawText.trim().startsWith('data:image/')) { const src = rawText.trim(); return m('img.chat-embedded-image', { - src: src, + src, style: { maxWidth: '100%', maxHeight: '300px', @@ -248,7 +246,7 @@ function renderTextWithEmoji(text) { const parts = []; let last = 0; let match; - // eslint-disable-next-line no-cond-assign + while ((match = emojiRegex.exec(text)) !== null) { if (match[0].length === 0) { emojiRegex.lastIndex++; continue; } if (match.index > last) parts.push(text.slice(last, match.index)); @@ -442,8 +440,8 @@ const Message = () => { x: e.clientX, y: e.clientY, messageText: targetText, - username: username, - gxsId: gxsId, + username, + gxsId, }; m.redraw(); }; @@ -581,7 +579,7 @@ const ChatLobbyModel = { loadHistory(id, type) { const chatPeerId = { broadcast_status_peer_id: '00000000000000000000000000000000', - type: type, + type, peer_id: '00000000000000000000000000000000', distant_chat_id: '00000000000000000000000000000000', lobby_id: { xstr64: '0' }, @@ -594,7 +592,7 @@ const ChatLobbyModel = { rs.rsJsonApiRequest( '/rsHistory/getMessages', { - chatPeerId: chatPeerId, + chatPeerId, loadCount: 20, }, (data, success) => { @@ -623,11 +621,11 @@ const ChatLobbyModel = { rs.rsJsonApiRequest( '/rsHistory/getMessages', { - chatPeerId: chatPeerId, + chatPeerId, loadCount: 0, }, (data, success) => { - let msgs = (success && data && data.msgs) ? data.msgs : []; + const msgs = (success && data && data.msgs) ? data.msgs : []; msgs.sort((a, b) => (a.sendTime || a.recvTime) - (b.sendTime || b.recvTime)); ChatHubState.fullHistoryMessages = msgs; ChatHubState.isHistoryLoading = false; @@ -642,7 +640,7 @@ const ChatLobbyModel = { '/rsChats/setIdentityForChatLobby', { lobby_id: { xstr64: lobbyId }, - nick: nick, + nick, }, () => m.route.set('/chat/:lobby', { lobby: lobbyId }), true @@ -685,7 +683,7 @@ const ChatLobbyModel = { const id = this.lastLobbyId || m.route.param('lobby'); const cid = { broadcast_status_peer_id: '00000000000000000000000000000000', - type: type, + type, peer_id: '00000000000000000000000000000000', distant_chat_id: '00000000000000000000000000000000', lobby_id: { xstr64: '0' }, @@ -805,13 +803,13 @@ const ChatLobbyModel = { '/rsChats/sendChat', { id: cid, - msg: msg, + msg, }, (data, success) => { if (success) { const echoMsg = { chat_id: cid, - msg: msg, + msg, sendTime: Math.floor(Date.now() / 1000), lobby_peer_gxs_id: this.currentLobby.gxs_id, }; diff --git a/webui-src/app/config/config_chat.js b/webui-src/app/config/config_chat.js index 6b6714e..6bf8ba1 100644 --- a/webui-src/app/config/config_chat.js +++ b/webui-src/app/config/config_chat.js @@ -10,8 +10,8 @@ const ConfigChat = () => { let maxStorageDays = 10; // History states - let historyEnable = { private: true, distant: true, lobby: true }; - let historySaveCount = { private: 500, distant: 500, lobby: 500 }; + const historyEnable = { private: true, distant: true, lobby: true }; + const historySaveCount = { private: 500, distant: 500, lobby: 500 }; function loadSettings() { // Load Own Identities diff --git a/webui-src/app/config/config_network.js b/webui-src/app/config/config_network.js index 1af47d6..be6ed0d 100644 --- a/webui-src/app/config/config_network.js +++ b/webui-src/app/config/config_network.js @@ -579,8 +579,8 @@ const displayHiddenServiceInfo = () => { details && details.hiddenNodeAddress && m('.hidden-service-info', { style: 'display: flex; flex-direction: column; gap: 0.75rem; width: 100%;' }, [ m('p.proxy-description', { style: 'margin-bottom: 0.5rem; color: #475569;' }, details.hiddenType === 4 - ? "I2P has been automatically configured by Retroshare. You shouldn't need to change anything here." - : "Tor has been automatically configured by Retroshare. You shouldn't need to change anything here." + ? 'I2P has been automatically configured by Retroshare. You shouldn\'t need to change anything here.' + : 'Tor has been automatically configured by Retroshare. You shouldn\'t need to change anything here.' ), // Local Address + Local Port row m('.nw-config-row', { style: 'display: grid; grid-template-columns: 200px 1fr; gap: 1rem; align-items: center;' }, [ diff --git a/webui-src/app/forums/forum_view.js b/webui-src/app/forums/forum_view.js index a58497a..0c3845a 100644 --- a/webui-src/app/forums/forum_view.js +++ b/webui-src/app/forums/forum_view.js @@ -2,7 +2,7 @@ const m = require('mithril'); const rs = require('rswebui'); const util = require('forums/forums_util'); const peopleUtil = require('people/people_util'); -const { updatedisplayforums, loadPostContent, getTimestampValue, formatTimestamp } = require('./forums_util'); +const { loadPostContent, getTimestampValue, formatTimestamp } = require('./forums_util'); function createforum() { let title; @@ -75,75 +75,6 @@ function createforum() { ]), }; } -const EditThread = () => { - let title = ''; - let body = ''; - return { - oninit: (vnode) => { - title = vnode.attrs.current_title; - body = vnode.attrs.current_body; - }, - view: (vnode) => - m('.widget', [ - m('h3', 'Edit Thread'), - m('hr'), - - m( - 'iddisplay', - { - style: { display: 'block ruby' }, // same line block ruby - }, - [ - 'Identity: ', - m('h5[id=authid]', rs.userList.username(vnode.attrs.authorId)), - ] - ), - m( - 'titledisplay', - { - style: { display: 'block ruby' }, - }, - [ - 'Title: ', - m('input[type=text][placeholder=Title]', { - value: vnode.attrs.current_title, - oninput: (e) => (title = e.target.value), - }), - ] - ), - m('textarea[rows=5]', { - style: { width: '90%', display: 'block' }, - oninput: (e) => (body = e.target.value), - value: vnode.attrs.current_body, - }), - m( - 'button', - { - onclick: async () => { - const res = await rs.rsJsonApiRequest('/rsgxsforums/createPost', { - forumId: vnode.attrs.forumId, - mBody: body, - title, - authorId: vnode.attrs.authorId, - parentId: vnode.attrs.current_parent, - origPostId: vnode.attrs.current_msgid, - }); - res.body.retval === false - ? util.popupmessage([m('h3', 'Error'), m('hr'), m('p', res.body.errorMessage)]) - : util.popupmessage([ - m('h3', 'Success'), - m('hr'), - m('p', 'Thread edited successfully'), - ]); - util.updatedisplayforums(vnode.attrs.forumId); - m.redraw(); - }, - }, - 'Add' - ), - ]), - }; -}; const AddThread = () => { let title = ''; let body = ''; @@ -228,166 +159,6 @@ const AddThread = () => { // getTimestampValue and formatTimestamp are imported from forums_util.js -function displaythread() { - // recursive function to display all the threads - let groupmessagepair; - let unread; - let editpermission = false; - return { - view: (v) => { - const thread = v.attrs.threadStruct.thread; - groupmessagepair = { first: thread.mMeta.mGroupId, second: thread.mMeta.mOrigMsgId }; - let parMap = []; - if (util.Data.ParentThreadMap[thread.mMeta.mOrigMsgId]) { - parMap = util.Data.ParentThreadMap[thread.mMeta.mOrigMsgId]; - } - unread = thread.mMeta.mMsgStatus === util.THREAD_UNREAD; - v.attrs.identity && - v.attrs.identity.map((val) => { - if (val.localeCompare(thread.mMeta.mAuthorId) === 0) { - // if the author of the thread matches one of our own ids - editpermission = true; - } - }); - return [ - m( - 'tr', - { - style: unread ? { fontWeight: 'bold' } : '', - }, - [ - Object.keys(parMap).length // if this thread has some replies - ? m( - 'td', - m('i.fas.fa-angle-right', { - class: 'fa-rotate-' + (v.attrs.threadStruct.showReplies ? '90' : '0'), - style: 'margin-top:12px', - onclick: () => { - v.attrs.threadStruct.showReplies = !v.attrs.threadStruct.showReplies; - }, - }) - ) - : m('td', ''), - - m( - 'td', - { - style: { - position: 'relative', - '--replyDepth': v.attrs.replyDepth, - left: 'calc(30px*var(--replyDepth))', // shifts reply by 30 px - padding: '10px 0', - }, - }, - [ - m('div.date', { style: { fontSize: '0.8em', color: '#888' } }, - formatTimestamp(thread.mMeta.mPublishTs) - ), - m('div.title', { - style: { fontWeight: 'bold', fontSize: '1.1em', cursor: 'pointer', margin: '5px 0' }, - onclick: async () => { - v.attrs.changeThread(thread.mMeta.mOrigMsgId); - if (unread) { - const res = await rs.rsJsonApiRequest('/rsgxsforums/markRead', { - messageId: groupmessagepair, - read: true, - }); - if (res.body.retval) { - updatedisplayforums(thread.mMeta.mGroupId); - m.redraw(); - } - } - }, - ondblclick: () => - (v.attrs.threadStruct.showReplies = !v.attrs.threadStruct.showReplies), - }, [ - thread.mMeta.mMsgName, - m('options', { style: 'display:block; margin-top: 5px;' }, [ - m( - 'button', - { - style: 'font-size:12px; margin-right: 5px;', - onclick: (e) => { - e.stopPropagation(); - util.popupmessage( - m(AddThread, { - parent_thread: thread.mMeta.mMsgName, - forumId: thread.mMeta.mGroupId, - authorId: v.attrs.identity, - parentId: thread.mMeta.mMsgId, - }) - ); - }, - }, - 'Reply' - ), - editpermission && - m( - 'button', - { - style: 'font-size:12px; margin-right: 5px;', - onclick: async (e) => { - e.stopPropagation(); - const body = await loadPostContent( - thread.mMeta.mGroupId, - thread.mMeta.mOrigMsgId - ); - util.popupmessage( - m(EditThread, { - current_thread: thread.mMeta.mMsgName, - forumId: thread.mMeta.mGroupId, - current_title: thread.mMeta.mMsgName, - current_body: body || '', - authorId: thread.mMeta.mAuthorId, - current_parent: thread.mMeta.mParentId, - current_msgid: thread.mMeta.mOrigMsgId, - }) - ); - }, - }, - 'Edit' - ), - m( - 'button', - { - style: { fontSize: '12px' }, - onclick: async (e) => { - e.stopPropagation(); - const res = await rs.rsJsonApiRequest('/rsgxsforums/markRead', { - messageId: groupmessagepair, - read: !unread ? true : false, - }); - - if (res.body.retval) { - updatedisplayforums(thread.mMeta.mGroupId); - m.redraw(); - } - }, - }, - unread ? 'Mark Read' : 'Mark Unread' - ), - ]), - ]), - m('div.author', { style: { fontSize: '0.9em', fontStyle: 'italic' } }, rs.userList.username(thread.mMeta.mAuthorId)), - ] - ), - ] - ), - v.attrs.threadStruct.showReplies && - Object.keys(parMap).map((key, index) => - m(displaythread, { - // recursive call to all replies - threadStruct: util.Data.Threads[parMap[key].mGroupId][parMap[key].mOrigMsgId], - replyDepth: v.attrs.replyDepth + 1, - identity: v.attrs.identity, - changeThread: v.attrs.changeThread, - }) - ), - ]; - }, - }; -} - const ThreadView = () => { let ownId; return { @@ -449,7 +220,7 @@ const ThreadView = () => { style: { marginRight: '10px' }, onclick: () => util.popupmessage(m(AddThread, { parent_thread: meta.mMsgName, - forumId: forumId, + forumId, authorId: ownId, parentId: msgId, })) diff --git a/webui-src/app/forums/forums_util.js b/webui-src/app/forums/forums_util.js index ae92c5d..e7a2773 100644 --- a/webui-src/app/forums/forums_util.js +++ b/webui-src/app/forums/forums_util.js @@ -106,7 +106,7 @@ async function updatedisplayforums(keyid) { const threadStruct = { thread: { mMeta: meta, mMsg: null }, - replies: replies, + replies, showReplies: false, }; @@ -156,7 +156,7 @@ async function loadPostContent(forumId, msgId) { try { const res = await rs.rsJsonApiRequest('/rsgxsforums/getForumContent', { - forumId: forumId, + forumId, msgsIds: [msgId], }); if (res && res.body && res.body.retval && res.body.msgs && res.body.msgs.length > 0) { diff --git a/webui-src/app/jdenticon.js b/webui-src/app/jdenticon.js index b8b21eb..2808a96 100644 --- a/webui-src/app/jdenticon.js +++ b/webui-src/app/jdenticon.js @@ -41,7 +41,7 @@ function renderPolygon(shapePoints, x, y, angle, shapeAngle, size, color) { function toSvg(hash, width) { if (!hash || hash.length < 18) { - hash = "00000000000000000000000000000000"; + hash = '00000000000000000000000000000000'; } const csh = parseInt(hash.substr(0, 1), 16); @@ -99,4 +99,4 @@ function toSvg(hash, width) { module.exports = { toSvg -}; \ No newline at end of file +}; diff --git a/webui-src/app/mail/mail_compose.js b/webui-src/app/mail/mail_compose.js index 230d376..d8cd0eb 100644 --- a/webui-src/app/mail/mail_compose.js +++ b/webui-src/app/mail/mail_compose.js @@ -18,7 +18,7 @@ function formatFileSize(bytes) { const Layout = () => { let showCc = false; let showBcc = false; - let ownAvatars = {}; + const ownAvatars = {}; let attachments = []; let showEmojiPicker = false; let emojiSearch = ''; @@ -397,7 +397,7 @@ const Layout = () => { const attHtml = `

Attachments (${attachments.length}):
`; fullMailBody += attHtml; @@ -701,7 +701,7 @@ const Layout = () => { }), ]), !emojiSearch && m('.emoji-cat-bar', { style: 'display: flex; background: #f8fafc; border-bottom: 1px solid #e2e8f0; padding: 0.25rem; overflow-x: auto;' }, - chatEmoji.EMOJI_CATEGORIES.map(c => + chatEmoji.EMOJI_CATEGORIES.map((c) => m('button', { style: `border: none; background: ${c === emojiCategory ? '#ffffff' : 'transparent'}; border-radius: 0.25rem; padding: 0.3rem 0.4rem; cursor: pointer; font-size: 1rem; box-shadow: ${c === emojiCategory ? '0 1px 2px rgba(0,0,0,0.1)' : 'none'};`, title: c, @@ -711,9 +711,9 @@ const Layout = () => { ), m('.emoji-grid-body', { style: 'padding: 0.5rem; display: grid; grid-template-columns: repeat(7, 1fr); gap: 0.25rem; max-height: 230px; overflow-y: auto;' }, (emojiSearch - ? Object.values(chatEmoji.EMOJI_DATA).flat().filter(e => e.includes(emojiSearch)) + ? Object.values(chatEmoji.EMOJI_DATA).flat().filter((e) => e.includes(emojiSearch)) : (chatEmoji.EMOJI_DATA[emojiCategory] || []) - ).map(e => + ).map((e) => m('button', { style: 'border: none; background: transparent; font-size: 1.25rem; cursor: pointer; padding: 0.25rem; border-radius: 0.25rem; transition: background 0.15s ease;', onmouseenter: (ev) => (ev.currentTarget.style.background = '#f1f5f9'), diff --git a/webui-src/app/mail/mail_resolver.js b/webui-src/app/mail/mail_resolver.js index de0648e..c06b5fc 100644 --- a/webui-src/app/mail/mail_resolver.js +++ b/webui-src/app/mail/mail_resolver.js @@ -195,7 +195,7 @@ const GenericMailList = () => { m(util.MessageSummary, { key: msg.msgId, details: msg, - category: category, + category, }) ) ) diff --git a/webui-src/app/mail/mail_util.js b/webui-src/app/mail/mail_util.js index a46f073..f4acb68 100644 --- a/webui-src/app/mail/mail_util.js +++ b/webui-src/app/mail/mail_util.js @@ -622,11 +622,11 @@ const Table = () => { }; let totalItems = 0; - let tbody = v.children[0]; + const tbody = v.children[0]; if (tbody && tbody.children) { const flatChildren = Array.isArray(tbody.children) ? tbody.children.flat().filter(Boolean) : [tbody.children].filter(Boolean); totalItems = flatChildren.length; - + const start = currentPage * pageSize; const end = start + pageSize; tbody.children = flatChildren.slice(start, end); diff --git a/webui-src/app/network/network_state.js b/webui-src/app/network/network_state.js index be29209..bea212f 100644 --- a/webui-src/app/network/network_state.js +++ b/webui-src/app/network/network_state.js @@ -149,7 +149,7 @@ function sendDirectChatMessage() { '/rsChats/sendChat', { id: { type: 1, peer_id: State.currentChatPeerId }, - msg: msg, + msg, }, (data, success) => { if (success) { diff --git a/webui-src/app/people/people_chat_tab.js b/webui-src/app/people/people_chat_tab.js index 5221fa7..aba1ae9 100644 --- a/webui-src/app/people/people_chat_tab.js +++ b/webui-src/app/people/people_chat_tab.js @@ -100,14 +100,6 @@ const ChatTab = () => { const canTalk = State.distantChatStatus && State.distantChatStatus.status === 2; - // Filter history by search query for history modal - const query = (State.historySearchQuery || '').toLowerCase(); - const filteredHistory = (State.fullHistoryMessages || []).filter((msg) => { - if (!query) return true; - const text = (msg.msg || msg.message || '').toLowerCase(); - return text.includes(query); - }); - return m('.network-chat-view', [ m('.chat-identity-select-container', { style: 'padding: 0.5rem 1rem; background-color: #ffffff; border-bottom: 1px solid #cbd5e1; display: flex; align-items: center; justify-content: space-between; font-size: 0.85rem;', diff --git a/webui-src/app/people/people_sidebar.js b/webui-src/app/people/people_sidebar.js index 4b0109e..e9de2db 100644 --- a/webui-src/app/people/people_sidebar.js +++ b/webui-src/app/people/people_sidebar.js @@ -33,7 +33,7 @@ const PeopleSidebar = () => { }, view: () => { // 1. Determine list based on mainTab ('people' vs 'chats') - let displayItems = []; + let displayItems; // 0. Compute active chats count (conversations with real message history) const allUserGroupIds = new Set((rs.userList.users || []).map((u) => u.mGroupId)); @@ -47,7 +47,7 @@ const PeopleSidebar = () => { }); if (State.mainTab === 'people') { - let baseList = []; + let baseList; if (State.activeFilter === 'own') { baseList = peopleUtil.sortIds(State.ownGxsIds) || []; } else if (State.activeFilter === 'contacts') { @@ -57,13 +57,13 @@ const PeopleSidebar = () => { } displayItems = baseList.filter((item) => { - let name = State.activeFilter === 'own' ? (rs.userList.username(item) || 'Unknown') : (item.mGroupName || 'Unknown'); + const name = State.activeFilter === 'own' ? (rs.userList.username(item) || 'Unknown') : (item.mGroupName || 'Unknown'); return name.toLowerCase().includes(State.searchString.toLowerCase()); }); displayItems.sort((a, b) => { - let nameA = State.activeFilter === 'own' ? (rs.userList.username(a) || '') : (a.mGroupName || ''); - let nameB = State.activeFilter === 'own' ? (rs.userList.username(b) || '') : (b.mGroupName || ''); + const nameA = State.activeFilter === 'own' ? (rs.userList.username(a) || '') : (a.mGroupName || ''); + const nameB = State.activeFilter === 'own' ? (rs.userList.username(b) || '') : (b.mGroupName || ''); return nameA.localeCompare(nameB); }); } else { diff --git a/webui-src/app/people/people_state.js b/webui-src/app/people/people_state.js index b4fbc3a..d1ad93e 100644 --- a/webui-src/app/people/people_state.js +++ b/webui-src/app/people/people_state.js @@ -359,7 +359,7 @@ function loadChatMessages() { rs.rsJsonApiRequest( '/rsHistory/getMessages', { - chatPeerId: chatPeerId, + chatPeerId, loadCount: 50, }, (data, success) => { @@ -509,7 +509,7 @@ function preloadAllChatHistory() { if (!existing || lastTime > existing.lastTime) { State.chatHistoryMap[gxsId] = { lastMsg: last.message || last.msg || '', - lastTime: lastTime, + lastTime, }; m.redraw(); } @@ -573,7 +573,7 @@ function loadAllHistoryForSelectedPeer(callback) { rs.rsJsonApiRequest( '/rsHistory/getMessages', { - chatPeerId: chatPeerId, + chatPeerId, loadCount: 0, // 0 = load all messages in C++ }, (msgData, success) => { @@ -588,7 +588,7 @@ function loadAllHistoryForSelectedPeer(callback) { const key = `${mItem.sendTime || mItem.recvTime}_${text}`; if (!map.has(key)) map.set(key, mItem); }); - let uniqueMsgs = Array.from(map.values()); + const uniqueMsgs = Array.from(map.values()); uniqueMsgs.sort((a, b) => (a.sendTime || a.recvTime) - (b.sendTime || b.recvTime)); State.fullHistoryMessages = uniqueMsgs; State.isHistoryLoading = false; diff --git a/webui-src/app/people/people_util.js b/webui-src/app/people/people_util.js index 95bd48c..46036cc 100644 --- a/webui-src/app/people/people_util.js +++ b/webui-src/app/people/people_util.js @@ -70,7 +70,7 @@ const UserAvatar = () => ({ width: sizeStr, height: sizeStr, borderRadius: isSquare ? '0' : '50%', - backgroundColor: backgroundColor, + backgroundColor, } }, m('p', { diff --git a/webui-src/eslint.config.mjs b/webui-src/eslint.config.mjs new file mode 100644 index 0000000..8cfb645 --- /dev/null +++ b/webui-src/eslint.config.mjs @@ -0,0 +1,51 @@ +import js from '@eslint/js'; +import globals from 'globals'; + +export default [ + { + ignores: ['app/mithril.js', 'assets/**', 'make-src/**'], + }, + { + files: ['app/**/*.js'], + languageOptions: { + ecmaVersion: 2020, + sourceType: 'commonjs', + globals: { + ...globals.browser, + ...globals.commonjs, + }, + }, + rules: { + ...js.configs.recommended.rules, + 'linebreak-style': ['off', 'unix'], + quotes: ['error', 'single'], + semi: ['error', 'always'], + 'arrow-spacing': ['error', { before: true, after: true }], + 'arrow-parens': ['error', 'always'], + 'comma-style': ['error', 'last'], + 'comma-spacing': ['error', { before: false, after: true }], + camelcase: ['error', { + allow: ['^UNSAFE_'], + properties: 'never', + ignoreGlobals: true, + }], + 'eol-last': 'error', + eqeqeq: ['error', 'always', { null: 'ignore' }], + 'no-irregular-whitespace': 'error', + 'no-trailing-spaces': 'error', + 'no-unexpected-multiline': 'error', + 'no-unreachable': 'error', + 'no-var': 'warn', + 'no-unused-vars': ['error', { + args: 'none', + caughtErrors: 'none', + ignoreRestSiblings: true, + vars: 'all', + }], + 'object-shorthand': 'error', + 'prefer-const': ['error', { destructuring: 'all' }], + 'semi-style': ['warn', 'last'], + 'spaced-comment': ['warn', 'always'], + }, + }, +]; diff --git a/webui-src/make-src/build.bat b/webui-src/make-src/build.bat index 62f4e0e..b9851fd 100644 --- a/webui-src/make-src/build.bat +++ b/webui-src/make-src/build.bat @@ -8,7 +8,7 @@ echo "### Starting WebUI build ###" set src=%~dp0..\..\webui-src rem Output destination -if "%~1" == "" ( +if "%~1"=="" ( set publicdest=%~dp0..\..\webui ) else ( set publicdest=%~1\webui @@ -36,6 +36,7 @@ copy %src%\make-src\template.js %publicdest%\app.js pushd %src%\app set "basefolder=%cd%\" +set "lastsection=" for /R %%F in (*.js) do call :addfile-js "%basefolder%" "%%F" popd @@ -54,7 +55,15 @@ set registername=%~dpn2 set registername=!registername:%basefolder%=! set registername=%registername:\=/% -echo - adding %registername% ... +for /f "tokens=1,2 delims=/" %%A in ("!registername!") do ( + if "%%B"=="" ( + echo - adding !registername! ... + set "lastsection=" + ) else if not "!lastsection!"=="%%A" ( + echo - adding %%A/* ... + set "lastsection=%%A" + ) +) echo require.register("%registername%", function(exports, require, module) { >> %publicdest%\app.js type %fname% >> %publicdest%\app.js echo. >> %publicdest%\app.js diff --git a/webui-src/make-src/build.sh b/webui-src/make-src/build.sh index 9a7bef1..ce47dea 100755 --- a/webui-src/make-src/build.sh +++ b/webui-src/make-src/build.sh @@ -1,68 +1,85 @@ -#!/bin/bash +#!/bin/sh -# create webfiles from sources at compile time (works without npm/node.js) +# Create webfiles from sources at compile time (works without npm/node.js) +# +# Usage: build.sh [DEST_PARENT] [TARGET_FILE] [EXTRA_COPY_DIR] +# DEST_PARENT parent dir of the generated webui/ (default: repo root) +# TARGET_FILE build only this file (index.html|styles.css|app.js); default: all +# EXTRA_COPY_DIR also copy TARGET_FILE into EXTRA_COPY_DIR/webui/ + +set -eu echo "### Starting WebUI build ###" -src=$(readlink -f $(dirname $0))/../../webui-src +# Resolve the script's own directory portably. +script_dir=$(cd -- "$(dirname -- "$0")" && pwd -P) +src="$script_dir/../../webui-src" -if [ "$1" = "" ]; then - publicdest=$(readlink -f $(dirname $0))/../../webui +dest_parent="${1:-}" +target="${2:-}" +extra_copy_dir="${3:-}" + +if [ -z "$dest_parent" ]; then + publicdest="$script_dir/../../webui" else - publicdest=$1/webui + publicdest="$dest_parent/webui" fi -if [ "$2" = "" ]; then - if [ -d "$publicdest" ]; then - echo removing existing $publicdest - rm $publicdest -R - fi +# Full rebuild (no specific target): remove any existing output first. +if [ -z "$target" ] && [ -d "$publicdest" ]; then + echo "removing existing $publicdest" + rm -rf -- "$publicdest" fi -if [ ! -d "$publicdest" ]; then - echo creating $publicdest - mkdir $publicdest +mkdir -p -- "$publicdest" + +if [ -z "$target" ] || [ "$target" = "index.html" ]; then + echo "copying html file" + cp -- "$src/index.html" "$publicdest/" fi -# For using recursive directory search(requires bash v4+) -shopt -s globstar - -if [ "$2" = "" ]||[ "$2" = "index.html" ]; then - echo copying html file - cp $src/index.html $publicdest/ +if [ -z "$target" ] || [ "$target" = "styles.css" ]; then + echo "copying css file" + cp -- "$src/styles.css" "$publicdest/" fi -if [ "$2" = "" ]||[ "$2" = "styles.css" ]; then - echo copying css file - cp $src/styles.css $publicdest/ +if [ -z "$target" ] || [ "$target" = "app.js" ]; then + echo "building app.js:" + echo "- copying template.js ..." + cp -- "$src/make-src/template.js" "$publicdest/app.js" + + js_root="$src/app" + find "$js_root" -type f -name '*.js' | LC_ALL=C sort | while IFS= read -r filename; do + fname="${filename#"$js_root/"}" + fname="${fname%.*}" + case "$fname" in + */*) + section="${fname%%/*}/*" + if [ "$section" != "${last_section:-}" ]; then + echo "- adding $section ..." + last_section="$section" + fi + ;; + *) + echo "- adding $fname ..." + last_section= + ;; + esac + { + printf 'require.register("%s", function(exports, require, module) {\n' "$fname" + cat -- "$filename" + printf '\n});\n' + } >>"$publicdest/app.js" + done fi -if [ "$2" = "" ]||[ "$2" = "app.js" ]; then - echo building app.js: - echo - copying template.js ... - cp $src/make-src/template.js $publicdest/app.js +echo "copying assets folder" +cp -R -- "$src/assets/." "$publicdest/" - js_source=$src/app/ - for filename in $src/app/**/*.js; do - fname="${filename#$js_source}" - fname="${fname%.*}" - echo - adding $fname ... - echo require.register\(\"$fname\", function\(exports, require, module\) { >> $publicdest/app.js - cat $filename >> $publicdest/app.js - echo >> $publicdest/app.js - echo }\)\; >> $publicdest/app.js - done +if [ -n "$target" ] && [ -n "$extra_copy_dir" ]; then + mkdir -p -- "$extra_copy_dir/webui" + echo "copying $target to $extra_copy_dir/webui/$target" + cp -- "$publicdest/$target" "$extra_copy_dir/webui/$target" fi -echo copying assets folder -cp -r $src/assets/* $publicdest/ - -if [ "$2" != "" ]&&[ "$3" != "" ]; then - if [ ! -d "$3/webui" ]; then - echo creating $3/webui - mkdir $3/webui - fi - echo copying $2 nach $3/webui/$2 - cp $publicdest/$2 $3/webui/$2 -fi echo "### WebUI build complete ###" diff --git a/webui-src/package-lock.json b/webui-src/package-lock.json new file mode 100644 index 0000000..a2547df --- /dev/null +++ b/webui-src/package-lock.json @@ -0,0 +1,1311 @@ +{ + "name": "webui-src", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "webui-src", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@eslint/js": "^10.0.1", + "eslint": "^10.8.0", + "globals": "^17.8.0", + "sass": "1.97.3" + }, + "engines": { + "node": ">=24" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "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/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", + "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.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", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", + "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass": { + "version": "1.97.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", + "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/webui-src/package.json b/webui-src/package.json index 5aac05b..f16f87e 100644 --- a/webui-src/package.json +++ b/webui-src/package.json @@ -4,10 +4,17 @@ "description": "Retroshare's Web Interface", "scripts": { "watch": "rm ./styles.css && sass --watch --embed-sources --embed-source-map ./app/scss/main.scss ./styles.css", - "build": "sass --no-source-map --style=compressed ./app/scss/main.scss ./styles.css" + "build": "sass --no-source-map --style=compressed ./app/scss/main.scss ./styles.css && sh ./make-src/build.sh", + "lint": "eslint app && node --check ../webui/app.js && sh -n make-src/build.sh && echo 'Lint checks passed.'" }, "license": "ISC", + "engines": { + "node": ">=24" + }, "devDependencies": { - "sass": "^1.60.0" + "@eslint/js": "^10.0.1", + "eslint": "^10.8.0", + "globals": "^17.8.0", + "sass": "1.97.3" } } diff --git a/webui-src/pnpm-lock.yaml b/webui-src/pnpm-lock.yaml deleted file mode 100644 index 9dbf4bd..0000000 --- a/webui-src/pnpm-lock.yaml +++ /dev/null @@ -1,240 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - sass: - specifier: ^1.60.0 - version: 1.97.3 - -packages: - - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - immutable@5.1.5: - resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - sass@1.97.3: - resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} - engines: {node: '>=14.0.0'} - hasBin: true - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - -snapshots: - - '@parcel/watcher-android-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-x64@2.5.6': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.6': - optional: true - - '@parcel/watcher-win32-arm64@2.5.6': - optional: true - - '@parcel/watcher-win32-ia32@2.5.6': - optional: true - - '@parcel/watcher-win32-x64@2.5.6': - optional: true - - '@parcel/watcher@2.5.6': - dependencies: - detect-libc: 2.1.2 - is-glob: 4.0.3 - node-addon-api: 7.1.1 - picomatch: 4.0.3 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 - optional: true - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - detect-libc@2.1.2: - optional: true - - immutable@5.1.5: {} - - is-extglob@2.1.1: - optional: true - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - optional: true - - node-addon-api@7.1.1: - optional: true - - picomatch@4.0.3: - optional: true - - readdirp@4.1.2: {} - - sass@1.97.3: - dependencies: - chokidar: 4.0.3 - immutable: 5.1.5 - source-map-js: 1.2.1 - optionalDependencies: - '@parcel/watcher': 2.5.6 - - source-map-js@1.2.1: {} diff --git a/webui.pro b/webui.pro index 9d14a65..accf8a0 100644 --- a/webui.pro +++ b/webui.pro @@ -72,7 +72,7 @@ win32-g++ { } else { # create dummy files, we need it to include files on first try - system(bash webui-src/make-src/build.sh .) + system(sh webui-src/make-src/build.sh .) WEBUI_SRC_SCRIPT = webui-src/make-src/build.sh @@ -80,19 +80,19 @@ win32-g++ { create_webfiles_html.output = webui/index.html create_webfiles_html.input = WEBUI_SRC_HTML - create_webfiles_html.commands = bash $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ index.html . + create_webfiles_html.commands = sh $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ index.html . create_webfiles_html.variable_out = JUNK create_webfiles_html.CONFIG = combine no_link create_webfiles_js.output = webui/app.js create_webfiles_js.input = WEBUI_SRC_JS - create_webfiles_js.commands = bash $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ app.js . + create_webfiles_js.commands = sh $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ app.js . create_webfiles_js.variable_out = JUNK create_webfiles_js.CONFIG = combine no_link create_webfiles_css.output = webui/styles.css create_webfiles_css.input = WEBUI_SRC_CSS - create_webfiles_css.commands = bash $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ styles.css . + create_webfiles_css.commands = sh $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ styles.css . create_webfiles_css.variable_out = JUNK create_webfiles_css.CONFIG = combine no_link