diff --git a/CHANGELOG.md b/CHANGELOG.md index 0725d0c..4ea83f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.1.5] - 2020-05-28 + +### Added + +- Added open folder action. + ## [3.1.5] - 2020-04-06 ### Changed diff --git a/package-lock.json b/package-lock.json index 8fa3f29..4d92bde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,32 @@ { "name": "vscode-streamdeck", - "version": "3.1.5", + "version": "4.1.5", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, @@ -72,9 +78,9 @@ "dev": true }, "@types/node": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", - "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", + "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", "dev": true }, "@types/vscode": { @@ -84,65 +90,54 @@ "dev": true }, "@types/ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-VT/GK7nvDA7lfHy40G3LKM+ICqmdIsBLBHGXcWD97MtqQEjNMX+7Gudo8YGpaSlYdTX7IFThhCE8Jx09HegymQ==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.4.tgz", + "integrity": "sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg==", "dev": true, "requires": { "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz", - "integrity": "sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.26.0", + "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" - }, - "dependencies": { - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } } }, "@typescript-eslint/experimental-utils": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", - "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.26.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.26.0.tgz", - "integrity": "sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.26.0", - "@typescript-eslint/typescript-estree": "2.26.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", - "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -150,31 +145,22 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } } } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, "acorn-jsx": { @@ -193,9 +179,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -359,9 +345,9 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { @@ -641,18 +627,18 @@ "dev": true }, "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^5.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } @@ -1096,12 +1082,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -1205,18 +1185,18 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "mocha": { @@ -1558,13 +1538,10 @@ } }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "rxjs": { "version": "6.5.5", @@ -1843,11 +1820,20 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -2010,9 +1996,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index 4460124..e15f9ec 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-streamdeck", "displayName": "Stream Deck for Visual Studio Code", "description": "Enables Stream Deck integration with Visual Studio Code.", - "version": "3.1.5", + "version": "4.1.5", "engines": { "vscode": "^1.38.0" }, @@ -70,14 +70,14 @@ }, "dependencies": { "strongly-typed-events": "^1.6.11", - "ws": "^7.2.3" + "ws": "^7.2.5" }, "devDependencies": { "@types/vscode": "^1.38.0", "@types/glob": "^7.1.1", "@types/mocha": "^7.0.2", - "@types/node": "^13.11.0", - "@types/ws": "7.2.3", + "@types/node": "^14.0.5", + "@types/ws": "7.2.4", "eslint": "^6.8.0", "@typescript-eslint/parser": "^2.26.0", "@typescript-eslint/eslint-plugin": "^2.26.0", diff --git a/src/constants.ts b/src/constants.ts index 1ea0951..c748be5 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,14 +1,13 @@ export const InternalExtensionId = "vscode-streamdeck"; export const ExtensionId = `nicollasricas.${InternalExtensionId}`; export const ExtensionScheme = "streamdeck"; -export const OutputChannelName = "Stream Deck"; export enum Commands { Reconnect = "reconnectToServer", - ActivateSession = "activateSession" + ActivateSession = "activateSession", } export enum Configurations { ServerHost = "streamdeck.serverHost", - ServerPort = "streamdeck.serverPort" + ServerPort = "streamdeck.serverPort", } diff --git a/src/extension.ts b/src/extension.ts index 6d46bbf..3f4593a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode"; +import Logger from "./logger"; import { ExtensionController } from "./extensionController"; -import { OutputChannelName, Commands, ExtensionScheme, Configurations } from "./constants"; +import { Commands, ExtensionScheme, Configurations } from "./constants"; import { CreateTerminalMessage } from "./messages/createTerminalMessage"; import { ExecuteTerminalCommandMessage } from "./messages/executeTerminalCommandMessage"; import { ExecuteCommandMessage } from "./messages/executeCommandMessage"; @@ -8,12 +9,12 @@ import { ExtensionConfiguration } from "./configuration"; import { ActiveSessionChangedMessage } from "./messages/activeSessionChangedMessage"; import { ChangeLanguageMessage } from "./messages/changeLanguagMessage"; import { InsertSnippetMessage } from "./messages/InsertSnippetMessage"; +import { OpenFolderMessage } from "./messages/OpenFolderMessage"; let extensionController: ExtensionController; export function activate(context: vscode.ExtensionContext) { - const outputChannel = vscode.window.createOutputChannel(OutputChannelName); - context.subscriptions.push(outputChannel); + Logger.initialize(context); const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right); statusBar.command = `${ExtensionScheme}.${Commands.ActivateSession}`; @@ -23,7 +24,7 @@ export function activate(context: vscode.ExtensionContext) { const configuration = new ExtensionConfiguration(); loadOrUpdateConfiguration(configuration); - extensionController = new ExtensionController(statusBar, outputChannel, vscode.env.sessionId, configuration); + extensionController = new ExtensionController(statusBar, vscode.env.sessionId, configuration); registerCommands(context, extensionController); @@ -31,7 +32,9 @@ export function activate(context: vscode.ExtensionContext) { extensionController.activate(); - vscode.window.onDidChangeWindowState(state => windowStateChanged(extensionController, state)); + Logger.log(`Registering session ${vscode.env.sessionId}`); + + vscode.window.onDidChangeWindowState((state) => windowStateChanged(extensionController, state)); vscode.workspace.onDidChangeConfiguration(() => configurationChanged(extensionController, configuration)); } @@ -69,18 +72,25 @@ function registerCommands(context: vscode.ExtensionContext, extensionController: context.subscriptions.push( vscode.commands.registerCommand(`${ExtensionScheme}.${Commands.ActivateSession}`, () => { - extensionController.changeActiveSession(vscode.env.sessionId); + Logger.log(`Activation requested to ${vscode.env.sessionId}`); + + try { + extensionController.changeActiveSession(vscode.env.sessionId); + } catch (error) { + Logger.error(error); + } }) ); } function subscriptions(context: vscode.ExtensionContext, extensionController: ExtensionController) { extensionController.onCreateTerminal.subscribe((_, request) => createTerminal(context, request)); - extensionController.onExecuteTerminalCommand.subscribe((_, request) => executeTerminalCommand(context, request)); + extensionController.onExecuteTerminalCommand.subscribe((_, request) => executeTerminalCommand(request)); extensionController.onExecuteCommand.subscribe((_, request) => executeCommand(request)); extensionController.onActiveSessionChanged.subscribe((_, request) => onActiveSessionChanged(request)); extensionController.onChangeLanguageCommand.subscribe((_, request) => changeLanguage(request)); extensionController.onInsertSnippetCommand.subscribe((_, request) => insertSnippet(request)); + extensionController.onOpenFolderCommand.subscribe((_, request) => openFolder(request)); } function onActiveSessionChanged(request: ActiveSessionChangedMessage) { @@ -100,18 +110,26 @@ function changeLanguage(request: ChangeLanguageMessage) { function insertSnippet(request: InsertSnippetMessage) { if (request.name) { vscode.commands.executeCommand("editor.action.insertSnippet", { - name: request.name + name: request.name, }); } } +function openFolder(request: OpenFolderMessage) { + if (request.path) { + vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(request.path), request.newWindow); + } +} + function executeCommand(request: ExecuteCommandMessage) { if (request.command) { let commandArguments; try { commandArguments = JSON.parse(request.arguments); - } catch {} + } catch (error) { + Logger.error(error); + } if (commandArguments) { vscode.commands.executeCommand(request.command, commandArguments); @@ -121,7 +139,7 @@ function executeCommand(request: ExecuteCommandMessage) { } } -function executeTerminalCommand(context: vscode.ExtensionContext, request: ExecuteTerminalCommandMessage) { +function executeTerminalCommand(request: ExecuteTerminalCommandMessage) { let terminal = vscode.window.activeTerminal as vscode.Terminal; if (terminal && request.command) { @@ -136,7 +154,7 @@ function createTerminal(context: vscode.ExtensionContext, request: CreateTermina cwd: request.workingDirectory, env: request.environment, shellArgs: request.shellArgs, - shellPath: request.shellPath + shellPath: request.shellPath, }); terminal.show(request.preserveFocus); diff --git a/src/extensionController.ts b/src/extensionController.ts index e56a1f7..7d4d0e8 100644 --- a/src/extensionController.ts +++ b/src/extensionController.ts @@ -11,18 +11,15 @@ import { ChangeActiveSessionMessage } from "./messages/changeActiveSessionMessag import { Message } from "./messages/message"; import { ChangeLanguageMessage } from "./messages/changeLanguagMessage"; import { InsertSnippetMessage } from "./messages/InsertSnippetMessage"; +import Logger from "./logger"; +import { OpenFolderMessage } from "./messages/OpenFolderMessage"; export class ExtensionController { private hub!: ExtensionHub; private status: ExtensionStatus; private eventDispatcher: EventList = new EventList(); - constructor( - statusBar: vscode.StatusBarItem, - private outputChannel: vscode.OutputChannel, - private sessionId: string, - configuration: ExtensionConfiguration - ) { + constructor(statusBar: vscode.StatusBarItem, private sessionId: string, configuration: ExtensionConfiguration) { this.status = new ExtensionStatus(statusBar); this.createStreamDeckHub(configuration); @@ -45,11 +42,11 @@ export class ExtensionController { this.hub = new ExtensionHub(configuration.host, configuration.port, this.sessionId); this.hub.onConnected.subscribe(() => this.onConnected()); this.hub.onDisconnected.subscribe(() => this.onDisconnected()); - this.hub.onMessageReceived.subscribe(message => this.onMessageReceived(message)); + this.hub.onMessageReceived.subscribe((message) => this.onMessageReceived(message)); } private connect() { - this.outputChannel.appendLine("Connecting to Stream Deck"); + Logger.log("Connecting to Stream Deck"); this.status.setAsConnecting(); @@ -57,7 +54,7 @@ export class ExtensionController { } public configurationChanged(configuration: ExtensionConfiguration) { - this.outputChannel.appendLine("Configuration changed, restarting..."); + Logger.log("Configuration changed, restarting..."); if (this.hub) { this.hub.disconnect(); @@ -69,13 +66,13 @@ export class ExtensionController { } reconnect() { - this.outputChannel.appendLine("Reconnecting to Stream Deck..."); + Logger.log("Reconnecting to Stream Deck..."); this.connect(); } private onConnected() { - this.outputChannel.appendLine("Connected to Stream Deck."); + Logger.log("Connected to Stream Deck."); this.status.setAsConnected(); } @@ -84,14 +81,16 @@ export class ExtensionController { try { const receivedMessage = JSON.parse(message); - this.outputChannel.appendLine(`Message received, ${receivedMessage.id}.: ${message}`); + Logger.log(`Message received, ${receivedMessage.id}.: ${message}`); this.eventDispatcher.get(receivedMessage.id).dispatchAsync(this, JSON.parse(receivedMessage.data)); - } catch {} + } catch (error) { + Logger.error(error); + } } private onDisconnected() { - this.outputChannel.appendLine("Disconnected from Stream Deck."); + Logger.log("Disconnected from Stream Deck."); this.status.setAsConnecting(); @@ -124,6 +123,10 @@ export class ExtensionController { ); } + get onOpenFolderCommand() { + return >this.eventDispatcher.get(OpenFolderMessage.name).asEvent(); + } + get onExecuteCommand() { return >( this.eventDispatcher.get(ExecuteCommandMessage.name).asEvent() diff --git a/src/extensionHub.ts b/src/extensionHub.ts index 19c526c..b528b8b 100644 --- a/src/extensionHub.ts +++ b/src/extensionHub.ts @@ -1,5 +1,6 @@ import { SignalDispatcher, SimpleEventDispatcher } from "strongly-typed-events"; import WebSocket = require("ws"); +import Logger from "./logger"; export class ExtensionHub { private _onConnected = new SignalDispatcher(); @@ -11,12 +12,12 @@ export class ExtensionHub { connect() { this.socket = new WebSocket(`ws://${this.host}:${this.port}`, { - headers: { "X-VSSessionID": this.sessionId } + headers: { "X-VSSessionID": this.sessionId }, }); this.socket.on("open", () => this._onConnected.dispatch()); - this.socket.on("message", message => this._onMessageReceived.dispatch(message)); + this.socket.on("message", (message) => this._onMessageReceived.dispatch(message)); this.socket.on("close", () => this._onDisconnected.dispatch()); - this.socket.on("error", () => {}); + this.socket.on("error", () => Logger.error); } disconnect() { @@ -32,7 +33,7 @@ export class ExtensionHub { this.socket.send( JSON.stringify({ id: message.constructor.name, - data: JSON.stringify(message) + data: JSON.stringify(message), }) ); } diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..763169c --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,19 @@ +import * as vscode from "vscode"; + +export default class Logger { + private static outputChannel: vscode.OutputChannel; + + static initialize(context: vscode.ExtensionContext) { + this.outputChannel = vscode.window.createOutputChannel("Stream Deck"); + + context.subscriptions.push(this.outputChannel); + } + + static log(message: string) { + this.outputChannel.appendLine(`[${new Date().toLocaleString()}] ${message}`); + } + + static error(error: Error) { + this.outputChannel.appendLine(`[ERROR] ${error.message}, Stack: ${error.stack}`); + } +} diff --git a/src/messages/openFolderMessage.ts b/src/messages/openFolderMessage.ts new file mode 100644 index 0000000..43be315 --- /dev/null +++ b/src/messages/openFolderMessage.ts @@ -0,0 +1,4 @@ +export class OpenFolderMessage { + path!: string; + newWindow!: boolean; +}