' : 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}):
- ${attachments.map(att => `- ๐ ${att.name} (${att.size})
`).join('')}
+ ${attachments.map((att) => `- ๐ ${att.name} (${att.size})
`).join('')}
`;
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