From dd05ee3a656cb5eb5d0ab7620dbc7a1cfa4102ab Mon Sep 17 00:00:00 2001 From: Max Leiter Date: Sat, 18 Jun 2022 16:25:21 -0800 Subject: [PATCH] TypeScript and Vue 3 (#4559) Co-authored-by: Eric Nemchik Co-authored-by: Pavel Djundik --- .eslintignore | 1 + .eslintrc.cjs | 140 +- .gitignore | 1 + .npmignore | 7 +- .prettierignore | 3 +- .vscode/extensions.json | 3 +- .vscode/settings.json | 6 +- README.md | 7 +- babel.config.cjs | 3 +- client/components/App.vue | 199 +- client/components/Channel.vue | 37 +- client/components/ChannelWrapper.vue | 92 +- client/components/Chat.vue | 184 +- client/components/ChatInput.vue | 373 ++- client/components/ChatUserList.vue | 162 +- client/components/ConfirmDialog.vue | 78 +- client/components/ContextMenu.vue | 347 ++- client/components/DateMarker.vue | 67 +- client/components/Draggable.vue | 120 + client/components/ImageViewer.vue | 428 +-- client/components/InlineChannel.vue | 19 +- client/components/JoinChannel.vue | 61 +- client/components/LinkPreview.vue | 244 +- client/components/LinkPreviewFileSize.vue | 19 +- client/components/LinkPreviewToggle.vue | 36 +- client/components/Mentions.vue | 138 +- client/components/Message.vue | 83 +- client/components/MessageCondensed.vue | 82 +- client/components/MessageList.vue | 462 +-- client/components/MessageSearchForm.vue | 113 +- client/components/MessageTypes/away.vue | 18 +- client/components/MessageTypes/back.vue | 18 +- client/components/MessageTypes/chghost.vue | 18 +- client/components/MessageTypes/ctcp.vue | 22 +- .../components/MessageTypes/ctcp_request.vue | 18 +- client/components/MessageTypes/error.vue | 56 +- .../MessageTypes/{index.js => index.ts} | 4 +- client/components/MessageTypes/invite.vue | 18 +- client/components/MessageTypes/join.vue | 24 +- client/components/MessageTypes/kick.vue | 18 +- client/components/MessageTypes/mode.vue | 18 +- .../components/MessageTypes/mode_channel.vue | 19 +- client/components/MessageTypes/mode_user.vue | 19 +- .../MessageTypes/monospace_block.vue | 32 +- client/components/MessageTypes/nick.vue | 18 +- client/components/MessageTypes/part.vue | 18 +- client/components/MessageTypes/quit.vue | 18 +- client/components/MessageTypes/raw.vue | 19 +- client/components/MessageTypes/topic.vue | 18 +- .../components/MessageTypes/topic_set_by.vue | 28 +- client/components/MessageTypes/whois.vue | 32 +- client/components/NetworkForm.vue | 187 +- client/components/NetworkList.vue | 497 +-- client/components/NetworkLobby.vue | 59 +- client/components/ParsedMessage.vue | 23 +- client/components/RevealPassword.vue | 26 +- client/components/RoutedChat.vue | 70 +- client/components/Session.vue | 35 +- client/components/Settings/Account.vue | 102 +- client/components/Settings/Appearance.vue | 46 +- client/components/Settings/General.vue | 122 +- client/components/Settings/Navigation.vue | 7 +- client/components/Settings/Notifications.vue | 78 +- client/components/Settings/SettingTabItem.vue | 35 +- client/components/Sidebar.vue | 248 +- client/components/SidebarToggle.vue | 18 +- client/components/Special/ListBans.vue | 26 +- client/components/Special/ListChannels.vue | 12 +- client/components/Special/ListIgnored.vue | 20 +- client/components/Special/ListInvites.vue | 20 +- client/components/Username.vue | 79 +- client/components/VersionChecker.vue | 56 +- client/components/Windows/Changelog.vue | 62 +- client/components/Windows/Connect.vue | 68 +- client/components/Windows/Help.vue | 39 +- client/components/Windows/NetworkEdit.vue | 73 +- client/components/Windows/SearchResults.vue | 352 ++- client/components/Windows/Settings.vue | 36 +- client/components/Windows/SignIn.vue | 72 +- client/css/style.css | 5 + client/index.html.tpl | 2 +- client/js/{auth.js => auth.ts} | 2 - .../{autocompletion.js => autocompletion.ts} | 106 +- client/js/{clipboard.js => clipboard.ts} | 9 +- .../js/commands/{collapse.js => collapse.ts} | 12 +- client/js/commands/{expand.js => expand.ts} | 12 +- client/js/commands/{index.js => index.ts} | 6 +- client/js/commands/{join.js => join.ts} | 20 +- client/js/commands/search.js | 24 - client/js/commands/search.ts | 27 + client/js/{constants.js => constants.ts} | 7 +- client/js/{eventbus.js => eventbus.ts} | 10 +- ...{collapseNetwork.js => collapseNetwork.ts} | 2 - .../helpers/{colorClass.js => colorClass.ts} | 6 +- .../{contextMenu.js => contextMenu.ts} | 91 +- client/js/helpers/distance.js | 5 - client/js/helpers/distance.ts | 5 + .../{friendlysize.js => friendlysize.ts} | 4 +- ...{anyIntersection.js => anyIntersection.ts} | 7 +- ...{cleanIrcMessage.js => cleanIrcMessage.ts} | 4 +- .../ircmessageparser/{fill.js => fill.ts} | 9 +- .../{findChannels.js => findChannels.ts} | 13 +- .../js/helpers/ircmessageparser/findEmoji.js | 20 - .../js/helpers/ircmessageparser/findEmoji.ts | 25 + .../{findLinks.js => findLinks.ts} | 31 +- .../{findNames.js => findNames.ts} | 16 +- .../ircmessageparser/{merge.js => merge.ts} | 53 +- .../{parseStyle.js => parseStyle.ts} | 25 +- ...nnelCollapsed.js => isChannelCollapsed.ts} | 4 +- client/js/helpers/isIgnoredKeybind.js | 12 - client/js/helpers/isIgnoredKeybind.ts | 13 + ...rSwipes.js => listenForTwoFingerSwipes.ts} | 11 +- client/js/helpers/localetime.js | 5 - client/js/helpers/localetime.ts | 3 + client/js/helpers/{parse.js => parse.ts} | 122 +- .../{parseIrcUri.js => parseIrcUri.ts} | 4 +- ...oundBadgeNumber.js => roundBadgeNumber.ts} | 4 +- client/js/hooks/use-close-channel.ts | 38 + client/js/{keybinds.js => keybinds.ts} | 33 +- client/js/loading-error-handlers.js | 49 +- .../js/{localStorage.js => localStorage.ts} | 8 +- client/js/{location.js => location.ts} | 2 - client/js/{router.js => router.ts} | 54 +- client/js/settings.js | 135 - client/js/settings.ts | 176 ++ client/js/socket-events/{auth.js => auth.ts} | 30 +- .../{changelog.js => changelog.ts} | 8 +- .../{commands.js => commands.ts} | 2 +- .../{configuration.js => configuration.ts} | 15 +- .../{connection.js => connection.ts} | 5 +- client/js/socket-events/history_clear.js | 14 - client/js/socket-events/history_clear.ts | 14 + .../js/socket-events/{index.js => index.ts} | 2 - client/js/socket-events/{init.js => init.ts} | 74 +- client/js/socket-events/{join.js => join.ts} | 13 +- client/js/socket-events/mentions.js | 8 - client/js/socket-events/mentions.ts | 7 + client/js/socket-events/{more.js => more.ts} | 18 +- client/js/socket-events/{msg.js => msg.ts} | 44 +- client/js/socket-events/msg_preview.js | 21 - client/js/socket-events/msg_preview.ts | 17 + client/js/socket-events/msg_special.js | 11 - client/js/socket-events/msg_special.ts | 14 + client/js/socket-events/mute_changed.js | 17 - client/js/socket-events/mute_changed.ts | 18 + client/js/socket-events/names.js | 12 - client/js/socket-events/names.ts | 10 + .../socket-events/{network.js => network.ts} | 15 +- client/js/socket-events/{nick.js => nick.ts} | 4 +- client/js/socket-events/{open.js => open.ts} | 4 +- client/js/socket-events/{part.js => part.ts} | 8 +- client/js/socket-events/{quit.js => quit.ts} | 8 +- .../js/socket-events/{search.js => search.ts} | 2 +- .../{sessions_list.js => sessions_list.ts} | 4 +- client/js/socket-events/setting.js | 24 - client/js/socket-events/setting.ts | 22 + .../{sign_out.js => sign_out.ts} | 2 - .../{sync_sort.js => sync_sort.ts} | 13 +- .../js/socket-events/{topic.js => topic.ts} | 4 +- .../js/socket-events/{users.js => users.ts} | 4 +- client/js/socket.js | 17 - client/js/socket.ts | 22 + .../{store-settings.js => store-settings.ts} | 13 +- client/js/store.js | 233 -- client/js/store.ts | 414 +++ client/js/types.d.ts | 100 + client/js/{upload.js => upload.ts} | 109 +- client/js/vue.js | 118 - client/js/vue.ts | 84 + client/js/{webpush.js => webpush.ts} | 8 +- client/service-worker.js | 1 + client/shims-vue.d.ts | 7 + client/tsconfig.json | 28 + index.js | 15 +- package.json | 71 +- scripts/changelog.js | 2 +- scripts/generate-config-doc.js | 2 +- server/client.ts | 864 ++++++ server/clientManager.ts | 296 ++ .../index.js => server/command-line/index.ts | 41 +- .../command-line/install.ts | 49 +- .../command-line/outdated.ts | 14 +- .../start.js => server/command-line/start.ts | 26 +- server/command-line/uninstall.ts | 42 + .../command-line/upgrade.ts | 29 +- .../command-line/users/add.ts | 22 +- .../command-line/users/edit.ts | 22 +- server/command-line/users/index.ts | 15 + .../command-line/users/list.ts | 18 +- .../command-line/users/remove.ts | 22 +- .../command-line/users/reset.ts | 22 +- .../utils.js => server/command-line/utils.ts | 101 +- src/config.js => server/config.ts | 162 +- src/helper.js => server/helper.ts | 49 +- .../identification.ts | 69 +- server/index.d.ts | 1 + server/index.ts | 8 + src/log.js => server/log.ts | 25 +- server/models/chan.ts | 336 +++ server/models/msg.ts | 134 + server/models/network.ts | 653 ++++ .../prefix.js => server/models/prefix.ts | 19 +- server/models/user.ts | 44 + server/plugins/auth.ts | 67 + .../ldap.js => server/plugins/auth/ldap.ts | 76 +- .../local.js => server/plugins/auth/local.ts | 16 +- .../plugins/changelog.ts | 85 +- .../plugins/clientCertificate.ts | 42 +- server/plugins/dev-server.ts | 42 + .../plugins/inputs/action.ts | 20 +- .../away.js => server/plugins/inputs/away.ts | 12 +- .../ban.js => server/plugins/inputs/ban.ts | 22 +- .../plugins/inputs/connect.ts | 19 +- server/plugins/inputs/ctcp.ts | 37 + server/plugins/inputs/disconnect.ts | 19 + .../plugins/inputs/ignore.ts | 63 +- server/plugins/inputs/index.ts | 102 + .../plugins/inputs/invite.ts | 20 +- server/plugins/inputs/kick.ts | 30 + server/plugins/inputs/kill.ts | 16 + server/plugins/inputs/list.ts | 14 + .../mode.js => server/plugins/inputs/mode.ts | 25 +- .../msg.js => server/plugins/inputs/msg.ts | 34 +- .../mute.js => server/plugins/inputs/mute.ts | 28 +- .../nick.js => server/plugins/inputs/nick.ts | 22 +- .../plugins/inputs/notice.ts | 11 +- .../part.js => server/plugins/inputs/part.ts | 28 +- server/plugins/inputs/quit.ts | 31 + server/plugins/inputs/raw.ts | 16 + server/plugins/inputs/rejoin.ts | 29 + server/plugins/inputs/topic.ts | 28 + .../plugins/inputs/whois.ts | 11 +- .../plugins/irc-events/away.ts | 19 +- .../plugins/irc-events/cap.ts | 10 +- .../plugins/irc-events/chghost.ts | 8 +- .../plugins/irc-events/connection.ts | 40 +- .../plugins/irc-events/ctcp.ts | 22 +- .../plugins/irc-events/error.ts | 16 +- .../plugins/irc-events/help.ts | 9 +- .../plugins/irc-events/info.ts | 9 +- .../plugins/irc-events/invite.ts | 8 +- .../plugins/irc-events/join.ts | 17 +- .../plugins/irc-events/kick.ts | 19 +- .../plugins/irc-events/link.ts | 125 +- .../plugins/irc-events/list.ts | 20 +- .../plugins/irc-events/message.ts | 74 +- .../plugins/irc-events/mode.ts | 19 +- .../plugins/irc-events/modelist.ts | 29 +- .../plugins/irc-events/motd.ts | 10 +- .../plugins/irc-events/names.ts | 4 +- .../plugins/irc-events/nick.ts | 9 +- .../plugins/irc-events/part.ts | 12 +- .../plugins/irc-events/quit.ts | 8 +- .../plugins/irc-events/sasl.ts | 11 +- .../plugins/irc-events/topic.ts | 10 +- .../plugins/irc-events/unhandled.ts | 8 +- .../plugins/irc-events/welcome.ts | 6 +- .../plugins/irc-events/whois.ts | 15 +- .../plugins/messageStorage/sqlite.ts | 73 +- .../plugins/messageStorage/text.ts | 65 +- server/plugins/messageStorage/types.d.ts | 45 + .../plugins/packages/index.ts | 118 +- .../plugins/packages/publicClient.ts | 28 +- .../plugins/packages/themes.ts | 50 +- .../storage.js => server/plugins/storage.ts | 27 +- src/plugins/sts.js => server/plugins/sts.ts | 39 +- .../uploader.js => server/plugins/uploader.ts | 131 +- .../webpush.js => server/plugins/webpush.ts | 43 +- src/server.js => server/server.ts | 348 ++- server/tsconfig.json | 27 + server/types/index.d.ts | 2 + server/types/modules/irc-framework.d.ts | 430 +++ server/types/socket-events.d.ts | 224 ++ src/client.js | 771 ----- src/clientManager.js | 284 -- src/command-line/uninstall.js | 38 - src/command-line/users/index.js | 10 - src/models/chan.js | 304 -- src/models/msg.js | 92 - src/models/network.js | 558 ---- src/models/user.js | 35 - src/plugins/auth.js | 50 - src/plugins/dev-server.js | 28 - src/plugins/inputs/ctcp.js | 29 - src/plugins/inputs/disconnect.js | 13 - src/plugins/inputs/index.js | 65 - src/plugins/inputs/kick.js | 26 - src/plugins/inputs/kill.js | 11 - src/plugins/inputs/list.js | 9 - src/plugins/inputs/quit.js | 25 - src/plugins/inputs/raw.js | 11 - src/plugins/inputs/rejoin.js | 24 - src/plugins/inputs/topic.js | 23 - test/.mocharc.yml | 11 +- test/.nycrc-mocha.json | 5 +- .../components/ParsedMessageTestWrapper.vue | 12 +- test/client/{index.js => index.ts} | 3 +- test/client/js/authTest.js | 31 - test/client/js/authTest.ts | 34 + .../js/{constantsTest.js => constantsTest.ts} | 8 +- ...riendlysizeTest.js => friendlysizeTest.ts} | 6 +- ...{anyIntersection.js => anyIntersection.ts} | 7 +- ...{cleanIrcMessage.js => cleanIrcMessage.ts} | 6 +- .../ircmessageparser/{fill.js => fill.ts} | 6 +- .../{findChannels.js => findChannels.ts} | 7 +- .../{findEmoji.js => findEmoji.ts} | 6 +- .../{findLinks.js => findLinks.ts} | 8 +- .../{findNames.js => findNames.ts} | 6 +- .../ircmessageparser/{merge.js => merge.ts} | 8 +- .../{parseStyle.js => parseStyle.ts} | 6 +- .../{localetimeTest.js => localetimeTest.ts} | 6 +- test/client/js/helpers/{parse.js => parse.ts} | 118 +- .../{parseIrcUri.js => parseIrcUri.ts} | 6 +- ...eNumberTest.js => roundBadgeNumberTest.ts} | 6 +- test/commands/{mode.js => mode.ts} | 32 +- test/fixtures/.gitignore | 1 + test/fixtures/.thelounge/config.js | 3 +- test/fixtures/env.js | 13 - test/fixtures/env.ts | 5 + test/models/{chan.js => chan.ts} | 20 +- test/models/{msg.js => msg.ts} | 17 +- test/models/{network.js => network.ts} | 101 +- test/plugins/auth/{ldap.js => ldap.ts} | 62 +- ...entCertificate.js => clientCertificate.ts} | 16 +- .../inputs/{indexTest.js => indexTest.ts} | 6 +- test/plugins/{link.js => link.ts} | 24 +- .../packages/{indexTest.js => indexTest.ts} | 33 +- test/plugins/{sqlite.js => sqlite.ts} | 79 +- test/plugins/{storage.js => storage.ts} | 22 +- test/{server.js => server.ts} | 50 +- .../{utilsTest.js => utilsTest.ts} | 49 +- test/src/{helperTest.js => helperTest.ts} | 10 +- test/tests/{build.js => build.ts} | 8 +- ...ustomhighlights.js => customhighlights.ts} | 30 +- test/tests/{hexip.js => hexip.ts} | 6 +- test/tests/{hostmask.js => hostmask.ts} | 6 +- test/tests/{mergeConfig.js => mergeConfig.ts} | 77 +- test/tests/nickhighlights.js | 63 - test/tests/nickhighlights.ts | 61 + test/tests/{passwords.js => passwords.ts} | 6 +- .../{textLogFolder.js => textLogFolder.ts} | 15 +- test/tsconfig.json | 23 + test/util.js | 67 - test/util.ts | 71 + tsconfig.base.json | 104 + tsconfig.json | 20 + volar.config.js | 14 + webpack.config.js => webpack.config.ts | 90 +- yarn.lock | 2655 ++++++++++------- 349 files changed, 13395 insertions(+), 8810 deletions(-) create mode 100644 client/components/Draggable.vue rename client/components/MessageTypes/{index.js => index.ts} (83%) rename client/js/{auth.js => auth.ts} (91%) rename client/js/{autocompletion.js => autocompletion.ts} (69%) rename client/js/{clipboard.js => clipboard.ts} (78%) rename client/js/commands/{collapse.js => collapse.ts} (78%) rename client/js/commands/{expand.js => expand.ts} (78%) rename client/js/commands/{index.js => index.ts} (76%) rename client/js/commands/{join.js => join.ts} (67%) delete mode 100644 client/js/commands/search.js create mode 100644 client/js/commands/search.ts rename client/js/{constants.js => constants.ts} (87%) rename client/js/{eventbus.js => eventbus.ts} (77%) rename client/js/helpers/{collapseNetwork.js => collapseNetwork.ts} (96%) rename client/js/helpers/{colorClass.js => colorClass.ts} (78%) rename client/js/helpers/{contextMenu.js => contextMenu.ts} (80%) delete mode 100644 client/js/helpers/distance.js create mode 100644 client/js/helpers/distance.ts rename client/js/helpers/{friendlysize.js => friendlysize.ts} (88%) rename client/js/helpers/ircmessageparser/{anyIntersection.js => anyIntersection.ts} (82%) rename client/js/helpers/ircmessageparser/{cleanIrcMessage.js => cleanIrcMessage.ts} (60%) rename client/js/helpers/ircmessageparser/{fill.js => fill.ts} (83%) rename client/js/helpers/ircmessageparser/{findChannels.js => findChannels.ts} (85%) delete mode 100644 client/js/helpers/ircmessageparser/findEmoji.js create mode 100644 client/js/helpers/ircmessageparser/findEmoji.ts rename client/js/helpers/ircmessageparser/{findLinks.js => findLinks.ts} (59%) rename client/js/helpers/ircmessageparser/{findNames.js => findNames.ts} (54%) rename client/js/helpers/ircmessageparser/{merge.js => merge.ts} (54%) rename client/js/helpers/ircmessageparser/{parseStyle.js => parseStyle.ts} (93%) rename client/js/helpers/{isChannelCollapsed.js => isChannelCollapsed.ts} (85%) delete mode 100644 client/js/helpers/isIgnoredKeybind.js create mode 100644 client/js/helpers/isIgnoredKeybind.ts rename client/js/helpers/{listenForTwoFingerSwipes.js => listenForTwoFingerSwipes.ts} (95%) delete mode 100644 client/js/helpers/localetime.js create mode 100644 client/js/helpers/localetime.ts rename client/js/helpers/{parse.js => parse.ts} (65%) rename client/js/helpers/{parseIrcUri.js => parseIrcUri.ts} (95%) rename client/js/helpers/{roundBadgeNumber.js => roundBadgeNumber.ts} (71%) create mode 100644 client/js/hooks/use-close-channel.ts rename client/js/{keybinds.js => keybinds.ts} (87%) rename client/js/{localStorage.js => localStorage.ts} (92%) rename client/js/{location.js => location.ts} (93%) rename client/js/{router.js => router.ts} (78%) delete mode 100644 client/js/settings.js create mode 100644 client/js/settings.ts rename client/js/socket-events/{auth.js => auth.ts} (82%) rename client/js/socket-events/{changelog.js => changelog.ts} (91%) rename client/js/socket-events/{commands.js => commands.ts} (75%) rename client/js/socket-events/{configuration.js => configuration.ts} (73%) rename client/js/socket-events/{connection.js => connection.ts} (90%) delete mode 100644 client/js/socket-events/history_clear.js create mode 100644 client/js/socket-events/history_clear.ts rename client/js/socket-events/{index.js => index.ts} (97%) rename client/js/socket-events/{init.js => init.ts} (70%) rename client/js/socket-events/{join.js => join.ts} (64%) delete mode 100644 client/js/socket-events/mentions.js create mode 100644 client/js/socket-events/mentions.ts rename client/js/socket-events/{more.js => more.ts} (57%) rename client/js/socket-events/{msg.js => msg.ts} (84%) delete mode 100644 client/js/socket-events/msg_preview.js create mode 100644 client/js/socket-events/msg_preview.ts delete mode 100644 client/js/socket-events/msg_special.js create mode 100644 client/js/socket-events/msg_special.ts delete mode 100644 client/js/socket-events/mute_changed.js create mode 100644 client/js/socket-events/mute_changed.ts delete mode 100644 client/js/socket-events/names.js create mode 100644 client/js/socket-events/names.ts rename client/js/socket-events/{network.js => network.ts} (86%) rename client/js/socket-events/{nick.js => nick.ts} (79%) rename client/js/socket-events/{open.js => open.ts} (93%) rename client/js/socket-events/{part.js => part.ts} (80%) rename client/js/socket-events/{quit.js => quit.ts} (83%) rename client/js/socket-events/{search.js => search.ts} (90%) rename client/js/socket-events/{sessions_list.js => sessions_list.ts} (78%) delete mode 100644 client/js/socket-events/setting.js create mode 100644 client/js/socket-events/setting.ts rename client/js/socket-events/{sign_out.js => sign_out.ts} (88%) rename client/js/socket-events/{sync_sort.js => sync_sort.ts} (51%) rename client/js/socket-events/{topic.js => topic.ts} (80%) rename client/js/socket-events/{users.js => users.ts} (88%) delete mode 100644 client/js/socket.js create mode 100644 client/js/socket.ts rename client/js/{store-settings.js => store-settings.ts} (88%) delete mode 100644 client/js/store.js create mode 100644 client/js/store.ts create mode 100644 client/js/types.d.ts rename client/js/{upload.js => upload.ts} (73%) delete mode 100644 client/js/vue.js create mode 100644 client/js/vue.ts rename client/js/{webpush.js => webpush.ts} (92%) create mode 100644 client/shims-vue.d.ts create mode 100644 client/tsconfig.json create mode 100644 server/client.ts create mode 100644 server/clientManager.ts rename src/command-line/index.js => server/command-line/index.ts (79%) rename src/command-line/install.js => server/command-line/install.ts (69%) rename src/command-line/outdated.js => server/command-line/outdated.ts (68%) rename src/command-line/start.js => server/command-line/start.ts (61%) create mode 100644 server/command-line/uninstall.ts rename src/command-line/upgrade.js => server/command-line/upgrade.ts (71%) rename src/command-line/users/add.js => server/command-line/users/add.ts (81%) rename src/command-line/users/edit.js => server/command-line/users/edit.ts (71%) create mode 100644 server/command-line/users/index.ts rename src/command-line/users/list.js => server/command-line/users/list.ts (63%) rename src/command-line/users/remove.js => server/command-line/users/remove.ts (59%) rename src/command-line/users/reset.js => server/command-line/users/reset.ts (79%) rename src/command-line/utils.js => server/command-line/utils.ts (61%) rename src/config.js => server/config.ts (54%) rename src/helper.js => server/helper.ts (79%) rename src/identification.js => server/identification.ts (59%) create mode 100644 server/index.d.ts create mode 100755 server/index.ts rename src/log.js => server/log.ts (62%) create mode 100644 server/models/chan.ts create mode 100644 server/models/msg.ts create mode 100644 server/models/network.ts rename src/models/prefix.js => server/models/prefix.ts (58%) create mode 100644 server/models/user.ts create mode 100644 server/plugins/auth.ts rename src/plugins/auth/ldap.js => server/plugins/auth/ldap.ts (70%) rename src/plugins/auth/local.js => server/plugins/auth/local.ts (77%) rename src/plugins/changelog.js => server/plugins/changelog.ts (54%) rename src/plugins/clientCertificate.js => server/plugins/clientCertificate.ts (77%) create mode 100644 server/plugins/dev-server.ts rename src/plugins/inputs/action.js => server/plugins/inputs/action.ts (60%) rename src/plugins/inputs/away.js => server/plugins/inputs/away.ts (53%) rename src/plugins/inputs/ban.js => server/plugins/inputs/ban.ts (60%) rename src/plugins/inputs/connect.js => server/plugins/inputs/connect.ts (61%) create mode 100644 server/plugins/inputs/ctcp.ts create mode 100644 server/plugins/inputs/disconnect.ts rename src/plugins/inputs/ignore.js => server/plugins/inputs/ignore.ts (60%) create mode 100644 server/plugins/inputs/index.ts rename src/plugins/inputs/invite.js => server/plugins/inputs/invite.ts (50%) create mode 100644 server/plugins/inputs/kick.ts create mode 100644 server/plugins/inputs/kill.ts create mode 100644 server/plugins/inputs/list.ts rename src/plugins/inputs/mode.js => server/plugins/inputs/mode.ts (60%) rename src/plugins/inputs/msg.js => server/plugins/inputs/msg.ts (77%) rename src/plugins/inputs/mute.js => server/plugins/inputs/mute.ts (61%) rename src/plugins/inputs/nick.js => server/plugins/inputs/nick.ts (72%) rename src/plugins/inputs/notice.js => server/plugins/inputs/notice.ts (79%) rename src/plugins/inputs/part.js => server/plugins/inputs/part.ts (60%) create mode 100644 server/plugins/inputs/quit.ts create mode 100644 server/plugins/inputs/raw.ts create mode 100644 server/plugins/inputs/rejoin.ts create mode 100644 server/plugins/inputs/topic.ts rename src/plugins/inputs/whois.js => server/plugins/inputs/whois.ts (64%) rename src/plugins/irc-events/away.js => server/plugins/irc-events/away.ts (69%) rename src/plugins/irc-events/cap.js => server/plugins/irc-events/cap.ts (88%) rename src/plugins/irc-events/chghost.js => server/plugins/irc-events/chghost.ts (77%) rename src/plugins/irc-events/connection.js => server/plugins/irc-events/connection.ts (82%) rename src/plugins/irc-events/ctcp.js => server/plugins/irc-events/ctcp.ts (79%) rename src/plugins/irc-events/error.js => server/plugins/irc-events/error.ts (86%) rename src/plugins/irc-events/help.js => server/plugins/irc-events/help.ts (55%) rename src/plugins/irc-events/info.js => server/plugins/irc-events/info.ts (55%) rename src/plugins/irc-events/invite.js => server/plugins/irc-events/invite.ts (72%) rename src/plugins/irc-events/join.js => server/plugins/irc-events/join.ts (74%) rename src/plugins/irc-events/kick.js => server/plugins/irc-events/kick.ts (54%) rename src/plugins/irc-events/link.js => server/plugins/irc-events/link.ts (79%) rename src/plugins/irc-events/list.js => server/plugins/irc-events/list.ts (69%) rename src/plugins/irc-events/message.js => server/plugins/irc-events/message.ts (73%) rename src/plugins/irc-events/mode.js => server/plugins/irc-events/mode.ts (87%) rename src/plugins/irc-events/modelist.js => server/plugins/irc-events/modelist.ts (66%) rename src/plugins/irc-events/motd.js => server/plugins/irc-events/motd.ts (61%) rename src/plugins/irc-events/names.js => server/plugins/irc-events/names.ts (82%) rename src/plugins/irc-events/nick.js => server/plugins/irc-events/nick.ts (76%) rename src/plugins/irc-events/part.js => server/plugins/irc-events/part.ts (70%) rename src/plugins/irc-events/quit.js => server/plugins/irc-events/quit.ts (76%) rename src/plugins/irc-events/sasl.js => server/plugins/irc-events/sasl.ts (57%) rename src/plugins/irc-events/topic.js => server/plugins/irc-events/topic.ts (78%) rename src/plugins/irc-events/unhandled.js => server/plugins/irc-events/unhandled.ts (79%) rename src/plugins/irc-events/welcome.js => server/plugins/irc-events/welcome.ts (71%) rename src/plugins/irc-events/whois.js => server/plugins/irc-events/whois.ts (75%) rename src/plugins/messageStorage/sqlite.js => server/plugins/messageStorage/sqlite.ts (78%) rename src/plugins/messageStorage/text.js => server/plugins/messageStorage/text.ts (73%) create mode 100644 server/plugins/messageStorage/types.d.ts rename src/plugins/packages/index.js => server/plugins/packages/index.ts (62%) rename src/plugins/packages/publicClient.js => server/plugins/packages/publicClient.ts (68%) rename src/plugins/packages/themes.js => server/plugins/packages/themes.ts (55%) rename src/plugins/storage.js => server/plugins/storage.ts (80%) rename src/plugins/sts.js => server/plugins/sts.ts (67%) rename src/plugins/uploader.js => server/plugins/uploader.ts (70%) rename src/plugins/webpush.js => server/plugins/webpush.ts (69%) rename src/server.js => server/server.ts (71%) create mode 100644 server/tsconfig.json create mode 100644 server/types/index.d.ts create mode 100644 server/types/modules/irc-framework.d.ts create mode 100644 server/types/socket-events.d.ts delete mode 100644 src/client.js delete mode 100644 src/clientManager.js delete mode 100644 src/command-line/uninstall.js delete mode 100644 src/command-line/users/index.js delete mode 100644 src/models/chan.js delete mode 100644 src/models/msg.js delete mode 100644 src/models/network.js delete mode 100644 src/models/user.js delete mode 100644 src/plugins/auth.js delete mode 100644 src/plugins/dev-server.js delete mode 100644 src/plugins/inputs/ctcp.js delete mode 100644 src/plugins/inputs/disconnect.js delete mode 100644 src/plugins/inputs/index.js delete mode 100644 src/plugins/inputs/kick.js delete mode 100644 src/plugins/inputs/kill.js delete mode 100644 src/plugins/inputs/list.js delete mode 100644 src/plugins/inputs/quit.js delete mode 100644 src/plugins/inputs/raw.js delete mode 100644 src/plugins/inputs/rejoin.js delete mode 100644 src/plugins/inputs/topic.js rename test/client/{index.js => index.ts} (55%) delete mode 100644 test/client/js/authTest.js create mode 100644 test/client/js/authTest.ts rename test/client/js/{constantsTest.js => constantsTest.ts} (83%) rename test/client/js/helpers/{friendlysizeTest.js => friendlysizeTest.ts} (86%) rename test/client/js/helpers/ircmessageparser/{anyIntersection.js => anyIntersection.ts} (80%) rename test/client/js/helpers/ircmessageparser/{cleanIrcMessage.js => cleanIrcMessage.ts} (91%) rename test/client/js/helpers/ircmessageparser/{fill.js => fill.ts} (86%) rename test/client/js/helpers/ircmessageparser/{findChannels.js => findChannels.ts} (93%) rename test/client/js/helpers/ircmessageparser/{findEmoji.js => findEmoji.ts} (88%) rename test/client/js/helpers/ircmessageparser/{findLinks.js => findLinks.ts} (98%) rename test/client/js/helpers/ircmessageparser/{findNames.js => findNames.ts} (90%) rename test/client/js/helpers/ircmessageparser/{merge.js => merge.ts} (94%) rename test/client/js/helpers/ircmessageparser/{parseStyle.js => parseStyle.ts} (99%) rename test/client/js/helpers/{localetimeTest.js => localetimeTest.ts} (76%) rename test/client/js/helpers/{parse.js => parse.ts} (82%) rename test/client/js/helpers/{parseIrcUri.js => parseIrcUri.ts} (94%) rename test/client/js/helpers/{roundBadgeNumberTest.js => roundBadgeNumberTest.ts} (81%) rename test/commands/{mode.js => mode.ts} (86%) delete mode 100644 test/fixtures/env.js create mode 100644 test/fixtures/env.ts rename test/models/{chan.js => chan.ts} (92%) rename test/models/{msg.js => msg.ts} (76%) rename test/models/{network.js => network.ts} (82%) rename test/plugins/auth/{ldap.js => ldap.ts} (72%) rename test/plugins/{clientCertificate.js => clientCertificate.ts} (84%) rename test/plugins/inputs/{indexTest.js => indexTest.ts} (81%) rename test/plugins/{link.js => link.ts} (97%) rename test/plugins/packages/{indexTest.js => indexTest.ts} (66%) rename test/plugins/{sqlite.js => sqlite.ts} (77%) rename test/plugins/{storage.js => storage.ts} (89%) rename test/{server.js => server.ts} (71%) rename test/src/command-line/{utilsTest.js => utilsTest.ts} (84%) rename test/src/{helperTest.js => helperTest.ts} (89%) rename test/tests/{build.js => build.ts} (96%) rename test/tests/{customhighlights.js => customhighlights.ts} (83%) rename test/tests/{hexip.js => hexip.ts} (85%) rename test/tests/{hostmask.js => hostmask.ts} (97%) rename test/tests/{mergeConfig.js => mergeConfig.ts} (84%) delete mode 100644 test/tests/nickhighlights.js create mode 100644 test/tests/nickhighlights.ts rename test/tests/{passwords.js => passwords.ts} (93%) rename test/tests/{textLogFolder.js => textLogFolder.ts} (83%) create mode 100644 test/tsconfig.json delete mode 100644 test/util.js create mode 100644 test/util.ts create mode 100644 tsconfig.base.json create mode 100644 tsconfig.json create mode 100644 volar.config.js rename webpack.config.js => webpack.config.ts (61%) diff --git a/.eslintignore b/.eslintignore index 1f2ae53f..219bb10b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ public/ coverage/ +dist/ diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ca48b1ad..4b567364 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,14 +1,18 @@ -module.exports = { - root: true, +// @ts-check +const {defineConfig} = require("eslint-define-config"); + +const projects = defineConfig({ parserOptions: { - ecmaVersion: 2022, - }, - env: { - es6: true, - browser: true, - mocha: true, - node: true, + project: [ + "./tsconfig.json", + "./client/tsconfig.json", + "./server/tsconfig.json", + "./test/tsconfig.json", + ], }, +}).parserOptions.project; + +const baseRules = defineConfig({ rules: { "block-scoped-var": "error", curly: ["error", "all"], @@ -23,7 +27,6 @@ module.exports = { "no-else-return": "error", "no-implicit-globals": "error", "no-restricted-globals": ["error", "event", "fdescribe"], - "no-shadow": "error", "no-template-curly-in-string": "error", "no-unsafe-negation": "error", "no-useless-computed-key": "error", @@ -62,18 +65,127 @@ module.exports = { "spaced-comment": ["error", "always"], strict: "off", yoda: "error", + }, +}).rules; + +const vueRules = defineConfig({ + rules: { + "import/no-default-export": 0, + "import/unambiguous": 0, // vue SFC can miss script tags + "@typescript-eslint/prefer-readonly": 0, // can be used in template "vue/component-tags-order": [ "error", { order: ["template", "style", "script"], }, ], + "vue/multi-word-component-names": "off", "vue/no-mutating-props": "off", "vue/no-v-html": "off", "vue/require-default-prop": "off", "vue/v-slot-style": ["error", "longform"], - "vue/multi-word-component-names": "off", }, - plugins: ["vue"], - extends: ["eslint:recommended", "plugin:vue/recommended", "prettier"], -}; +}).rules; + +const tsRules = defineConfig({ + rules: { + // note you must disable the base rule as it can report incorrect errors + "no-shadow": "off", + "@typescript-eslint/no-shadow": ["error"], + }, +}).rules; + +const tsRulesTemp = defineConfig({ + rules: { + // TODO: eventually remove these + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", + "@typescript-eslint/no-unsafe-argument": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unused-vars": "off", + }, +}).rules; + +const tsTestRulesTemp = defineConfig({ + rules: { + // TODO: remove these + "@typescript-eslint/no-unsafe-return": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/restrict-plus-operands": "off", + }, +}).rules; + +module.exports = defineConfig({ + root: true, + parserOptions: { + ecmaVersion: 2022, + }, + overrides: [ + { + files: ["**/*.ts", "**/*.vue"], + parser: "@typescript-eslint/parser", + parserOptions: { + tsconfigRootDir: __dirname, + project: projects, + extraFileExtensions: [".vue"], + }, + plugins: ["@typescript-eslint"], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "prettier", + ], + rules: { + ...baseRules, + ...tsRules, + ...tsRulesTemp, + }, + }, + { + files: ["**/*.vue"], + parser: "vue-eslint-parser", + parserOptions: { + ecmaVersion: 2022, + ecmaFeatures: { + jsx: true, + }, + parser: "@typescript-eslint/parser", + tsconfigRootDir: __dirname, + project: projects, + }, + plugins: ["vue"], + extends: [ + "eslint:recommended", + "plugin:vue/vue3-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "prettier", + ], + rules: {...baseRules, ...tsRules, ...tsRulesTemp, ...vueRules}, + }, + { + files: ["./tests/**/*.ts"], + parser: "@typescript-eslint/parser", + rules: { + ...baseRules, + ...tsRules, + ...tsRulesTemp, + ...tsTestRulesTemp, + }, + }, + ], + env: { + es6: true, + browser: true, + mocha: true, + node: true, + }, + extends: ["eslint:recommended", "prettier"], + rules: baseRules, +}); diff --git a/.gitignore b/.gitignore index 348de645..2f36fb37 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ package-lock.json coverage/ public/ +dist/ diff --git a/.npmignore b/.npmignore index e902f20a..8df5322f 100644 --- a/.npmignore +++ b/.npmignore @@ -9,9 +9,9 @@ # Ignore client folder as it's being built into public/ folder # except for the specified files which are used by the server client/** -!client/js/constants.js -!client/js/helpers/ircmessageparser/findLinks.js -!client/js/helpers/ircmessageparser/cleanIrcMessage.js +!client/js/constants.ts +!client/js/helpers/ircmessageparser/findLinks.ts +!client/js/helpers/ircmessageparser/cleanIrcMessage.ts !client/index.html.tpl public/js/bundle.vendor.js.map @@ -22,3 +22,4 @@ appveyor.yml webpack.config*.js postcss.config.js renovate.json + diff --git a/.prettierignore b/.prettierignore index aa316e17..5dabdfae 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,10 @@ coverage/ public/ +dist/ test/fixtures/.thelounge/logs/ test/fixtures/.thelounge/certificates/ test/fixtures/.thelounge/storage/ - +test/fixtures/.thelounge/sts-policies.json *.log *.png *.svg diff --git a/.vscode/extensions.json b/.vscode/extensions.json index d401e0e3..6e4bf808 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,7 +3,8 @@ "EditorConfig.EditorConfig", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", - "octref.vetur" + "Vue.volar", + "Vue.vscode-typescript-vue-plugin" ], "unwantedRecommendations": [] } diff --git a/.vscode/settings.json b/.vscode/settings.json index d80731df..a7e07398 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,10 @@ { "editor.formatOnSave": true, - "vetur.format.enable": false, "prettier.useEditorConfig": true, "prettier.requireConfig": true, "prettier.disableLanguages": [], - "prettier.packageManager": "yarn", "eslint.packageManager": "yarn", - "eslint.codeActionsOnSave.mode": "all" + "eslint.codeActionsOnSave.mode": "all", + "[typescript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"}, + "[vue]": {"editor.defaultFormatter": "esbenp.prettier-vscode"} } diff --git a/README.md b/README.md index 8fb2fb62..31665ab7 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The Lounge is the official and community-managed fork of [Shout](https://github. ## Installation and usage The Lounge requires latest [Node.js](https://nodejs.org/) LTS version or more recent. -[Yarn package manager](https://yarnpkg.com/) is also recommended. +The [Yarn package manager](https://yarnpkg.com/) is also recommended. If you want to install with npm, `--unsafe-perm` is required for a correct install. ### Running stable releases @@ -85,5 +85,8 @@ Before submitting any change, make sure to: - Read the [Contributing instructions](https://github.com/thelounge/thelounge/blob/master/.github/CONTRIBUTING.md#contributing) - Run `yarn test` to execute linters and the test suite - Run `yarn format:prettier` if linting fails -- Run `yarn build` if you change or add anything in `client/js` or `client/components` +- Run `yarn build:client` if you change or add anything in `client/js` or `client/components` + - The built files will be output to `public/` by webpack +- Run `yarn build:server` if you change anything in `server/` + - The built files will be output to `dist/` by tsc - `yarn dev` can be used to start The Lounge with hot module reloading diff --git a/babel.config.cjs b/babel.config.cjs index 059d55ab..8554cbc5 100644 --- a/babel.config.cjs +++ b/babel.config.cjs @@ -1,3 +1,4 @@ module.exports = { - presets: [["@babel/env"]], + presets: [["@babel/preset-env", {bugfixes: true}], "babel-preset-typescript-vue3"], + plugins: ["@babel/plugin-transform-runtime"], }; diff --git a/client/components/App.vue b/client/components/App.vue index e02a10e7..61bbb3b7 100644 --- a/client/components/App.vue +++ b/client/components/App.vue @@ -1,13 +1,13 @@ - diff --git a/client/components/Channel.vue b/client/components/Channel.vue index 72551f9b..c21e55d2 100644 --- a/client/components/Channel.vue +++ b/client/components/Channel.vue @@ -1,4 +1,5 @@ - diff --git a/client/components/ChannelWrapper.vue b/client/components/ChannelWrapper.vue index 572881bc..380b52af 100644 --- a/client/components/ChannelWrapper.vue +++ b/client/components/ChannelWrapper.vue @@ -23,72 +23,90 @@ :data-type="channel.type" :aria-controls="'#chan-' + channel.id" :aria-selected="active" - :style="channel.closed ? {transition: 'none', opacity: 0.4} : null" + :style="channel.closed ? {transition: 'none', opacity: 0.4} : undefined" role="tab" @click="click" @contextmenu.prevent="openContextMenu" > - + - diff --git a/client/components/Chat.vue b/client/components/Chat.vue index 9838d1b6..f1dfc51b 100644 --- a/client/components/Chat.vue +++ b/client/components/Chat.vue @@ -3,10 +3,10 @@
@@ -95,7 +95,7 @@ {'scroll-down-shown': !channel.scrolledToBottom}, ]" aria-label="Jump to recent messages" - @click="$refs.messageList.jumpToBottom()" + @click="messageList?.jumpToBottom()" >
@@ -110,17 +110,17 @@
- {{ $store.state.currentUserVisibleError }} + {{ store.state.currentUserVisibleError }}
- diff --git a/client/components/ChatInput.vue b/client/components/ChatInput.vue index 401ee7ef..e89ef276 100644 --- a/client/components/ChatInput.vue +++ b/client/components/ChatInput.vue @@ -16,7 +16,7 @@ @blur="onBlur" /> - diff --git a/client/components/ChatUserList.vue b/client/components/ChatUserList.vue index 7eaa7c8b..ec3c971b 100644 --- a/client/components/ChatUserList.vue +++ b/client/components/ChatUserList.vue @@ -28,9 +28,10 @@
- diff --git a/client/components/ConfirmDialog.vue b/client/components/ConfirmDialog.vue index af92e368..17691cad 100644 --- a/client/components/ConfirmDialog.vue +++ b/client/components/ConfirmDialog.vue @@ -1,13 +1,13 @@ - diff --git a/client/components/JoinChannel.vue b/client/components/JoinChannel.vue index 129d5383..fa5eebc4 100644 --- a/client/components/JoinChannel.vue +++ b/client/components/JoinChannel.vue @@ -35,54 +35,59 @@ - diff --git a/client/components/LinkPreview.vue b/client/components/LinkPreview.vue index 9ae10b74..9a124ab8 100644 --- a/client/components/LinkPreview.vue +++ b/client/components/LinkPreview.vue @@ -129,137 +129,201 @@
- diff --git a/client/components/LinkPreviewFileSize.vue b/client/components/LinkPreviewFileSize.vue index 883df53d..5c577c1b 100644 --- a/client/components/LinkPreviewFileSize.vue +++ b/client/components/LinkPreviewFileSize.vue @@ -2,18 +2,21 @@ ({{ previewSize }}) - diff --git a/client/components/LinkPreviewToggle.vue b/client/components/LinkPreviewToggle.vue index 2b461066..24351ab7 100644 --- a/client/components/LinkPreviewToggle.vue +++ b/client/components/LinkPreviewToggle.vue @@ -7,23 +7,31 @@ /> - diff --git a/client/components/Mentions.vue b/client/components/Mentions.vue index 54759bff..63144948 100644 --- a/client/components/Mentions.vue +++ b/client/components/Mentions.vue @@ -20,20 +20,20 @@

Loading…

You have no recent mentions.

- - diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue index cd298a6c..1c5ce9b5 100644 --- a/client/components/MessageList.vue +++ b/client/components/MessageList.vue @@ -3,7 +3,7 @@