Initial Release
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
*.vsix
|
||||||
|
*.js
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2026 bakonpancakz
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# ⌚ `trackpad`
|
||||||
|
Visual Studio Code Extension that displays your current [Wakatime](https://wakatime.com/) and Lines of Code as your Discord Activity. So you can finally prove to all your friends that you are, in fact, a 10x dev.
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="preview.jpg" height=320>
|
||||||
|
<h6 align="center">yep thats my profile</h6>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🚀 Setup
|
||||||
|
If you trust me, you can grab the compiled extension from the [Releases](/releases) tab. Or if you're rightfully paranoid (respect), you can install dependencies and build it yourself:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
After installion search for `Trackpad` in your VS Code settings and paste in your Wakatime API key.
|
||||||
|
Otherwise, it'll always show **0s**, and everyone will think you're a *pleb*.
|
||||||
|
|
||||||
|
*Note: This extension doesn't actually track anything so you'll still need the [Wakatime Extension](https://wakatime.com/vs-code)*
|
||||||
|
|
||||||
|
*Double Note: Your Discord activity updates every five minutes in order to keep overhead low. If it's too slow, open the Command Palette and run `Trackpad: Refresh Discord Rich Presence`*
|
||||||
|
|
||||||
|
|
||||||
|
### 🔧 Configuration
|
||||||
|
You can customize the Discord Activity Details and State fields using simple templates:
|
||||||
|
```yaml
|
||||||
|
{workspace.name} : trackpad
|
||||||
|
{workspace.loc} : 1,234
|
||||||
|
{wakatime.decimal} : 1.5
|
||||||
|
{wakatime.digital} : 1:30
|
||||||
|
{wakatime.seconds} : 5400
|
||||||
|
{wakatime.text} : 1hr 30mins
|
||||||
|
```
|
||||||
|
All configuration can be done in your VS Code settings UI or directly in settings.json.
|
||||||
|
|
||||||
|
Heres the defaults in-case you lost them:
|
||||||
|
```json
|
||||||
|
"trackpad.activityDetails": "Project: {workspace.name}",
|
||||||
|
"trackpad.activityState": "{workspace.loc} LOC - {wakatime.text}",
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 💡 Bonus
|
||||||
|
If you also stan Teto, throw this in your settings.json:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"trackpad.overrideSmallText": "Science!",
|
||||||
|
"trackpad.overrideSmallIcon": "https://c.pancakz.net/images/teto_science.gif",
|
||||||
|
```
|
||||||
+185
@@ -0,0 +1,185 @@
|
|||||||
|
import discord from "discord-rpc";
|
||||||
|
import vscode from "vscode";
|
||||||
|
import fs from "fs/promises";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
type WakatimeTotal = {
|
||||||
|
decimal: string; // 1.23
|
||||||
|
digital: string; // 1:23
|
||||||
|
seconds: number; // 123.456
|
||||||
|
text: string; // 1 hr 4 mins
|
||||||
|
}
|
||||||
|
|
||||||
|
const
|
||||||
|
DISCORD_CLIENT_ID = "1323609388442849280",
|
||||||
|
DISCORD_RPC = new discord.Client({ transport: "ipc" }),
|
||||||
|
APP_CONFIG = vscode.workspace.getConfiguration("trackpad"),
|
||||||
|
APP_CACHE_LOC: Record<string, { modtime: number; count: number; }> = {},
|
||||||
|
DEFAULT_WAKATIME_DATA: WakatimeTotal = {
|
||||||
|
"decimal": "0",
|
||||||
|
"digital": "0:00",
|
||||||
|
"seconds": 0.00,
|
||||||
|
"text": "0s",
|
||||||
|
}
|
||||||
|
|
||||||
|
discord.register(DISCORD_CLIENT_ID)
|
||||||
|
|
||||||
|
/** Calculate the Lines of Code for a Given Directory */
|
||||||
|
async function directoryCountLOC(
|
||||||
|
rootDirectory: string,
|
||||||
|
allowedExtensions: Set<string>,
|
||||||
|
ignoredDirectories: Set<string>,
|
||||||
|
): Promise<number> {
|
||||||
|
|
||||||
|
// Scan Directory Recursively
|
||||||
|
let totalCount = 0
|
||||||
|
async function checkDirectory(directory: string) {
|
||||||
|
const entries = await fs.readdir(directory, { withFileTypes: true })
|
||||||
|
for await (const file of entries) {
|
||||||
|
const filepath = path.join(directory, file.name)
|
||||||
|
|
||||||
|
// Sanity Checks
|
||||||
|
if (file.isSymbolicLink()) continue
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
if (ignoredDirectories.has(file.name)) continue
|
||||||
|
await checkDirectory(filepath)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (!file.isFile()) continue
|
||||||
|
if (!allowedExtensions.has(path.extname(file.name))) continue
|
||||||
|
|
||||||
|
// Use Cache if file was unmodified
|
||||||
|
const filestat = await fs.stat(filepath)
|
||||||
|
const cached = APP_CACHE_LOC[filepath]
|
||||||
|
if (cached && cached.modtime == filestat.mtimeMs) {
|
||||||
|
totalCount += cached.count
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate LOC for Document
|
||||||
|
const lineCount = (await fs.readFile(filepath, "utf8"))
|
||||||
|
.replaceAll(/\/\*[\s\S]*?\*\//g, "") // Ignore Comments: Multiline
|
||||||
|
.split("\n")
|
||||||
|
.filter(l => l.length !== 0) // Ignore Empty Lines
|
||||||
|
.filter(l => !l.startsWith("#")) // Ignore Comments: Python
|
||||||
|
.filter(l => !l.startsWith("//")) // Ignore Comments: JavaScript
|
||||||
|
.filter(l => !l.startsWith("--")) // Ignore Comments: SQL
|
||||||
|
.filter(l => !l.startsWith("@REM")) // Ignore Comments: Batch
|
||||||
|
.length
|
||||||
|
|
||||||
|
// Cache and Append Result
|
||||||
|
APP_CACHE_LOC[filepath] = {
|
||||||
|
modtime: filestat.mtimeMs,
|
||||||
|
count: lineCount,
|
||||||
|
}
|
||||||
|
totalCount += lineCount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await checkDirectory(rootDirectory)
|
||||||
|
return totalCount
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fetch Todays Cummulative Time from Wakatime API */
|
||||||
|
async function wakatimeFetchSummary(apiKey?: string): Promise<WakatimeTotal> {
|
||||||
|
if (!apiKey) return DEFAULT_WAKATIME_DATA
|
||||||
|
try {
|
||||||
|
// Fetch Data from API
|
||||||
|
const today = new Date()
|
||||||
|
const range = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`
|
||||||
|
const response = await fetch(
|
||||||
|
`https://wakatime.com/api/v1/users/current/summaries?start=${range}&end=${range}`, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Basic ${btoa(apiKey)}`
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if (response.status >= 200 && response.status <= 299) {
|
||||||
|
// Parse Content
|
||||||
|
const data: any = await response.json()
|
||||||
|
return data?.cumulative_total ?? DEFAULT_WAKATIME_DATA
|
||||||
|
} else {
|
||||||
|
vscode.window.showErrorMessage(`Wakatime API Returned Status Code ${response.status}\n`)
|
||||||
|
return DEFAULT_WAKATIME_DATA
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
// Fatal Network Error
|
||||||
|
vscode.window.showErrorMessage(`Wakatime Error: ${err}`)
|
||||||
|
return DEFAULT_WAKATIME_DATA
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use Templates and Setup Discord Rich Presence */
|
||||||
|
async function updateRPC() {
|
||||||
|
let activityDetails = "Idle"
|
||||||
|
let activityState: string | undefined
|
||||||
|
|
||||||
|
const workspaceFolders = vscode.workspace.workspaceFolders
|
||||||
|
if (workspaceFolders && workspaceFolders.length > 0) {
|
||||||
|
|
||||||
|
// Prepare Template Data
|
||||||
|
const workspaceName = vscode.workspace.name ?? path.basename(workspaceFolders[0].uri.fsPath)
|
||||||
|
let workspaceLOC = 0
|
||||||
|
for await (const folder of workspaceFolders) {
|
||||||
|
workspaceLOC += await directoryCountLOC(
|
||||||
|
folder.uri.fsPath,
|
||||||
|
new Set<string>(APP_CONFIG.get("allowedExtensions")),
|
||||||
|
new Set<string>(APP_CONFIG.get("ignoredDirectories")),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const wakatimeData = await wakatimeFetchSummary(
|
||||||
|
APP_CONFIG.get("wakatimeKey"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Apply Template
|
||||||
|
function useTemplate(givenText: string): string {
|
||||||
|
return givenText
|
||||||
|
.replaceAll("{workspace.name}", workspaceName)
|
||||||
|
.replaceAll("{workspace.loc}", workspaceLOC.toLocaleString())
|
||||||
|
.replaceAll("{wakatime.decimal}", wakatimeData.decimal)
|
||||||
|
.replaceAll("{wakatime.digital}", wakatimeData.digital)
|
||||||
|
.replaceAll("{wakatime.seconds}", (wakatimeData.seconds | 0).toString())
|
||||||
|
.replaceAll("{wakatime.text}", wakatimeData.text)
|
||||||
|
}
|
||||||
|
activityDetails = useTemplate(APP_CONFIG.get("activityDetails", ""))
|
||||||
|
activityState = useTemplate(APP_CONFIG.get("activityState", ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update Activity
|
||||||
|
DISCORD_RPC.setActivity({
|
||||||
|
details: activityDetails,
|
||||||
|
state: activityState,
|
||||||
|
largeImageKey: "vscode",
|
||||||
|
largeImageText: "Visual Studio Code",
|
||||||
|
smallImageKey: APP_CONFIG.get("overrideSmallIcon") || undefined,
|
||||||
|
smallImageText: APP_CONFIG.get("overrideSmallText") || undefined,
|
||||||
|
instance: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Extension Entrypoints */
|
||||||
|
export async function activate(context: vscode.ExtensionContext) {
|
||||||
|
|
||||||
|
// Setup Discord Presence
|
||||||
|
DISCORD_RPC.login({ clientId: DISCORD_CLIENT_ID }).catch(error => {
|
||||||
|
vscode.window.showErrorMessage("Discord RPC Error: " + String(error))
|
||||||
|
})
|
||||||
|
DISCORD_RPC.on("ready", () => {
|
||||||
|
setInterval(updateRPC, 300_000)
|
||||||
|
updateRPC()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Setup Extension
|
||||||
|
vscode.commands.registerCommand("trackpad.refresh", () => {
|
||||||
|
vscode.window.showInformationMessage("Refreshing Discord Rich Presence!")
|
||||||
|
updateRPC()
|
||||||
|
})
|
||||||
|
context.subscriptions.push(
|
||||||
|
vscode.Disposable.from({
|
||||||
|
dispose: () => DISCORD_RPC.destroy()
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export async function deactivate() {
|
||||||
|
if (DISCORD_RPC) DISCORD_RPC.destroy()
|
||||||
|
}
|
||||||
Generated
+190
@@ -0,0 +1,190 @@
|
|||||||
|
{
|
||||||
|
"name": "trackpad",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "trackpad",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"discord-rpc": "^4.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/discord-rpc": "^4.0.8",
|
||||||
|
"@types/node": "^22.10.2",
|
||||||
|
"@types/vscode": "^1.96.0",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"vscode": "^1.96.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/discord-rpc": {
|
||||||
|
"version": "4.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/discord-rpc/-/discord-rpc-4.0.8.tgz",
|
||||||
|
"integrity": "sha512-1tZf217Natkj+TziNXRRLwNmdm5GNa1bnrQr8VWowquo/Su5hMjdhobj8URxW1COMk2da28XCU1ahsYCAlxirA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/events": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/events": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@types/node": {
|
||||||
|
"version": "22.10.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
|
||||||
|
"integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~6.20.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/vscode": {
|
||||||
|
"version": "1.96.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.96.0.tgz",
|
||||||
|
"integrity": "sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/bindings": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"file-uri-to-path": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/discord-rpc": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/discord-rpc/-/discord-rpc-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-HOvHpbq5STRZJjQIBzwoKnQ0jHplbEWFWlPDwXXKm/bILh4nzjcg7mNqll0UY7RsjFoaXA7e/oYb/4lvpda2zA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
|
"ws": "^7.3.1"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"register-scheme": "github:devsnek/node-register-scheme"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/file-uri-to-path": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"node_modules/node-addon-api": {
|
||||||
|
"version": "1.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
|
||||||
|
"integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"node_modules/node-fetch": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/register-scheme": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "git+ssh://git@github.com/devsnek/node-register-scheme.git#e7cc9a63a1f512565da44cb57316d9fb10750e17",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"bindings": "^1.3.0",
|
||||||
|
"node-addon-api": "^1.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/typescript": {
|
||||||
|
"version": "5.9.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||||
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"tsc": "bin/tsc",
|
||||||
|
"tsserver": "bin/tsserver"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.17"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "6.20.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
|
||||||
|
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
|
||||||
|
"license": "BSD-2-Clause"
|
||||||
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ws": {
|
||||||
|
"version": "7.5.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
|
||||||
|
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"bufferutil": "^4.0.1",
|
||||||
|
"utf-8-validate": "^5.0.2"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"bufferutil": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"utf-8-validate": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+105
@@ -0,0 +1,105 @@
|
|||||||
|
{
|
||||||
|
"name": "trackpad",
|
||||||
|
"displayName": "Discord Trackpad",
|
||||||
|
"description": "Showcase your Wakatime and Lines of Code on Discord",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "./extension.js",
|
||||||
|
"publisher": "bakonpancakz",
|
||||||
|
"icon": "icon.png",
|
||||||
|
"files": [
|
||||||
|
"node_modules",
|
||||||
|
"extension.js",
|
||||||
|
"README.md",
|
||||||
|
"icon.png",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"url": "https://github.com/bakonpancakz/trackpad"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "npm install && npx tsc && npm prune --omit=dev && npx @vscode/vsce package"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"vscode": "^1.96.0"
|
||||||
|
},
|
||||||
|
"categories": [
|
||||||
|
"Other"
|
||||||
|
],
|
||||||
|
"activationEvents": [
|
||||||
|
"onStartupFinished"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"discord-rpc": "^4.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/discord-rpc": "^4.0.8",
|
||||||
|
"@types/node": "^22.10.2",
|
||||||
|
"@types/vscode": "^1.96.0",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
|
},
|
||||||
|
"contributes": {
|
||||||
|
"configuration": {
|
||||||
|
"title": "Trackpad",
|
||||||
|
"properties": {
|
||||||
|
"trackpad.allowedExtensions": {
|
||||||
|
"description": "Allowed File Extensions for Line Counter",
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"default": [
|
||||||
|
".js",
|
||||||
|
".ts",
|
||||||
|
".pug",
|
||||||
|
".html",
|
||||||
|
".css",
|
||||||
|
".sql",
|
||||||
|
".xml",
|
||||||
|
".yml",
|
||||||
|
".md",
|
||||||
|
".go"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"trackpad.ignoredDirectories": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "Ignored Directory Names for Line Counter",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"default": [
|
||||||
|
"node_modules",
|
||||||
|
".git",
|
||||||
|
"dist",
|
||||||
|
"build",
|
||||||
|
"out"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"trackpad.activityDetails": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Activity Details (Upper) with template literal support",
|
||||||
|
"default": "Project: {workspace.name}"
|
||||||
|
},
|
||||||
|
"trackpad.activityState": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Activity State (Lower) with template literal support",
|
||||||
|
"default": "{workspace.loc} LOC - {wakatime.text}"
|
||||||
|
},
|
||||||
|
"trackpad.overrideSmallIcon": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Set Small Icon URL for Activity"
|
||||||
|
},
|
||||||
|
"trackpad.overrideSmallText": {
|
||||||
|
"description": "Set Small Text for Activity",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"trackpad.wakatimeKey": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "",
|
||||||
|
"ignoreSync": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"command": "trackpad.refresh",
|
||||||
|
"title": "Trackpad: Refresh Discord Rich Presence"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "Node16",
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": [
|
||||||
|
"ES2022"
|
||||||
|
],
|
||||||
|
"sourceMap": false,
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user