From 391d8a1beb0f0336e94ac8e7556ee8ce113f4d3e Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Sun, 8 Dec 2024 19:43:18 -0600 Subject: [PATCH] format --- .vscode/settings.json | 3 + biome.json | 30 ++++++++ bun.lockb | Bin 0 -> 127340 bytes package.json | 26 ++----- src/activity.ts | 147 +++++++++++++++++++++++++++++---------- src/constants.ts | 106 ++++++++++++++-------------- src/data/languages.json | 44 +++++++++--- src/extension.ts | 148 ++++++++++++++++++++++++++-------------- src/git.d.ts | 146 +++++++++++++++++++++------------------ src/logger.ts | 26 +++---- src/util.ts | 43 ++++++++---- webpack.config.js | 24 +++---- 12 files changed, 465 insertions(+), 278 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 biome.json create mode 100755 bun.lockb diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4f37590 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.defaultFormatter": "biomejs.biome" +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..2eb0751 --- /dev/null +++ b/biome.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..89c9bd6e2c47643f20cd11cb48b1b767c0dd4e3e GIT binary patch literal 127340 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 1000 ? size.toFixed(2) : size}${FILE_SIZES[currentDivision]}`, + `${originalSize > 1000 ? size.toFixed(2) : size}${ + FILE_SIZES[currentDivision] + }`, ); } @@ -80,7 +109,8 @@ async function fileDetails(_raw: string, document: TextDocument, selection: Sele if (git?.repositories.length) { raw = raw.replace( REPLACE_KEYS.GitBranch, - git.repositories.find((repo) => repo.ui.selected)?.state.HEAD?.name ?? FAKE_EMPTY, + git.repositories.find((repo) => repo.ui.selected)?.state.HEAD?.name ?? + FAKE_EMPTY, ); } else { raw = raw.replace(REPLACE_KEYS.GitBranch, UNKNOWN_GIT_BRANCH); @@ -93,8 +123,8 @@ async function fileDetails(_raw: string, document: TextDocument, selection: Sele REPLACE_KEYS.GitRepoName, git.repositories .find((repo) => repo.ui.selected) - ?.state.remotes[0].fetchUrl?.split('/')[1] - .replace('.git', '') ?? FAKE_EMPTY, + ?.state.remotes[0].fetchUrl?.split("/")[1] + .replace(".git", "") ?? FAKE_EMPTY, ); } else { raw = raw.replace(REPLACE_KEYS.GitRepoName, UNKNOWN_GIT_REPO_NAME); @@ -104,7 +134,11 @@ async function fileDetails(_raw: string, document: TextDocument, selection: Sele return raw; } -async function details(idling: CONFIG_KEYS, editing: CONFIG_KEYS, debugging: CONFIG_KEYS) { +async function details( + idling: CONFIG_KEYS, + editing: CONFIG_KEYS, + debugging: CONFIG_KEYS, +) { const config = getConfig(); let raw = (config[idling] as string).replace(REPLACE_KEYS.Empty, FAKE_EMPTY); @@ -114,12 +148,18 @@ async function details(idling: CONFIG_KEYS, editing: CONFIG_KEYS, debugging: CON const split = dir.split(sep); const dirName = split[split.length - 1]; - const noWorkspaceFound = config[CONFIG_KEYS.LowerDetailsNoWorkspaceFound].replace(REPLACE_KEYS.Empty, FAKE_EMPTY); - const workspaceFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); + const noWorkspaceFound = config[ + CONFIG_KEYS.LowerDetailsNoWorkspaceFound + ].replace(REPLACE_KEYS.Empty, FAKE_EMPTY); + const workspaceFolder = workspace.getWorkspaceFolder( + window.activeTextEditor.document.uri, + ); const workspaceFolderName = workspaceFolder?.name ?? noWorkspaceFound; - const workspaceName = workspace.name?.replace(REPLACE_KEYS.VSCodeWorkspace, EMPTY) ?? workspaceFolderName; + const workspaceName = + workspace.name?.replace(REPLACE_KEYS.VSCodeWorkspace, EMPTY) ?? + workspaceFolderName; const workspaceAndFolder = `${workspaceName}${ - workspaceFolderName === FAKE_EMPTY ? '' : ` - ${workspaceFolderName}` + workspaceFolderName === FAKE_EMPTY ? "" : ` - ${workspaceFolderName}` }`; const fileIcon = resolveFileIcon(window.activeTextEditor.document); @@ -132,15 +172,27 @@ async function details(idling: CONFIG_KEYS, editing: CONFIG_KEYS, debugging: CON if (workspaceFolder) { const { name } = workspaceFolder; - const relativePath = workspace.asRelativePath(window.activeTextEditor.document.fileName).split(sep); + const relativePath = workspace + .asRelativePath(window.activeTextEditor.document.fileName) + .split(sep); relativePath.splice(-1, 1); - raw = raw.replace(REPLACE_KEYS.FullDirName, `${name}${sep}${relativePath.join(sep)}`); + raw = raw.replace( + REPLACE_KEYS.FullDirName, + `${name}${sep}${relativePath.join(sep)}`, + ); } try { - raw = await fileDetails(raw, window.activeTextEditor.document, window.activeTextEditor.selection); + raw = await fileDetails( + raw, + window.activeTextEditor.document, + window.activeTextEditor.selection, + ); } catch (error) { - log(LogLevel.Error, `Failed to generate file details: ${error as string}`); + log( + LogLevel.Error, + `Failed to generate file details: ${error as string}`, + ); } raw = raw .replace(REPLACE_KEYS.FileName, fileName) @@ -163,10 +215,13 @@ export async function activity(previous: ActivityPayload = {}) { const appName = env.appName; const defaultSmallImageKey = debug.activeDebugSession ? DEBUG_IMAGE_KEY - : appName.includes('Insiders') - ? VSCODE_INSIDERS_IMAGE_KEY - : VSCODE_IMAGE_KEY; - const defaultSmallImageText = config[CONFIG_KEYS.SmallImage].replace(REPLACE_KEYS.AppName, appName); + : appName.includes("Insiders") + ? VSCODE_INSIDERS_IMAGE_KEY + : VSCODE_IMAGE_KEY; + const defaultSmallImageText = config[CONFIG_KEYS.SmallImage].replace( + REPLACE_KEYS.AppName, + appName, + ); const defaultLargeImageText = config[CONFIG_KEYS.LargeImageIdling]; const removeDetails = config[CONFIG_KEYS.RemoveDetails]; const removeLowerDetails = config[CONFIG_KEYS.RemoveLowerDetails]; @@ -177,8 +232,14 @@ export async function activity(previous: ActivityPayload = {}) { let state: ActivityPayload = { details: removeDetails ? undefined - : await details(CONFIG_KEYS.DetailsIdling, CONFIG_KEYS.DetailsEditing, CONFIG_KEYS.DetailsDebugging), - startTimestamp: config[CONFIG_KEYS.RemoveTimestamp] ? undefined : previous.startTimestamp ?? Date.now(), + : await details( + CONFIG_KEYS.DetailsIdling, + CONFIG_KEYS.DetailsEditing, + CONFIG_KEYS.DetailsDebugging, + ), + startTimestamp: config[CONFIG_KEYS.RemoveTimestamp] + ? undefined + : (previous.startTimestamp ?? Date.now()), largeImageKey: IDLE_IMAGE_KEY, largeImageText: defaultLargeImageText, smallImageKey: defaultSmallImageKey, @@ -196,18 +257,25 @@ export async function activity(previous: ActivityPayload = {}) { } if (!removeRemoteRepository && git?.repositories.length) { - let repo = git.repositories.find((repo) => repo.ui.selected)?.state.remotes[0]?.fetchUrl; + let repo = git.repositories.find((repo) => repo.ui.selected)?.state + .remotes[0]?.fetchUrl; if (repo) { - if (repo.startsWith('git@') || repo.startsWith('ssh://')) { - repo = repo.replace('ssh://', '').replace(':', '/').replace('git@', 'https://').replace('.git', ''); + if (repo.startsWith("git@") || repo.startsWith("ssh://")) { + repo = repo + .replace("ssh://", "") + .replace(":", "/") + .replace("git@", "https://") + .replace(".git", ""); } else { - repo = repo.replace(/(https:\/\/)([^@]*)@(.*?$)/, '$1$3').replace('.git', ''); + repo = repo + .replace(/(https:\/\/)([^@]*)@(.*?$)/, "$1$3") + .replace(".git", ""); } state = { ...state, - buttons: [{ label: 'View Repository', url: repo }], + buttons: [{ label: "View Repository", url: repo }], }; } } @@ -224,14 +292,18 @@ export async function activity(previous: ActivityPayload = {}) { ...state, details: removeDetails ? undefined - : await details(CONFIG_KEYS.DetailsIdling, CONFIG_KEYS.DetailsEditing, CONFIG_KEYS.DetailsDebugging), + : await details( + CONFIG_KEYS.DetailsIdling, + CONFIG_KEYS.DetailsEditing, + CONFIG_KEYS.DetailsDebugging, + ), state: removeLowerDetails ? undefined : await details( CONFIG_KEYS.LowerDetailsIdling, CONFIG_KEYS.LowerDetailsEditing, CONFIG_KEYS.LowerDetailsDebugging, - ), + ), }; if (swapBigAndSmallImage) { @@ -248,7 +320,10 @@ export async function activity(previous: ActivityPayload = {}) { }; } - log(LogLevel.Trace, `VSCode language id: ${window.activeTextEditor.document.languageId}`); + log( + LogLevel.Trace, + `VSCode language id: ${window.activeTextEditor.document.languageId}`, + ); } return state; diff --git a/src/constants.ts b/src/constants.ts index 84ddb8b..4f3575a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,61 +1,63 @@ -import LANG from './data/languages.json'; +import LANG from "./data/languages.json"; -export const CLIENT_ID = '383226320970055681' as const; +export const CLIENT_ID = "383226320970055681" as const; -export const KNOWN_EXTENSIONS: { [key: string]: { image: string } } = LANG.KNOWN_EXTENSIONS; -export const KNOWN_LANGUAGES: { language: string; image: string }[] = LANG.KNOWN_LANGUAGES; +export const KNOWN_EXTENSIONS: { [key: string]: { image: string } } = + LANG.KNOWN_EXTENSIONS; +export const KNOWN_LANGUAGES: { language: string; image: string }[] = + LANG.KNOWN_LANGUAGES; -export const EMPTY = '' as const; -export const FAKE_EMPTY = '\u200b\u200b' as const; -export const FILE_SIZES = [' bytes', 'KB', 'MB', 'GB', 'TB'] as const; +export const EMPTY = "" as const; +export const FAKE_EMPTY = "\u200b\u200b" as const; +export const FILE_SIZES = [" bytes", "KB", "MB", "GB", "TB"] as const; -export const IDLE_IMAGE_KEY = 'vscode-big' as const; -export const DEBUG_IMAGE_KEY = 'debug' as const; -export const VSCODE_IMAGE_KEY = 'vscode' as const; -export const VSCODE_INSIDERS_IMAGE_KEY = 'vscode-insiders' as const; +export const IDLE_IMAGE_KEY = "vscode-big" as const; +export const DEBUG_IMAGE_KEY = "debug" as const; +export const VSCODE_IMAGE_KEY = "vscode" as const; +export const VSCODE_INSIDERS_IMAGE_KEY = "vscode-insiders" as const; -export const UNKNOWN_GIT_BRANCH = 'Unknown' as const; -export const UNKNOWN_GIT_REPO_NAME = 'Unknown' as const; +export const UNKNOWN_GIT_BRANCH = "Unknown" as const; +export const UNKNOWN_GIT_REPO_NAME = "Unknown" as const; -export const enum REPLACE_KEYS { - Empty = '{empty}', - FileName = '{file_name}', - DirName = '{dir_name}', - FullDirName = '{full_dir_name}', - Workspace = '{workspace}', - VSCodeWorkspace = '(Workspace)', - WorkspaceFolder = '{workspace_folder}', - WorkspaceAndFolder = '{workspace_and_folder}', - LanguageLowerCase = '{lang}', - LanguageTitleCase = '{Lang}', - LanguageUpperCase = '{LANG}', - TotalLines = '{total_lines}', - CurrentLine = '{current_line}', - CurrentColumn = '{current_column}', - FileSize = '{file_size}', - AppName = '{app_name}', - GitRepoName = '{git_repo_name}', - GitBranch = '{git_branch}', +export enum REPLACE_KEYS { + Empty = "{empty}", + FileName = "{file_name}", + DirName = "{dir_name}", + FullDirName = "{full_dir_name}", + Workspace = "{workspace}", + VSCodeWorkspace = "(Workspace)", + WorkspaceFolder = "{workspace_folder}", + WorkspaceAndFolder = "{workspace_and_folder}", + LanguageLowerCase = "{lang}", + LanguageTitleCase = "{Lang}", + LanguageUpperCase = "{LANG}", + TotalLines = "{total_lines}", + CurrentLine = "{current_line}", + CurrentColumn = "{current_column}", + FileSize = "{file_size}", + AppName = "{app_name}", + GitRepoName = "{git_repo_name}", + GitBranch = "{git_branch}", } -export const enum CONFIG_KEYS { - Enabled = 'enabled', - DetailsIdling = 'detailsIdling', - DetailsEditing = 'detailsEditing', - DetailsDebugging = 'detailsDebugging', - LowerDetailsIdling = 'lowerDetailsIdling', - LowerDetailsEditing = 'lowerDetailsEditing', - LowerDetailsDebugging = 'lowerDetailsDebugging', - LowerDetailsNoWorkspaceFound = 'lowerDetailsNoWorkspaceFound', - LargeImageIdling = 'largeImageIdling', - LargeImage = 'largeImage', - SmallImage = 'smallImage', - SuppressNotifications = 'suppressNotifications', - WorkspaceExcludePatterns = 'workspaceExcludePatterns', - SwapBigAndSmallImage = 'swapBigAndSmallImage', - RemoveDetails = 'removeDetails', - RemoveLowerDetails = 'removeLowerDetails', - RemoveTimestamp = 'removeTimestamp', - RemoveRemoteRepository = 'removeRemoteRepository', - IdleTimeout = 'idleTimeout', +export enum CONFIG_KEYS { + Enabled = "enabled", + DetailsIdling = "detailsIdling", + DetailsEditing = "detailsEditing", + DetailsDebugging = "detailsDebugging", + LowerDetailsIdling = "lowerDetailsIdling", + LowerDetailsEditing = "lowerDetailsEditing", + LowerDetailsDebugging = "lowerDetailsDebugging", + LowerDetailsNoWorkspaceFound = "lowerDetailsNoWorkspaceFound", + LargeImageIdling = "largeImageIdling", + LargeImage = "largeImage", + SmallImage = "smallImage", + SuppressNotifications = "suppressNotifications", + WorkspaceExcludePatterns = "workspaceExcludePatterns", + SwapBigAndSmallImage = "swapBigAndSmallImage", + RemoveDetails = "removeDetails", + RemoveLowerDetails = "removeLowerDetails", + RemoveTimestamp = "removeTimestamp", + RemoveRemoteRepository = "removeRemoteRepository", + IdleTimeout = "idleTimeout", } diff --git a/src/data/languages.json b/src/data/languages.json index 6c6ba5a..56ea3a4 100644 --- a/src/data/languages.json +++ b/src/data/languages.json @@ -82,11 +82,15 @@ ".asmx": { "image": "asp" }, ".aspx": { "image": "asp" }, ".axd": { "image": "asp" }, - "/\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i": { "image": "assembly" }, + "/\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i": { + "image": "assembly" + }, ".agc": { "image": "assembly" }, ".ko": { "image": "assembly" }, ".lst": { "image": "assembly" }, - "/\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i": { "image": "assembly" }, + "/\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i": { + "image": "assembly" + }, ".d-objdump": { "image": "assembly" }, "/\\.gcode|\\.gco/i": { "image": "assembly" }, "/\\.rpy[bc]$/i": { "image": "assembly" }, @@ -150,7 +154,9 @@ ".dm": { "image": "dm" }, ".dme": { "image": "dm" }, ".dmm": { "image": "dm" }, - "/^(Dockerfile|docker-compose)|\\.docker(file|ignore)$/i": { "image": "docker" }, + "/^(Dockerfile|docker-compose)|\\.docker(file|ignore)$/i": { + "image": "docker" + }, "/^docker-sync\\.yml$/i": { "image": "docker" }, ".editorconfig": { "image": "editorconfig" }, ".ejs": { "image": "ejs" }, @@ -274,13 +280,19 @@ "/^pkginfo$/": { "image": "manifest" }, "/^mime\\.types$/i": { "image": "manifest" }, "/^METADATA\\.pb$/": { "image": "manifest" }, - "/[\\/\\\\](?:magic[\\/\\\\]Magdir|file[\\/\\\\]magic)[\\/\\\\][-.\\w]+$/i": { "image": "manifest" }, - "/(\\\\|\\/)dev[-\\w]+\\1(?:[^\\\\\\/]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$/": { "image": "manifest" }, + "/[\\/\\\\](?:magic[\\/\\\\]Magdir|file[\\/\\\\]magic)[\\/\\\\][-.\\w]+$/i": { + "image": "manifest" + }, + "/(\\\\|\\/)dev[-\\w]+\\1(?:[^\\\\\\/]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$/": { + "image": "manifest" + }, "lib/icons/.icondb.js": { "image": "manifest" }, "/\\.git[\\/\\\\](.*[\\/\\\\])?(HEAD|ORIG_HEAD|packed-refs|logs[\\/\\\\](.+[\\/\\\\])?[^\\/\\\\]+)$/": { "image": "manifest" }, - "/\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i": { "image": "markdown" }, + "/\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i": { + "image": "markdown" + }, ".mdx": { "image": "markdownx" }, ".marko": { "image": "marko" }, ".nim": { "image": "nim" }, @@ -329,7 +341,9 @@ ".psm1": { "image": "powershell" }, ".ps1xml": { "image": "powershell" }, ".prettierignore": { "image": "prettier" }, - "/\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?$){2}/i": { "image": "prettier" }, + "/\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?$){2}/i": { + "image": "prettier" + }, "prettier.config.js": { "image": "prettier" }, "prisma.yml": { "image": "prisma" }, ".pde": { "image": "processing" }, @@ -359,7 +373,9 @@ "/\\.(r|Rprofile|rsx|rd)$/i": { "image": "r" }, ".rkt": { "image": "racket" }, "/\\.res?i?$/i": { "image": "reasonml" }, - "/\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i": { "image": "ruby" }, + "/\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i": { + "image": "ruby" + }, "/^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$/i": { "image": "ruby" }, "/^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$/": { "image": "ruby" @@ -377,13 +393,19 @@ }, "/\\.(ksh|mksh|pdksh)$/i": { "image": "shell" }, ".sh-session": { "image": "shell" }, - "/\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i": { "image": "shell" }, + "/\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i": { + "image": "shell" + }, "/\\.fish$|^\\.fishrc$/i": { "image": "shell" }, "/^\\.?(login|profile)$/": { "image": "shell" }, ".inputrc": { "image": "shell" }, ".tmux": { "image": "shell" }, - "/^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/": { "image": "shell" }, - "/^\\/(private\\/)?etc\\/([^\\/]+\\/)*(profile$|nanorc$|rc\\.|csh\\.)/i": { "image": "shell" }, + "/^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/": { + "image": "shell" + }, + "/^\\/(private\\/)?etc\\/([^\\/]+\\/)*(profile$|nanorc$|rc\\.|csh\\.)/i": { + "image": "shell" + }, "/^\\.?cshrc$/i": { "image": "shell" }, ".profile": { "image": "shell" }, ".tcsh": { "image": "shell" }, diff --git a/src/extension.ts b/src/extension.ts index 4f58f44..343188a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,28 +1,40 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ -const { Client } = require('discord-rpc'); // eslint-disable-line -import { commands, ExtensionContext, StatusBarAlignment, StatusBarItem, window, workspace, debug } from 'vscode'; -import throttle from 'lodash-es/throttle'; +const { Client } = require("discord-rpc"); // eslint-disable-line +import throttle from "lodash-es/throttle"; +import { + type ExtensionContext, + StatusBarAlignment, + type StatusBarItem, + commands, + debug, + window, + workspace, +} from "vscode"; -import { activity } from './activity'; -import { CLIENT_ID, CONFIG_KEYS } from './constants'; -import { log, LogLevel } from './logger'; -import { getConfig, getGit } from './util'; +import { activity } from "./activity"; +import { CLIENT_ID, CONFIG_KEYS } from "./constants"; +import { LogLevel, log } from "./logger"; +import { getConfig, getGit } from "./util"; -const statusBarIcon: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left); -statusBarIcon.text = '$(pulse) Connecting to Discord...'; +const statusBarIcon: StatusBarItem = window.createStatusBarItem( + StatusBarAlignment.Left, +); +statusBarIcon.text = "$(pulse) Connecting to Discord..."; // eslint-disable-next-line -let rpc = new Client({ transport: 'ipc' }); +let rpc = new Client({ transport: "ipc" }); const config = getConfig(); let state = {}; let idle: NodeJS.Timeout | undefined; -let listeners: { dispose: () => any }[] = []; +let listeners: { dispose: () => void }[] = []; export function cleanUp() { // eslint-disable-next-line @typescript-eslint/no-unsafe-return - listeners.forEach((listener) => listener.dispose()); + for (const listener of listeners) { + listener.dispose(); + } listeners = []; } @@ -34,50 +46,70 @@ async function sendActivity() { } async function login() { - log(LogLevel.Info, 'Creating discord-rpc client'); - rpc = new Client({ transport: 'ipc' }); + log(LogLevel.Info, "Creating discord-rpc client"); + rpc = new Client({ transport: "ipc" }); - rpc.on('ready', () => { - log(LogLevel.Info, 'Successfully connected to Discord'); + rpc.on("ready", () => { + log(LogLevel.Info, "Successfully connected to Discord"); cleanUp(); - statusBarIcon.text = '$(globe) Connected to Discord'; - statusBarIcon.tooltip = 'Connected to Discord'; + statusBarIcon.text = "$(globe) Connected to Discord"; + statusBarIcon.tooltip = "Connected to Discord"; void sendActivity(); - const onChangeActiveTextEditor = window.onDidChangeActiveTextEditor(() => sendActivity()); - const onChangeTextDocument = workspace.onDidChangeTextDocument(throttle(() => sendActivity(), 2000)); - const onStartDebugSession = debug.onDidStartDebugSession(() => sendActivity()); - const onTerminateDebugSession = debug.onDidTerminateDebugSession(() => sendActivity()); + const onChangeActiveTextEditor = window.onDidChangeActiveTextEditor(() => + sendActivity(), + ); + const onChangeTextDocument = workspace.onDidChangeTextDocument( + throttle(() => sendActivity(), 2000), + ); + const onStartDebugSession = debug.onDidStartDebugSession(() => + sendActivity(), + ); + const onTerminateDebugSession = debug.onDidTerminateDebugSession(() => + sendActivity(), + ); - listeners.push(onChangeActiveTextEditor, onChangeTextDocument, onStartDebugSession, onTerminateDebugSession); + listeners.push( + onChangeActiveTextEditor, + onChangeTextDocument, + onStartDebugSession, + onTerminateDebugSession, + ); }); - rpc.on('disconnected', () => { + rpc.on("disconnected", () => { cleanUp(); rpc.destroy(); - statusBarIcon.text = '$(pulse) Reconnect to Discord'; - statusBarIcon.command = 'discord.reconnect'; + statusBarIcon.text = "$(pulse) Reconnect to Discord"; + statusBarIcon.command = "discord.reconnect"; }); try { await rpc.login({ clientId: CLIENT_ID }); } catch (error) { - log(LogLevel.Error, `Encountered following error while trying to login:\n${error as string}`); + log( + LogLevel.Error, + `Encountered following error while trying to login:\n${error as string}`, + ); cleanUp(); rpc.destroy(); if (!config[CONFIG_KEYS.SuppressNotifications]) { // @ts-expect-error - if (error?.message?.includes('ENOENT')) void window.showErrorMessage('No Discord client detected'); - else void window.showErrorMessage(`Couldn't connect to Discord via RPC: ${error as string}`); + if (error?.message?.includes("ENOENT")) + void window.showErrorMessage("No Discord client detected"); + else + void window.showErrorMessage( + `Couldn't connect to Discord via RPC: ${error as string}`, + ); } - statusBarIcon.text = '$(pulse) Reconnect to Discord'; - statusBarIcon.command = 'discord.reconnect'; + statusBarIcon.text = "$(pulse) Reconnect to Discord"; + statusBarIcon.command = "discord.reconnect"; } } export async function activate(context: ExtensionContext) { - log(LogLevel.Info, 'Discord Presence activated'); + log(LogLevel.Info, "Discord Presence activated"); let isWorkspaceExcluded = false; for (const pattern of config[CONFIG_KEYS.WorkspaceExcludePatterns]) { @@ -93,52 +125,62 @@ export async function activate(context: ExtensionContext) { const enable = async (update = true) => { if (update) { try { - await config.update('enabled', true); + await config.update("enabled", true); } catch {} } - log(LogLevel.Info, 'Enable: Cleaning up old listeners'); + log(LogLevel.Info, "Enable: Cleaning up old listeners"); cleanUp(); - statusBarIcon.text = '$(pulse) Connecting to Discord...'; + statusBarIcon.text = "$(pulse) Connecting to Discord..."; statusBarIcon.show(); - log(LogLevel.Info, 'Enable: Attempting to recreate login'); + log(LogLevel.Info, "Enable: Attempting to recreate login"); void login(); }; const disable = async (update = true) => { if (update) { try { - await config.update('enabled', false); + await config.update("enabled", false); } catch {} } - log(LogLevel.Info, 'Disable: Cleaning up old listeners'); + log(LogLevel.Info, "Disable: Cleaning up old listeners"); cleanUp(); void rpc?.destroy(); - log(LogLevel.Info, 'Disable: Destroyed the rpc instance'); + log(LogLevel.Info, "Disable: Destroyed the rpc instance"); statusBarIcon.hide(); }; - const enabler = commands.registerCommand('discord.enable', async () => { + const enabler = commands.registerCommand("discord.enable", async () => { await disable(); await enable(); - await window.showInformationMessage('Enabled Discord Presence for this workspace'); + await window.showInformationMessage( + "Enabled Discord Presence for this workspace", + ); }); - const disabler = commands.registerCommand('discord.disable', async () => { + const disabler = commands.registerCommand("discord.disable", async () => { await disable(); - await window.showInformationMessage('Disabled Discord Presence for this workspace'); + await window.showInformationMessage( + "Disabled Discord Presence for this workspace", + ); }); - const reconnecter = commands.registerCommand('discord.reconnect', async () => { - await disable(false); - await enable(false); - }); + const reconnecter = commands.registerCommand( + "discord.reconnect", + async () => { + await disable(false); + await enable(false); + }, + ); - const disconnect = commands.registerCommand('discord.disconnect', async () => { - await disable(false); - statusBarIcon.text = '$(pulse) Reconnect to Discord'; - statusBarIcon.command = 'discord.reconnect'; - statusBarIcon.show(); - }); + const disconnect = commands.registerCommand( + "discord.disconnect", + async () => { + await disable(false); + statusBarIcon.text = "$(pulse) Reconnect to Discord"; + statusBarIcon.command = "discord.reconnect"; + statusBarIcon.show(); + }, + ); context.subscriptions.push(enabler, disabler, reconnecter, disconnect); diff --git a/src/git.d.ts b/src/git.d.ts index d9892ac..6fdce9e 100644 --- a/src/git.d.ts +++ b/src/git.d.ts @@ -12,8 +12,8 @@ * -------------------------------------------------------------------------------------------- */ -import { Uri, Event, Disposable, ProviderResult } from 'vscode'; -export { ProviderResult } from 'vscode'; +import type { Disposable, Event, ProviderResult, Uri } from "vscode"; +export { ProviderResult } from "vscode"; export interface Git { readonly path: string; @@ -23,15 +23,15 @@ export interface InputBox { value: string; } -export const enum ForcePushMode { - Force, - ForceWithLease, +export enum ForcePushMode { + Force = "Force", + ForceWithLease = "ForceWithLease", } -export const enum RefType { - Head, - RemoteHead, - Tag, +export enum RefType { + Head = "Head", + RemoteHead = "RemoteHead", + Tag = "Tag", } export interface Ref { @@ -75,26 +75,26 @@ export interface Remote { readonly isReadOnly: boolean; } -export const enum Status { - INDEX_MODIFIED, - INDEX_ADDED, - INDEX_DELETED, - INDEX_RENAMED, - INDEX_COPIED, +export enum Status { + INDEX_MODIFIED = "INDEX_MODIFIED", + INDEX_ADDED = "INDEX_ADDED", + INDEX_DELETED = "INDEX_DELETED", + INDEX_RENAMED = "INDEX_RENAMED", + INDEX_COPIED = "INDEX_COPIED", - MODIFIED, - DELETED, - UNTRACKED, - IGNORED, - INTENT_TO_ADD, + MODIFIED = "MODIFIED", + DELETED = "DELETED", + UNTRACKED = "UNTRACKED", + IGNORED = "IGNORED", + INTENT_TO_ADD = "INTENT_TO_ADD", - ADDED_BY_US, - ADDED_BY_THEM, - DELETED_BY_US, - DELETED_BY_THEM, - BOTH_ADDED, - BOTH_DELETED, - BOTH_MODIFIED, + ADDED_BY_US = "ADDED_BY_US", + ADDED_BY_THEM = "ADDED_BY_THEM", + DELETED_BY_US = "DELETED_BY_US", + DELETED_BY_THEM = "DELETED_BY_THEM", + BOTH_ADDED = "BOTH_ADDED", + BOTH_DELETED = "BOTH_DELETED", + BOTH_MODIFIED = "BOTH_MODIFIED", } export interface Change { @@ -138,7 +138,7 @@ export interface LogOptions { } export interface CommitOptions { - all?: boolean | 'tracked'; + all?: boolean | "tracked"; amend?: boolean; signoff?: boolean; signCommit?: boolean; @@ -173,8 +173,13 @@ export interface Repository { setConfig(key: string, value: string): Promise; getGlobalConfig(key: string): Promise; - getObjectDetails(treeish: string, path: string): Promise<{ mode: string; object: string; size: number }>; - detectObjectType(object: string): Promise<{ mimetype: string; encoding?: string }>; + getObjectDetails( + treeish: string, + path: string, + ): Promise<{ mode: string; object: string; size: number }>; + detectObjectType( + object: string, + ): Promise<{ mimetype: string; encoding?: string }>; buffer(ref: string, path: string): Promise; show(ref: string, path: string): Promise; getCommit(ref: string): Promise; @@ -215,7 +220,12 @@ export interface Repository { fetch(options?: FetchOptions): Promise; fetch(remote?: string, ref?: string, depth?: number): Promise; pull(unshallow?: boolean): Promise; - push(remoteName?: string, branchName?: string, setUpstream?: boolean, force?: ForcePushMode): Promise; + push( + remoteName?: string, + branchName?: string, + setUpstream?: boolean, + force?: ForcePushMode, + ): Promise; blame(path: string): Promise; log(options?: LogOptions): Promise; @@ -256,7 +266,7 @@ export interface PushErrorHandler { ): Promise; } -export type APIState = 'uninitialized' | 'initialized'; +export type APIState = "uninitialized" | "initialized"; export interface PublishEvent { repository: Repository; @@ -299,40 +309,40 @@ export interface GitExtension { getAPI(version: 1): API; } -export const enum GitErrorCodes { - BadConfigFile = 'BadConfigFile', - AuthenticationFailed = 'AuthenticationFailed', - NoUserNameConfigured = 'NoUserNameConfigured', - NoUserEmailConfigured = 'NoUserEmailConfigured', - NoRemoteRepositorySpecified = 'NoRemoteRepositorySpecified', - NotAGitRepository = 'NotAGitRepository', - NotAtRepositoryRoot = 'NotAtRepositoryRoot', - Conflict = 'Conflict', - StashConflict = 'StashConflict', - UnmergedChanges = 'UnmergedChanges', - PushRejected = 'PushRejected', - RemoteConnectionError = 'RemoteConnectionError', - DirtyWorkTree = 'DirtyWorkTree', - CantOpenResource = 'CantOpenResource', - GitNotFound = 'GitNotFound', - CantCreatePipe = 'CantCreatePipe', - PermissionDenied = 'PermissionDenied', - CantAccessRemote = 'CantAccessRemote', - RepositoryNotFound = 'RepositoryNotFound', - RepositoryIsLocked = 'RepositoryIsLocked', - BranchNotFullyMerged = 'BranchNotFullyMerged', - NoRemoteReference = 'NoRemoteReference', - InvalidBranchName = 'InvalidBranchName', - BranchAlreadyExists = 'BranchAlreadyExists', - NoLocalChanges = 'NoLocalChanges', - NoStashFound = 'NoStashFound', - LocalChangesOverwritten = 'LocalChangesOverwritten', - NoUpstreamBranch = 'NoUpstreamBranch', - IsInSubmodule = 'IsInSubmodule', - WrongCase = 'WrongCase', - CantLockRef = 'CantLockRef', - CantRebaseMultipleBranches = 'CantRebaseMultipleBranches', - PatchDoesNotApply = 'PatchDoesNotApply', - NoPathFound = 'NoPathFound', - UnknownPath = 'UnknownPath', +export enum GitErrorCodes { + BadConfigFile = "BadConfigFile", + AuthenticationFailed = "AuthenticationFailed", + NoUserNameConfigured = "NoUserNameConfigured", + NoUserEmailConfigured = "NoUserEmailConfigured", + NoRemoteRepositorySpecified = "NoRemoteRepositorySpecified", + NotAGitRepository = "NotAGitRepository", + NotAtRepositoryRoot = "NotAtRepositoryRoot", + Conflict = "Conflict", + StashConflict = "StashConflict", + UnmergedChanges = "UnmergedChanges", + PushRejected = "PushRejected", + RemoteConnectionError = "RemoteConnectionError", + DirtyWorkTree = "DirtyWorkTree", + CantOpenResource = "CantOpenResource", + GitNotFound = "GitNotFound", + CantCreatePipe = "CantCreatePipe", + PermissionDenied = "PermissionDenied", + CantAccessRemote = "CantAccessRemote", + RepositoryNotFound = "RepositoryNotFound", + RepositoryIsLocked = "RepositoryIsLocked", + BranchNotFullyMerged = "BranchNotFullyMerged", + NoRemoteReference = "NoRemoteReference", + InvalidBranchName = "InvalidBranchName", + BranchAlreadyExists = "BranchAlreadyExists", + NoLocalChanges = "NoLocalChanges", + NoStashFound = "NoStashFound", + LocalChangesOverwritten = "LocalChangesOverwritten", + NoUpstreamBranch = "NoUpstreamBranch", + IsInSubmodule = "IsInSubmodule", + WrongCase = "WrongCase", + CantLockRef = "CantLockRef", + CantRebaseMultipleBranches = "CantRebaseMultipleBranches", + PatchDoesNotApply = "PatchDoesNotApply", + NoPathFound = "NoPathFound", + UnknownPath = "UnknownPath", } diff --git a/src/logger.ts b/src/logger.ts index 5e8e8c5..749ce5b 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,22 +1,24 @@ -import { window } from 'vscode'; -import dayjs from 'dayjs'; +import dayjs from "dayjs"; +import { window } from "vscode"; -const outputChannel = window.createOutputChannel('Discord Presence'); +const outputChannel = window.createOutputChannel("Discord Presence"); -export const enum LogLevel { - Trace = 'TRACE', - Debug = 'DEBUG', - Info = 'INFO', - Warn = 'WARN', - Error = 'ERROR', +export enum LogLevel { + Trace = "TRACE", + Debug = "DEBUG", + Info = "INFO", + Warn = "WARN", + Error = "ERROR", } function send(level: string, message: string) { - outputChannel.appendLine(`[${dayjs().format('DD/MM/YYYY HH:mm:ss')} - ${level}] ${message}`); + outputChannel.appendLine( + `[${dayjs().format("DD/MM/YYYY HH:mm:ss")} - ${level}] ${message}`, + ); } export function log(level: LogLevel, message: string | Error) { - if (typeof message === 'string') { + if (typeof message === "string") { send(level, message); } else if (message instanceof Error) { send(level, message.message); @@ -24,7 +26,7 @@ export function log(level: LogLevel, message: string | Error) { if (message.stack) { send(level, message.stack); } - } else if (typeof message === 'object') { + } else if (typeof message === "object") { try { const json = JSON.stringify(message, null, 2); send(level, json); diff --git a/src/util.ts b/src/util.ts index 9bd24df..c9090c9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,9 +1,14 @@ -import { basename } from 'path'; -import { TextDocument, workspace, extensions, WorkspaceConfiguration } from 'vscode'; +import { basename } from "node:path"; +import { + type TextDocument, + type WorkspaceConfiguration, + extensions, + workspace, +} from "vscode"; -import { KNOWN_EXTENSIONS, KNOWN_LANGUAGES } from './constants'; -import type { API, GitExtension } from './git'; -import { log, LogLevel } from './logger'; +import { KNOWN_EXTENSIONS, KNOWN_LANGUAGES } from "./constants"; +import type { API, GitExtension } from "./git"; +import { LogLevel, log } from "./logger"; let git: API | null | undefined; @@ -30,14 +35,17 @@ type WorkspaceExtensionConfiguration = WorkspaceConfiguration & { }; export function getConfig() { - return workspace.getConfiguration('discord') as WorkspaceExtensionConfiguration; + return workspace.getConfiguration( + "discord", + ) as WorkspaceExtensionConfiguration; } export const toLower = (str: string) => str.toLocaleLowerCase(); export const toUpper = (str: string) => str.toLocaleUpperCase(); -export const toTitle = (str: string) => toLower(str).replace(/^\w/, (c) => toUpper(c)); +export const toTitle = (str: string) => + toLower(str).replace(/^\w/, (c) => toUpper(c)); export function resolveFileIcon(document: TextDocument) { const filename = basename(document.fileName); @@ -54,14 +62,16 @@ export function resolveFileIcon(document: TextDocument) { const regex = new RegExp(match[1], match[2]); return regex.test(filename); }); - const findKnownLanguage = KNOWN_LANGUAGES.find((key) => key.language === document.languageId); + const findKnownLanguage = KNOWN_LANGUAGES.find( + (key) => key.language === document.languageId, + ); const fileIcon = findKnownExtension ? KNOWN_EXTENSIONS[findKnownExtension] : findKnownLanguage - ? findKnownLanguage.image - : null; + ? findKnownLanguage.image + : null; - return typeof fileIcon === 'string' ? fileIcon : fileIcon?.image ?? 'text'; + return typeof fileIcon === "string" ? fileIcon : (fileIcon?.image ?? "text"); } export async function getGit() { @@ -70,16 +80,19 @@ export async function getGit() { } try { - log(LogLevel.Debug, 'Loading git extension'); - const gitExtension = extensions.getExtension('vscode.git'); + log(LogLevel.Debug, "Loading git extension"); + const gitExtension = extensions.getExtension("vscode.git"); if (!gitExtension?.isActive) { - log(LogLevel.Trace, 'Git extension not activated, activating...'); + log(LogLevel.Trace, "Git extension not activated, activating..."); await gitExtension?.activate(); } git = gitExtension?.exports.getAPI(1); } catch (error) { git = null; - log(LogLevel.Error, `Failed to load git extension, is git installed?; ${error as string}`); + log( + LogLevel.Error, + `Failed to load git extension, is git installed?; ${error as string}`, + ); } return git; diff --git a/webpack.config.js b/webpack.config.js index 349b25f..e34ab4a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,25 +1,25 @@ /* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable @typescript-eslint/no-require-imports */ -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const path = require('path'); +const { CleanWebpackPlugin } = require("clean-webpack-plugin"); +const TerserPlugin = require("terser-webpack-plugin"); +const path = require("node:path"); /** @type {import('webpack').Configuration} */ module.exports = { - target: 'node', - entry: './src/extension.ts', + target: "node", + entry: "./src/extension.ts", output: { - filename: 'extension.js', - libraryTarget: 'commonjs2', - path: path.resolve(process.cwd(), 'dist'), + filename: "extension.js", + libraryTarget: "commonjs2", + path: path.resolve(process.cwd(), "dist"), }, - devtool: 'source-map', + devtool: "source-map", externals: { - vscode: 'commonjs vscode', + vscode: "commonjs vscode", }, resolve: { - extensions: ['.ts', '.js', '.json'], + extensions: [".ts", ".js", ".json"], }, plugins: [new CleanWebpackPlugin()], optimization: { @@ -42,7 +42,7 @@ module.exports = { rules: [ { test: /\.ts$/, - use: 'ts-loader', + use: "ts-loader", exclude: /node_modules/, }, ],