diff --git a/multi-diagnostics-sample/.gitignore b/.base-sample/.gitignore
similarity index 100%
rename from multi-diagnostics-sample/.gitignore
rename to .base-sample/.gitignore
diff --git a/.base-sample/.vscode/launch.json b/.base-sample/.vscode/launch.json
new file mode 100644
index 00000000..527cbf4b
--- /dev/null
+++ b/.base-sample/.vscode/launch.json
@@ -0,0 +1,35 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [{
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ },
+ {
+ "name": "Run Extension Tests",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}",
+ "--extensionTestsPath=${workspaceFolder}/out/test"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/test/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
diff --git a/.base-sample/.vscode/settings.json b/.base-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/.base-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/.base-sample/.vscode/tasks.json b/.base-sample/.vscode/tasks.json
new file mode 100644
index 00000000..241aa6d9
--- /dev/null
+++ b/.base-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/multi-diagnostics-sample/.vscodeignore b/.base-sample/.vscodeignore
similarity index 100%
rename from multi-diagnostics-sample/.vscodeignore
rename to .base-sample/.vscodeignore
diff --git a/.base-sample/README.md b/.base-sample/README.md
new file mode 100644
index 00000000..3b8d78d6
--- /dev/null
+++ b/.base-sample/README.md
@@ -0,0 +1,5 @@
+# Base Sample
+
+This sample is similar to the [helloworld-sample](../helloworld-sample), but it follows the [Sample Guideline](https://github.com/Microsoft/vscode-extension-samples/blob/master/.github/SAMPLE_GUIDELINE.md).
+
+You can easily write a new sample following the guideline by `cp -r .base-sample my-sample`.
diff --git a/.base-sample/demo.gif b/.base-sample/demo.gif
new file mode 100644
index 00000000..55fdd133
Binary files /dev/null and b/.base-sample/demo.gif differ
diff --git a/.base-sample/package-lock.json b/.base-sample/package-lock.json
new file mode 100644
index 00000000..5c2a593e
--- /dev/null
+++ b/.base-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "base-sample",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "10.14.17",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.17.tgz",
+ "integrity": "sha512-p/sGgiPaathCfOtqu2fx5Mu1bcjuP8ALFg4xpGgNkcin7LwRyzUKniEHBKdcE1RPsenq5JVPIpMTJSygLboygQ==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
+ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.19.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz",
+ "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz",
+ "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/.base-sample/package.json b/.base-sample/package.json
new file mode 100644
index 00000000..45af2975
--- /dev/null
+++ b/.base-sample/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "base-sample",
+ "displayName": "base-sample",
+ "description": "Base sample for other samples at Microsoft/vscode-extension-samples",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onCommand:extension.helloWorld"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "commands": [
+ {
+ "command": "extension.helloWorld",
+ "title": "Hello World"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^10.14.17",
+ "@types/vscode": "^1.32.0",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1"
+ }
+}
diff --git a/.base-sample/src/extension.ts b/.base-sample/src/extension.ts
new file mode 100644
index 00000000..4b9d9fa2
--- /dev/null
+++ b/.base-sample/src/extension.ts
@@ -0,0 +1,26 @@
+// The module 'vscode' contains the VS Code extensibility API
+// Import the module and reference it with the alias vscode in your code below
+import * as vscode from 'vscode';
+
+// this method is called when your extension is activated
+// your extension is activated the very first time the command is executed
+export function activate(context: vscode.ExtensionContext) {
+ // Use the console to output diagnostic information (console.log) and errors (console.error)
+ // This line of code will only be executed once when your extension is activated
+ console.log('Congratulations, your extension "helloworld-sample" is now active!');
+
+ // The command has been defined in the package.json file
+ // Now provide the implementation of the command with registerCommand
+ // The commandId parameter must match the command field in package.json
+ let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
+ // The code you place here will be executed every time your command is executed
+
+ // Display a message box to the user
+ vscode.window.showInformationMessage('Hello World!');
+ });
+
+ context.subscriptions.push(disposable);
+}
+
+// this method is called when your extension is deactivated
+export function deactivate() {}
diff --git a/.base-sample/tsconfig.json b/.base-sample/tsconfig.json
new file mode 100644
index 00000000..aa034c3f
--- /dev/null
+++ b/.base-sample/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "rootDir": "src",
+ "strict": true
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/.base-sample/tslint.json b/.base-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/.base-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/.build/postinstall.js b/.build/postinstall.js
deleted file mode 100644
index b3b3b24d..00000000
--- a/.build/postinstall.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
-const fs = require('fs');
-const path = require('path');
-const cp = require('child_process');
-const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
-
-function npmInstall(location) {
- const result = cp.spawnSync(npm, ['install'], {
- cwd: location,
- stdio: 'inherit'
- });
-
- if (result.error || result.status !== 0) {
- process.exit(1);
- }
-}
-
-
-const cwd = process.cwd();
-for (const element of fs.readdirSync(cwd)) {
- const fullpath = path.join(cwd, element, 'package.json');
- if (fs.existsSync(fullpath)) {
- npmInstall(path.join(cwd, element));
- }
-}
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 00000000..41413be7
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,3 @@
+# Contributing to vscode-extension-samples
+
+If you want to contribute a new sample, see [Sample Guideline](./SAMPLE_GUIDELINE.md)
\ No newline at end of file
diff --git a/.github/SAMPLE_GUIDELINE.md b/.github/SAMPLE_GUIDELINE.md
new file mode 100644
index 00000000..91c4cf6d
--- /dev/null
+++ b/.github/SAMPLE_GUIDELINE.md
@@ -0,0 +1,40 @@
+# Sample Guideline
+
+Each sample should have the following components and structure, so that users could have a smooth experience when playing with different samples.
+The quickest way is to start your project by copying [.base-sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/.base-sample).
+
+## 1: Sample Listing
+
+- 1.1: Each sample should add itself to the sample listing at `.scripts/samples.js`. This file will be used for generating tables in the README and on the [Extension Guides / Overview](https://code.visualstudio.com/api/extension-guides/overview) topic of the website.
+- 1.2: Each sample should list the API / Contribution that it means to illustrate.
+
+## 2: README
+
+- 2.1: Each README should start with a short sentence / paragraph that describes what the extensions is and what it is meant to illustrate.
+- 2.2: If the sample has a corresponding guide, it should link to the guide.
+- 2.3: If the illustrated functionality is visual, a gif/image should follow the explanation. (File should be demo.png/gif/jpg. Use default Dark+/Light+ theme)
+- 2.4: A `VS Code API` section listing the illustrated API, Contribution Points and Activation Events.
+- 2.5: A `Running the Sample` section should describe the actions to run the sample.
+
+## 3: .vscode
+
+- 3.1: launch.json: use 0.2.0 version.
+- 3.2: settings.json: use `"editor.insertSpaces": false`. This ensure when user opens the subfolder, tab indentation is enforced.
+
+## 4: Dependencies
+
+- 4.1: Use `npm`'s `package-lock.json` instead of `yarn.lock`.
+- 4.2: `devDependencies` should include `@types/node`, `vscode`, `typescript` and `tslint`.
+
+## 5: Formatter and Linter
+
+Only deviate from the standard setting if your sample needs to.
+
+- 5.1: Include a `tslint.json` following https://github.com/Microsoft/vscode-extension-samples/blob/ext-docs/helloworld-sample/tslint.json.
+- 5.2: Include a `tsconfig.json` following https://github.com/Microsoft/vscode-extension-samples/blob/ext-docs/helloworld-sample/tsconfig.json.
+- 5.3: Your source code should be formatted either using [tsfmt](https://github.com/vvakame/typescript-formatter) or the editor's TS formatter and contain no TSLint/TS errors.
+
+## 6: Tests
+
+- 6.1: If your extension does not have meaningful tests, remove the `src/test` folder.
+- 6.2: If your extension can be meaningfully tested, include a sample test. If you have an associated guide, explain the test in the guide.
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0d1e97d1..61475638 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ npm-debug.log
Thumbs.db
*/node_modules/
*/out/
+*/.vs/
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 00000000..236725f6
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,5 @@
+{
+ "useTabs": true,
+ "singleQuote": true,
+ "printWidth": 92
+}
\ No newline at end of file
diff --git a/.scripts/run-install.js b/.scripts/run-install.js
new file mode 100644
index 00000000..7369bdd6
--- /dev/null
+++ b/.scripts/run-install.js
@@ -0,0 +1,26 @@
+// @ts-check
+/**
+ * Try running install for all the samples
+ */
+const fs = require('fs');
+const path = require('path');
+const child_process = require('child_process');
+const { samples, lspSamples } = require('./samples')
+
+async function tryRunInstall(
+ /** @type {import('./samples').Sample} */ sample
+) {
+ const packageJsonPath = path.join(sample.path, 'package.json');
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
+ if (packageJson['devDependencies'] || packageJson['dependencies']) {
+ console.log(`=== Running install on ${path.basename(sample.path)} ===`)
+ child_process.execSync(`npm install`, {
+ cwd: sample.path,
+ stdio: 'inherit'
+ });
+ }
+}
+
+for (const sample of [...samples, ...lspSamples]) {
+ tryRunInstall(sample);
+}
\ No newline at end of file
diff --git a/.scripts/run-script.js b/.scripts/run-script.js
new file mode 100644
index 00000000..c216e874
--- /dev/null
+++ b/.scripts/run-script.js
@@ -0,0 +1,28 @@
+// @ts-check
+/**
+ * Try running an npm script for each of the samples.
+ */
+const fs = require('fs');
+const path = require('path');
+const child_process = require('child_process');
+const { samples, lspSamples } = require('./samples')
+
+async function tryRun(
+ /** @type {string} */ scriptName,
+ /** @type {import('./samples').Sample} */ sample
+) {
+ const packageJsonPath = path.join(sample.path, 'package.json');
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
+ if (Object.keys(packageJson['scripts'] || {}).includes(scriptName)) {
+ console.log(`=== Running ${scriptName} on ${path.basename(sample.path)} ===`)
+ child_process.execSync(`npm run ${scriptName}`, {
+ cwd: sample.path,
+ stdio: 'inherit'
+ });
+ }
+}
+
+const scriptName = process.argv[2];
+for (const sample of [...samples, ...lspSamples]) {
+ tryRun(scriptName, sample);
+}
\ No newline at end of file
diff --git a/.scripts/samples.js b/.scripts/samples.js
new file mode 100644
index 00000000..c7a0e632
--- /dev/null
+++ b/.scripts/samples.js
@@ -0,0 +1,231 @@
+//@ts-check
+
+/**
+ * @typedef {Object} Sample
+ * @property {string} description - A readable name for the sample
+ * @property {string} path - Path to the sample's root
+ * @property {string | null} guide - Link to the guide on https://code.visualstudio.com
+ * @property {string[]} apis - Listing of VS Code API that is being illustrated. For example, "TextDocumentContentProvider"
+ * @property {string[]} contributions - Listing of Contribution Points that are being used. For example,
+ */
+
+/** @type {Sample[]} */
+const samples = [
+ {
+ description: 'Webview Sample',
+ path: 'webview-sample',
+ guide: '/api/extension-guides/webview',
+ apis: ['window.createWebviewPanel', 'window.registerWebviewPanelSerializer'],
+ contributions: []
+ },
+ {
+ description: 'Status Bar Sample',
+ path: 'statusbar-sample',
+ guide: null,
+ apis: ['window.createStatusBarItem', 'StatusBarItem'],
+ contributions: []
+ },
+ {
+ description: 'Tree View Sample',
+ path: 'tree-view-sample',
+ guide: '/api/extension-guides/tree-view',
+ apis: ['window.createTreeView', 'window.registerTreeDataProvider', 'TreeView', 'TreeDataProvider'],
+ contributions: ['views', 'viewsContainers']
+ },
+ {
+ description: 'Task Provider Sample',
+ path: 'task-provider-sample',
+ guide: '/api/extension-guides/task-provider',
+ apis: ['tasks.registerTaskProvider', 'Task', 'ShellExecution'],
+ contributions: ['taskDefinitions']
+ },
+ {
+ description: 'Multi Root Sample',
+ path: 'basic-multi-root-sample',
+ guide: null,
+ apis: ['workspace.getWorkspaceFolder', 'workspace.onDidChangeWorkspaceFolders'],
+ contributions: []
+ },
+ {
+ description: 'Completion Provider Sample',
+ path: 'completions-sample',
+ guide: null,
+ apis: ['languages.registerCompletionItemProvider', 'CompletionItem', 'SnippetString'],
+ contributions: []
+ },
+ {
+ description: 'Code Actions Sample',
+ path: 'code-actions-sample',
+ guide: null,
+ apis: ['languages.registerCodeActionsProvider', 'CodeActionProvider'],
+ contributions: []
+ },
+ {
+ description: 'File System Provider Sample',
+ path: 'fsprovider-sample',
+ guide: null,
+ apis: ['workspace.registerFileSystemProvider'],
+ contributions: []
+ },
+ // { description: 'configuration-sample', path: 'configuration-sample', guide: null, apis: [], contributions: [] },
+ // { description: 'contentprovider-sample', path: 'contentprovider-sample', guide: null, apis: [], contributions: [] },
+ {
+ description: 'Editor Decoractor Sample',
+ path: 'decorator-sample',
+ guide: null,
+ apis: [
+ 'TextEditor.setDecorations',
+ 'DecorationOptions',
+ 'DecorationInstanceRenderOptions',
+ 'ThemableDecorationInstanceRenderOptions',
+ 'window.createTextEditorDecorationType',
+ 'TextEditorDecorationType'
+ ],
+ contributions: ['colors']
+ },
+ // { description: 'extension-deps-sample', path: 'extension-deps-sample', guide: null, apis: [], contributions: [] },
+ {
+ description: 'I18n Sample',
+ path: 'i18n-sample',
+ guide: null,
+ apis: [],
+ contributions: []
+ },
+ // { description: 'multi-diagnostics-sample', path: 'multi-diagnostics-sample', guide: null, apis: [], contributions: [] },
+ // { description: 'nodefs-provider-sample', path: 'nodefs-provider-sample', guide: null, apis: [], contributions: [] },
+ // { description: 'progress-sample', path: 'progress-sample', guide: null, apis: [], contributions: [] },
+ // { description: 'quickinput-sample', path: 'quickinput-sample', guide: null, apis: [], contributions: [] },
+ // { description: 'smart-template-strings-sample', path: 'smart-template-strings-sample', guide: null, apis: [], contributions: [] },
+ {
+ description: 'Terminal Sample',
+ path: 'terminal-sample',
+ guide: null,
+ apis: [
+ 'window.createTerminal',
+ 'window.onDidChangeActiveTerminal',
+ 'window.onDidCloseTerminal',
+ 'window.onDidOpenTerminal',
+ 'window.Terminal',
+ 'window.terminals'
+ ],
+ contributions: []
+ },
+ {
+ description: 'Extension Terminal Sample',
+ path: 'extension-terminal-sample',
+ guide: null,
+ apis: [
+ 'window.createTerminal',
+ 'window.Pseudoterminal',
+ 'window.ExtensionTerminalOptions'
+ ],
+ contributions: []
+ },
+ // { description: 'theme-sample', path: 'theme-sample', guide: null, apis: [], contributions: [] },
+ {
+ description: 'Vim Sample',
+ path: 'vim-sample',
+ guide: null,
+ apis: [
+ `commands`,
+ `StatusBarItem`,
+ `window.createStatusBarItem`,
+ `TextEditorCursorStyle`,
+ `window.activeTextEditor`,
+ `Position`,
+ `Range`,
+ `Selection`,
+ `TextEditor`,
+ `TextEditorRevealType`,
+ `TextDocument`
+ ],
+ contributions: []
+ },
+ // { description: 'webpack-sample', path: 'webpack-sample', guide: null, apis: [], contributions: [] },
+ {
+ description: 'Source Control Sample',
+ path: 'source-control-sample',
+ guide: '/api/extension-guides/scm-provider',
+ apis: [
+ 'workspace.workspaceFolders',
+ 'SourceControl',
+ 'SourceControlResourceGroup',
+ 'scm.createSourceControl',
+ 'TextDocumentContentProvider'
+ ],
+ contributions: ["menus"]
+ },
+ {
+ description: 'Commenting API Sample',
+ path: 'comment-sample',
+ guide: null,
+ apis: [],
+ contributions: []
+ },
+ {
+ description: 'Document Editing Sample',
+ path: 'document-editing-sample',
+ guide: null,
+ apis: [
+ `commands`
+ ],
+ contributions: []
+ },
+ {
+ description: 'Custom Data Sample',
+ path: 'custom-data-sample',
+ guide: '/api/extension-guides/custom-data-extension',
+ apis: [],
+ contributions: []
+ }
+]
+
+/** LSP specific samples */
+/** @type {Sample[]} */
+const lspSamples = [
+ {
+ description: 'Snippet Sample',
+ path: 'snippet-sample',
+ guide: '/api/language-extensions/snippet-guide',
+ apis: [],
+ contributions: ['snippets']
+ },
+ {
+ description: 'Language Configuration Sample',
+ path: 'language-configuration-sample',
+ guide: '/api/language-extensions/language-configuration-guide',
+ apis: [],
+ contributions: ['languages']
+ },
+ {
+ description: 'LSP Sample',
+ path: 'lsp-sample',
+ guide: '/api/language-extensions/language-server-extension-guide',
+ apis: [],
+ contributions: []
+ },
+ {
+ description: 'LSP Log Streaming Sample',
+ path: 'lsp-log-streaming-sample',
+ guide: null,
+ apis: [],
+ contributions: []
+ },
+ {
+ description: 'LSP Multi Root Server Sample',
+ path: 'lsp-multi-server-sample',
+ guide:
+ 'https://github.com/Microsoft/vscode/wiki/Extension-Authoring:-Adopting-Multi-Root-Workspace-APIs#language-client--language-server',
+ apis: [],
+ contributions: []
+ }
+]
+/**
+ * LSP specific samples
+ * DO NOT add non-LSP items here. Add it to `samples` list.
+ */
+
+module.exports = {
+ samples,
+ lspSamples
+}
diff --git a/.scripts/update-readme.js b/.scripts/update-readme.js
new file mode 100644
index 00000000..4f2b9295
--- /dev/null
+++ b/.scripts/update-readme.js
@@ -0,0 +1,57 @@
+const fs = require('fs')
+
+const { samples, lspSamples } = require('./samples')
+
+const TABLE_HEAD = `
+| Sample | Guide on VS Code Website | API & Contribution |
+| ------ | ----- | --- |`
+const TABLE_END = ``
+const LSP_TABLE_HEAD = `
+| Sample | Guide on VS Code Website | API & Contribution |
+| ------ | ----- | --- |`
+const LSP_TABLE_END = ``
+
+const getTableRow = sample => {
+ const descriptionCell = `[${sample.description}](https://github.com/Microsoft/vscode-extension-samples/tree/master/${sample.path})`
+ let guideCell
+ if (!sample.guide) {
+ guideCell = 'N/A'
+ } else if (sample.guide && sample.guide.startsWith('http')) {
+ guideCell = sample.guide
+ } else {
+ guideCell = `[${sample.guide}](https://code.visualstudio.com${sample.guide})`
+ }
+
+ const apis = sample.apis.map(api => {
+ return `[${api}](https://code.visualstudio.com/api/references/vscode-api#${api})`
+ })
+ const contributions = sample.contributions.map(c => {
+ return `[contributes.${c}](https://code.visualstudio.com/api/references/contribution-points#contributes.${c})`
+ })
+ const apiAndContributionCell = apis.concat(contributions).join(' ')
+
+ return `| ${descriptionCell} | ${guideCell} | ${apiAndContributionCell} |`
+}
+
+const getSamplesTable = samples => {
+ const samplesMd = samples.map(s => getTableRow(s)).join('\n')
+
+ return `${TABLE_HEAD.trim()}
+${samplesMd}
+${TABLE_END.trim()}`
+}
+
+const getLSPSamplesTable = samples => {
+ const samplesMd = samples.map(s => getTableRow(s)).join('\n')
+
+ return `${LSP_TABLE_HEAD.trim()}
+${samplesMd}
+${LSP_TABLE_END.trim()}`
+}
+
+const readme = fs.readFileSync('README.md', 'utf-8')
+const newReadme = readme
+ .replace(/(.|\n)*/gm, getSamplesTable(samples))
+ .replace(/(.|\n)*/gm, getLSPSamplesTable(lspSamples))
+
+fs.writeFileSync('README.md', newReadme)
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 346d11fd..00000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,114 +0,0 @@
-// A launch configuration that compiles the extension and then opens it inside a new window
-{
- "version": "0.1.0",
- "configurations": [
- {
- "name": "Launch Completions Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/completions-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/completions-sample/out/**/*.js"
- ],
- "preLaunchTask": "compile-completions"
- },
- {
- "name": "Launch Decorator Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/decorator-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/decorator-sample/out/**/*.js"
- ],
- "preLaunchTask": "compile-decorator"
- },
- {
- "name": "Launch Preview Html Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/previewhtml-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/previewhtml-sample/out/**/*.js"
- ],
- "preLaunchTask": "compile-previewhtml"
- },
- {
- "name": "Launch Content Provider Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/contentprovider-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/contentprovider-sample/out/**/*.js"
- ],
- "preLaunchTask": "compile-contentprovider"
- },
- {
- "name": "Launch Status Bar Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/statusbar-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/statusbar-sample/out/**/*.js"
- ],
- "preLaunchTask": "compile-statusbar"
- },
- {
- "name": "Launch Language Provider Sample",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}/languageprovider-sample"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/languageprovider-sample/client/out/**/*.js"
- ]
- },
- {
- "name": "Attach Language Provider Sample Server",
- "type": "node",
- "request": "attach",
- "port": 6004,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/languageprovider-sample/server/out/**/*.js"
- ]
- }
- ],
- "compounds": [
- {
- "name": "Launch Language Provider Sample & Attach to Server",
- "configurations": [
- "Launch Language Provider Sample",
- "Attach Language Provider Sample Server"
- ]
- }
- ]
-}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 953e807b..c11cec63 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,11 +1,7 @@
{
- "files.exclude": {
- "**/out": false // set this to true to hide the "out" folder with the compiled JS files
- },
- "search.exclude": {
- "**/out": true
- },
- "editor.formatOnSave": true,
- "editor.useTabStops": true,
- "editor.tabSize": 4
-}
+ "editor.insertSpaces": false,
+ "prettier.semi": true,
+ "prettier.printWidth": 92,
+ "prettier.singleQuote": true,
+ "prettier.useTabs": true
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index e34a370a..00000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,97 +0,0 @@
-// Available variables which can be used inside of strings.
-// ${workspaceRoot}: the root folder of the team
-// ${file}: the current opened file
-// ${fileBasename}: the current opened file's basename
-// ${fileDirname}: the current opened file's dirname
-// ${fileExtname}: the current opened file's extension
-// ${cwd}: the current working directory of the spawned process
-// A task runner that calls a custom npm script that compiles the extension.
-{
- "version": "2.0.0",
- "tasks": [
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-completions",
- "label": "compile-completions",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- },
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-decorator",
- "label": "compile-decorator",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- },
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-previewhtml",
- "label": "compile-previewhtml",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- },
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-statusbar",
- "label": "compile-statusbar",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- },
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-contentprovider",
- "label": "compile-contentprovider",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- },
- {
- "type": "shell",
- // in package.json we have a compile task for each example
- "command": "npm run compile-languageprovider",
- "label": "compile-languageprovider",
- // show the output window only if unrecognized errors occur.
- "presentation": {
- "reveal": "silent"
- },
- // The tsc compiler is started in watching mode
- "isBackground": true,
- // use the standard tsc in watch mode problem matcher to find compile problems in the output.
- "problemMatcher": "$tsc-watch"
- }
- ]
-}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 0c294aa5..91523617 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,3 @@
-
Copyright (c) Microsoft Corporation
All rights reserved.
diff --git a/README.md b/README.md
index afc571f0..e20c2d1f 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,71 @@
-
-
-
-
VS Code Extension Samples
+This repository contains sample code illustrating the VS Code extension API. Each sample is a self-contained extension that explains one topic in [VS Code API](https://code.visualstudio.com/api/references/vscode-api) or VS Code's [Contribution Points](https://code.visualstudio.com/api/references/contribution-points). You can read, play with or adapt from these samples to create your own extensions.
-This repository contains sample code illustrating the VS Code extension API. The following is a
-list of self-contained, running extensions that show one or multiple concepts of the API:
+You can expect from each sample:
+- An explanation of its functionality
+- A gif or screenshot demonstrating its usage
+- Link to a guide on VS Code website, if it has one
+- Listing of used VS Code API and Contribution Points
+- Code of the same style, enforced using TSLint
-* [Virtual Documents](/contentprovider-sample/README.md)
-* [Editor Decoration](/decorator-sample/README.md)
-* [Status Bar](/statusbar-sample/README.md)
-* [Theme](/theme-sample)
-* [Integrated Terminal](/terminal-sample/README.md)
-* [Vim](/vim-sample/README.md)
-* [Tree views](/tree-view-sample/README.md)
-* [Webview](/webview-sample/README.md)
+## Prerequisites
-# ➡️ Getting Started
+You need to have [node](https://nodejs.org/en/) and [npm](https://nodejs.org/en/) installed on your system to run the examples. It is recommended to use the node version used for VS Code development itself which is documented [here](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#prerequisites)
-You can get started locally by following these steps:
+## Usage
-* **Step #1**: `git clone https://github.com/Microsoft/vscode-extension-samples vscode-extension-samples`
-* **Step #2**: `cd vscode-extension-samples`
-* **Step #3**: `npm install`
-* **Step #4**: Open [VSCode](https://code.visualstudio.com/) and start a sample from the debug viewlet.
+- `git clone https://github.com/Microsoft/vscode-extension-samples`
+- `code `
+- `npm install` in the terminal, then `F5` to run the sample
+- Alternatively, follow the instructions in each sample's README for setting up and running the sample
+
+## Getting Started
+
+- [Hello World Sample](helloworld-sample): The Hello World sample for VS Code. See [Extension Anatomy](https://code.visualstudio.com/api/get-started/extension-anatomy) documentation.
+- [Hello World Minimal Sample](helloworld-minimal-sample): A minimal version of Hello World Sample written in JavaScript.
+- [Hello World Test Sample](helloworld-test-sample): Hello World sample with extension integration test. See [Testing Extensions](https://code.visualstudio.com/api/working-with-extensions/testing-extension) documentation.
+
+## Samples
+
+
+| Sample | Guide on VS Code Website | API & Contribution |
+| ------ | ----- | --- |
+| [Webview Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/webview-sample) | [/api/extension-guides/webview](https://code.visualstudio.com/api/extension-guides/webview) | [window.createWebviewPanel](https://code.visualstudio.com/api/references/vscode-api#window.createWebviewPanel) [window.registerWebviewPanelSerializer](https://code.visualstudio.com/api/references/vscode-api#window.registerWebviewPanelSerializer) |
+| [Status Bar Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/statusbar-sample) | N/A | [window.createStatusBarItem](https://code.visualstudio.com/api/references/vscode-api#window.createStatusBarItem) [StatusBarItem](https://code.visualstudio.com/api/references/vscode-api#StatusBarItem) |
+| [Tree View Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/tree-view-sample) | [/api/extension-guides/tree-view](https://code.visualstudio.com/api/extension-guides/tree-view) | [window.createTreeView](https://code.visualstudio.com/api/references/vscode-api#window.createTreeView) [window.registerTreeDataProvider](https://code.visualstudio.com/api/references/vscode-api#window.registerTreeDataProvider) [TreeView](https://code.visualstudio.com/api/references/vscode-api#TreeView) [TreeDataProvider](https://code.visualstudio.com/api/references/vscode-api#TreeDataProvider) [contributes.views](https://code.visualstudio.com/api/references/contribution-points#contributes.views) [contributes.viewsContainers](https://code.visualstudio.com/api/references/contribution-points#contributes.viewsContainers) |
+| [Task Provider Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/task-provider-sample) | [/api/extension-guides/task-provider](https://code.visualstudio.com/api/extension-guides/task-provider) | [tasks.registerTaskProvider](https://code.visualstudio.com/api/references/vscode-api#tasks.registerTaskProvider) [Task](https://code.visualstudio.com/api/references/vscode-api#Task) [ShellExecution](https://code.visualstudio.com/api/references/vscode-api#ShellExecution) [contributes.taskDefinitions](https://code.visualstudio.com/api/references/contribution-points#contributes.taskDefinitions) |
+| [Multi Root Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/basic-multi-root-sample) | N/A | [workspace.getWorkspaceFolder](https://code.visualstudio.com/api/references/vscode-api#workspace.getWorkspaceFolder) [workspace.onDidChangeWorkspaceFolders](https://code.visualstudio.com/api/references/vscode-api#workspace.onDidChangeWorkspaceFolders) |
+| [Completion Provider Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/completions-sample) | N/A | [languages.registerCompletionItemProvider](https://code.visualstudio.com/api/references/vscode-api#languages.registerCompletionItemProvider) [CompletionItem](https://code.visualstudio.com/api/references/vscode-api#CompletionItem) [SnippetString](https://code.visualstudio.com/api/references/vscode-api#SnippetString) |
+| [Code Actions Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/code-actions-sample) | N/A | [languages.registerCodeActionsProvider](https://code.visualstudio.com/api/references/vscode-api#languages.registerCodeActionsProvider) [CodeActionProvider](https://code.visualstudio.com/api/references/vscode-api#CodeActionProvider) |
+| [File System Provider Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/fsprovider-sample) | N/A | [workspace.registerFileSystemProvider](https://code.visualstudio.com/api/references/vscode-api#workspace.registerFileSystemProvider) |
+| [Editor Decoractor Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/decorator-sample) | N/A | [TextEditor.setDecorations](https://code.visualstudio.com/api/references/vscode-api#TextEditor.setDecorations) [DecorationOptions](https://code.visualstudio.com/api/references/vscode-api#DecorationOptions) [DecorationInstanceRenderOptions](https://code.visualstudio.com/api/references/vscode-api#DecorationInstanceRenderOptions) [ThemableDecorationInstanceRenderOptions](https://code.visualstudio.com/api/references/vscode-api#ThemableDecorationInstanceRenderOptions) [window.createTextEditorDecorationType](https://code.visualstudio.com/api/references/vscode-api#window.createTextEditorDecorationType) [TextEditorDecorationType](https://code.visualstudio.com/api/references/vscode-api#TextEditorDecorationType) [contributes.colors](https://code.visualstudio.com/api/references/contribution-points#contributes.colors) |
+| [I18n Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/i18n-sample) | N/A | |
+| [Terminal Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/terminal-sample) | N/A | [window.createTerminal](https://code.visualstudio.com/api/references/vscode-api#window.createTerminal) [window.onDidChangeActiveTerminal](https://code.visualstudio.com/api/references/vscode-api#window.onDidChangeActiveTerminal) [window.onDidCloseTerminal](https://code.visualstudio.com/api/references/vscode-api#window.onDidCloseTerminal) [window.onDidOpenTerminal](https://code.visualstudio.com/api/references/vscode-api#window.onDidOpenTerminal) [window.Terminal](https://code.visualstudio.com/api/references/vscode-api#window.Terminal) [window.terminals](https://code.visualstudio.com/api/references/vscode-api#window.terminals) |
+| [Extension Terminal Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/extension-terminal-sample) | N/A | [window.createTerminal](https://code.visualstudio.com/api/references/vscode-api#window.createTerminal) [window.Pseudoterminal](https://code.visualstudio.com/api/references/vscode-api#window.Pseudoterminal) [window.ExtensionTerminalOptions](https://code.visualstudio.com/api/references/vscode-api#window.ExtensionTerminalOptions) |
+| [Vim Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/vim-sample) | N/A | [commands](https://code.visualstudio.com/api/references/vscode-api#commands) [StatusBarItem](https://code.visualstudio.com/api/references/vscode-api#StatusBarItem) [window.createStatusBarItem](https://code.visualstudio.com/api/references/vscode-api#window.createStatusBarItem) [TextEditorCursorStyle](https://code.visualstudio.com/api/references/vscode-api#TextEditorCursorStyle) [window.activeTextEditor](https://code.visualstudio.com/api/references/vscode-api#window.activeTextEditor) [Position](https://code.visualstudio.com/api/references/vscode-api#Position) [Range](https://code.visualstudio.com/api/references/vscode-api#Range) [Selection](https://code.visualstudio.com/api/references/vscode-api#Selection) [TextEditor](https://code.visualstudio.com/api/references/vscode-api#TextEditor) [TextEditorRevealType](https://code.visualstudio.com/api/references/vscode-api#TextEditorRevealType) [TextDocument](https://code.visualstudio.com/api/references/vscode-api#TextDocument) |
+| [Source Control Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/source-control-sample) | [/api/extension-guides/scm-provider](https://code.visualstudio.com/api/extension-guides/scm-provider) | [workspace.workspaceFolders](https://code.visualstudio.com/api/references/vscode-api#workspace.workspaceFolders) [SourceControl](https://code.visualstudio.com/api/references/vscode-api#SourceControl) [SourceControlResourceGroup](https://code.visualstudio.com/api/references/vscode-api#SourceControlResourceGroup) [scm.createSourceControl](https://code.visualstudio.com/api/references/vscode-api#scm.createSourceControl) [TextDocumentContentProvider](https://code.visualstudio.com/api/references/vscode-api#TextDocumentContentProvider) [contributes.menus](https://code.visualstudio.com/api/references/contribution-points#contributes.menus) |
+| [Commenting API Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/comment-sample) | N/A | |
+| [Document Editing Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/document-editing-sample) | N/A | [commands](https://code.visualstudio.com/api/references/vscode-api#commands) |
+| [Custom Data Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/custom-data-sample) | [/api/extension-guides/custom-data-extension](https://code.visualstudio.com/api/extension-guides/custom-data-extension) | |
+
+
+### Language Protocol Server Samples
+
+
+| Sample | Guide on VS Code Website | API & Contribution |
+| ------ | ----- | --- |
+| [Snippet Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/snippet-sample) | [/api/language-extensions/snippet-guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) | [contributes.snippets](https://code.visualstudio.com/api/references/contribution-points#contributes.snippets) |
+| [Language Configuration Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/language-configuration-sample) | [/api/language-extensions/language-configuration-guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) | [contributes.languages](https://code.visualstudio.com/api/references/contribution-points#contributes.languages) |
+| [LSP Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/lsp-sample) | [/api/language-extensions/language-server-extension-guide](https://code.visualstudio.com/api/language-extensions/language-server-extension-guide) | |
+| [LSP Log Streaming Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/lsp-log-streaming-sample) | N/A | |
+| [LSP Multi Root Server Sample](https://github.com/Microsoft/vscode-extension-samples/tree/master/lsp-multi-server-sample) | https://github.com/Microsoft/vscode/wiki/Extension-Authoring:-Adopting-Multi-Root-Workspace-APIs#language-client--language-server | |
+
+
+## License
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Licensed under the [MIT](https://github.com/Microsoft/vscode-extension-samples/blob/ext-docs/LICENSE) License.
diff --git a/basic-multi-root-sample/.gitignore b/basic-multi-root-sample/.gitignore
new file mode 100644
index 00000000..c3185c35
--- /dev/null
+++ b/basic-multi-root-sample/.gitignore
@@ -0,0 +1,3 @@
+out
+node_modules
+.vscode-test
\ No newline at end of file
diff --git a/basic-multi-root-sample/.vscode/launch.json b/basic-multi-root-sample/.vscode/launch.json
index ff9770a0..b1a2476b 100644
--- a/basic-multi-root-sample/.vscode/launch.json
+++ b/basic-multi-root-sample/.vscode/launch.json
@@ -1,6 +1,6 @@
// A launch configuration that compiles the extension and then opens it inside a new window
{
- "version": "0.1.0",
+ "version": "0.2.0",
"configurations": [
{
"name": "Launch Extension",
@@ -11,7 +11,7 @@
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
- "preLaunchTask": "tsc: watch - tsconfig.json"
+ "preLaunchTask": "npm: watch"
},
{
"name": "Launch Tests",
@@ -22,7 +22,7 @@
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
- "preLaunchTask": "tsc: watch - tsconfig.json"
+ "preLaunchTask": "npm: watch"
}
]
}
diff --git a/basic-multi-root-sample/README.md b/basic-multi-root-sample/README.md
index efe26315..831434d7 100644
--- a/basic-multi-root-sample/README.md
+++ b/basic-multi-root-sample/README.md
@@ -1,6 +1,6 @@
# Basic multi root API samples
-This extension adds an entry to the status bar that shows the name of the currently active file. To excercise multi root APIs it:
+This extension adds an entry to the status bar that shows the name of the currently active file. To exercise multi root APIs it:
- only enables itself when more than one `WorkspaceFolder` is opened using `workspace.workspaceFolders` API
- shows the name of the `WorkspaceFolder` the file is from (if any) using `workspace.getWorkspaceFolder()` API
- updates when there are changes to the number of `WorkspaceFolder` via the `workspace.onDidChangeWorkspaceFolders()` API
diff --git a/basic-multi-root-sample/package-lock.json b/basic-multi-root-sample/package-lock.json
new file mode 100644
index 00000000..d1d0813f
--- /dev/null
+++ b/basic-multi-root-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "basic-multi-root-sample",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "6.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.6.tgz",
+ "integrity": "sha512-rFs9zCFtSHuseiNXxYxFlun8ibu+jtZPgRM+2ILCmeLiGeGLiIGxuOzD+cNyHegI1GD+da3R/cIbs9+xCLp13w==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/basic-multi-root-sample/package.json b/basic-multi-root-sample/package.json
index 4732c8e0..f8a70af2 100644
--- a/basic-multi-root-sample/package.json
+++ b/basic-multi-root-sample/package.json
@@ -1,46 +1,45 @@
{
- "name": "basic-multi-root-sample",
- "displayName": "Basic Multi Root Sample",
- "description": "Samples for VSCode's multi root API",
- "version": "0.0.1",
- "publisher": "ms-vscode",
- "engines": {
- "vscode": "^1.15.0"
- },
- "categories": [
- "Other"
- ],
- "activationEvents": [
+ "name": "basic-multi-root-sample",
+ "displayName": "Basic Multi Root Sample",
+ "description": "Samples for VSCode's multi root API",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
"*"
],
- "main": "./out/src/extension",
- "scripts": {
- "vscode:prepublish": "tsc -p ./",
- "compile": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install",
- "test": "node ./node_modules/vscode/bin/test"
- },
- "contributes": {
- "configuration": {
- "type": "object",
- "title": "Basic Multi Root Sample",
- "properties": {
- "multiRootSample.statusColor": {
- "type": [
- "string"
- ],
- "default": "#FFFFFF",
- "description": "Color to use for the status bar item. Can be set per workspace folder.",
- "scope": "resource"
- }
- }
- }
- },
- "devDependencies": {
- "typescript": "^2.0.3",
- "vscode": "^1.0.0",
- "mocha": "^2.3.3",
- "@types/node": "^6.0.40",
- "@types/mocha": "^2.2.32"
- }
-}
\ No newline at end of file
+ "main": "./out/src/extension",
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "contributes": {
+ "configuration": {
+ "type": "object",
+ "title": "Basic Multi Root Sample",
+ "properties": {
+ "multiRootSample.statusColor": {
+ "type": [
+ "string"
+ ],
+ "default": "#FFFFFF",
+ "description": "Color to use for the status bar item. Can be set per workspace folder.",
+ "scope": "resource"
+ }
+ }
+ }
+ },
+ "devDependencies": {
+ "@types/node": "^6.0.40",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
+ }
+}
diff --git a/basic-multi-root-sample/src/extension.ts b/basic-multi-root-sample/src/extension.ts
index 7e383b60..8f7e13a1 100644
--- a/basic-multi-root-sample/src/extension.ts
+++ b/basic-multi-root-sample/src/extension.ts
@@ -2,8 +2,6 @@
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
-'use strict';
-
import { ExtensionContext, StatusBarAlignment, window, StatusBarItem, Selection, workspace, TextEditor, commands } from 'vscode';
import { basename } from 'path';
@@ -17,7 +15,7 @@ export function activate(context: ExtensionContext) {
context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => updateStatus(status)));
// Update status bar item based on events for configuration
- context.subscriptions.push(workspace.onDidChangeConfiguration(e => this.updateStatus(status)));
+ context.subscriptions.push(workspace.onDidChangeConfiguration(e => updateStatus(status)));
// Update status bar item based on events around the active editor
context.subscriptions.push(window.onDidChangeActiveTextEditor(e => updateStatus(status)));
@@ -30,9 +28,9 @@ export function activate(context: ExtensionContext) {
function updateStatus(status: StatusBarItem): void {
const info = getEditorInfo();
- status.text = info ? info.text : void 0;
- status.tooltip = info ? info.tooltip : void 0;
- status.color = info ? info.color : void 0;
+ status.text = info ? info.text || '' : '';
+ status.tooltip = info ? info.tooltip : undefined;
+ status.color = info ? info.color : undefined;
if (info) {
status.show();
@@ -41,7 +39,7 @@ function updateStatus(status: StatusBarItem): void {
}
}
-function getEditorInfo(): { text: string; tooltip: string; color: string; } {
+function getEditorInfo(): { text?: string; tooltip?: string; color?: string; } | null {
const editor = window.activeTextEditor;
// If no workspace is opened or just a single folder, we return without any status label
@@ -50,9 +48,9 @@ function getEditorInfo(): { text: string; tooltip: string; color: string; } {
return null;
}
- let text: string;
- let tooltip: string;
- let color: string;
+ let text: string | undefined;
+ let tooltip: string | undefined;
+ let color: string | undefined;
// If we have a file:// resource we resolve the WorkspaceFolder this file is from and update
// the status accordingly.
diff --git a/basic-multi-root-sample/tsconfig.json b/basic-multi-root-sample/tsconfig.json
index 11282c9a..fc7b7a70 100644
--- a/basic-multi-root-sample/tsconfig.json
+++ b/basic-multi-root-sample/tsconfig.json
@@ -1,16 +1,11 @@
{
- "compilerOptions": {
- "module": "commonjs",
- "target": "es6",
- "outDir": "out",
- "lib": [
- "es6"
- ],
- "sourceMap": true,
- "rootDir": "."
- },
- "exclude": [
- "node_modules",
- ".vscode-test"
- ]
-}
\ No newline at end of file
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "rootDir": ".",
+ "strict": true
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/basic-multi-root-sample/tslint.json b/basic-multi-root-sample/tslint.json
new file mode 100644
index 00000000..469c59d5
--- /dev/null
+++ b/basic-multi-root-sample/tslint.json
@@ -0,0 +1,12 @@
+{
+ "rules": {
+ "no-string-throw": true,
+ "no-unused-expression": true,
+ "no-duplicate-variable": true,
+ "curly": true,
+ "class-name": true,
+ "semicolon": [true, "always"],
+ "triple-equals": true
+ },
+ "defaultSeverity": "warning"
+}
diff --git a/code-actions-sample/.vscode/launch.json b/code-actions-sample/.vscode/launch.json
new file mode 100644
index 00000000..e9e60976
--- /dev/null
+++ b/code-actions-sample/.vscode/launch.json
@@ -0,0 +1,22 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
diff --git a/code-actions-sample/.vscode/settings.json b/code-actions-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/code-actions-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/code-actions-sample/.vscode/tasks.json b/code-actions-sample/.vscode/tasks.json
new file mode 100644
index 00000000..241aa6d9
--- /dev/null
+++ b/code-actions-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/code-actions-sample/README.md b/code-actions-sample/README.md
new file mode 100644
index 00000000..20c285de
--- /dev/null
+++ b/code-actions-sample/README.md
@@ -0,0 +1,19 @@
+# Code Action Provider Sample
+
+This sample shows how to provide code actions in the the editor. Code actions are used to implement quick fixes and [refactoring](https://code.visualstudio.com/docs/editor/refactoring) in VS Code
+
+The sample uses the [`CodeActionProvider`](https://code.visualstudio.com/api/references/vscode-api#CodeActionProvider) api to implement a simple set of code actions that convert `:)` to a smiley emoji in markdown files:
+
+
+
+Second example of code action provider shows how to associate code actions with diagnostic (e.g. compilation) problems.
+
+
+
+## VS Code API
+
+### `vscode` module
+
+- [`languages.registerCodeActionsProvider`](https://code.visualstudio.com/api/references/vscode-api#languages.registerCodeActionsProvider)
+- [`Diagnostic.code`](https://code.visualstudio.com/api/references/vscode-api#Diagnostic)
+- [`CodeActionContext.diagnostics`](https://code.visualstudio.com/api/references/vscode-api#CodeActionContext)
diff --git a/code-actions-sample/example.gif b/code-actions-sample/example.gif
new file mode 100644
index 00000000..344d503e
Binary files /dev/null and b/code-actions-sample/example.gif differ
diff --git a/code-actions-sample/example_diagnostic.gif b/code-actions-sample/example_diagnostic.gif
new file mode 100644
index 00000000..2d4830ad
Binary files /dev/null and b/code-actions-sample/example_diagnostic.gif differ
diff --git a/code-actions-sample/package-lock.json b/code-actions-sample/package-lock.json
new file mode 100644
index 00000000..595fd001
--- /dev/null
+++ b/code-actions-sample/package-lock.json
@@ -0,0 +1,327 @@
+{
+ "name": "code-actions-sample",
+ "version": "0.0.2",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "10.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz",
+ "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ }
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/code-actions-sample/package.json b/code-actions-sample/package.json
new file mode 100644
index 00000000..cb38f03d
--- /dev/null
+++ b/code-actions-sample/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "code-actions-sample",
+ "private": true,
+ "displayName": "Code Actions Provider Sample",
+ "version": "0.0.2",
+ "publisher": "vscode-samples",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Microsoft/vscode-extension-samples"
+ },
+ "bugs": {
+ "url": "https://github.com/Microsoft/vscode-extension-samples/issues"
+ },
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onLanguage:markdown"
+ ],
+ "main": "./out/extension.js",
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.18",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
+ }
+}
diff --git a/code-actions-sample/src/diagnostics.ts b/code-actions-sample/src/diagnostics.ts
new file mode 100644
index 00000000..680da884
--- /dev/null
+++ b/code-actions-sample/src/diagnostics.ts
@@ -0,0 +1,67 @@
+/*---------------------------------------------------------
+ * Copyright (C) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------*/
+
+/** To demonstrate code actions associated with Diagnostics problems, this file provides a mock diagnostics entries. */
+
+import * as vscode from 'vscode';
+
+/** Code that is used to associate diagnostic entries with code actions. */
+export const EMOJI_MENTION = 'emoji_mention';
+
+/** String to detect in the text document. */
+const EMOJI = 'emoji';
+
+/**
+ * Analyzes the text document for problems.
+ * This demo diagnostic problem provider finds all mentions of 'emoji'.
+ * @param doc text document to analyze
+ * @param emojiDiagnostics diagnostic collection
+ */
+export function refreshDiagnostics(doc: vscode.TextDocument, emojiDiagnostics: vscode.DiagnosticCollection): void {
+ let diagnostics: vscode.Diagnostic[] = [];
+
+ for (let lineIndex = 0; lineIndex < doc.lineCount; lineIndex++) {
+ const lineOfText = doc.lineAt(lineIndex);
+ if (lineOfText.text.includes(EMOJI)) {
+ diagnostics.push(createDiagnostic(doc, lineOfText, lineIndex));
+ }
+ }
+
+ emojiDiagnostics.set(doc.uri, diagnostics);
+}
+
+function createDiagnostic(doc: vscode.TextDocument, lineOfText: vscode.TextLine, lineIndex: number): vscode.Diagnostic {
+ // find where in the line of thet the 'emoji' is mentioned
+ let index = lineOfText.text.indexOf(EMOJI);
+
+ // create range that represents, where in the document the word is
+ let range = new vscode.Range(lineIndex, index, lineIndex, index + EMOJI.length);
+
+ let diagnostic = new vscode.Diagnostic(range, "When you say 'emoji', do you want to find out more?",
+ vscode.DiagnosticSeverity.Information);
+ diagnostic.code = EMOJI_MENTION;
+ return diagnostic;
+}
+
+export function subscribeToDocumentChanges(context: vscode.ExtensionContext, emojiDiagnostics: vscode.DiagnosticCollection): void {
+ if (vscode.window.activeTextEditor) {
+ refreshDiagnostics(vscode.window.activeTextEditor.document, emojiDiagnostics);
+ }
+ context.subscriptions.push(
+ vscode.window.onDidChangeActiveTextEditor(editor => {
+ if (editor) {
+ refreshDiagnostics(editor.document, emojiDiagnostics);
+ }
+ })
+ );
+
+ context.subscriptions.push(
+ vscode.workspace.onDidChangeTextDocument(e => refreshDiagnostics(e.document, emojiDiagnostics))
+ );
+
+ context.subscriptions.push(
+ vscode.workspace.onDidCloseTextDocument(doc => emojiDiagnostics.delete(doc.uri))
+ );
+
+}
\ No newline at end of file
diff --git a/code-actions-sample/src/extension.ts b/code-actions-sample/src/extension.ts
new file mode 100644
index 00000000..9d5a8676
--- /dev/null
+++ b/code-actions-sample/src/extension.ts
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------
+ * Copyright (C) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------*/
+
+import * as vscode from 'vscode';
+import { subscribeToDocumentChanges, EMOJI_MENTION } from './diagnostics';
+
+const COMMAND = 'code-actions-sample.command';
+
+export function activate(context: vscode.ExtensionContext) {
+ context.subscriptions.push(
+ vscode.languages.registerCodeActionsProvider('markdown', new Emojizer(), {
+ providedCodeActionKinds: Emojizer.providedCodeActionKinds
+ }));
+
+ const emojiDiagnostics = vscode.languages.createDiagnosticCollection("emoji");
+ context.subscriptions.push(emojiDiagnostics);
+
+ subscribeToDocumentChanges(context, emojiDiagnostics);
+
+ context.subscriptions.push(
+ vscode.languages.registerCodeActionsProvider('markdown', new Emojinfo(), {
+ providedCodeActionKinds: Emojinfo.providedCodeActionKinds
+ })
+ );
+
+ context.subscriptions.push(
+ vscode.commands.registerCommand(COMMAND, () => vscode.env.openExternal(vscode.Uri.parse('https://unicode.org/emoji/charts-12.0/full-emoji-list.html')))
+ );
+}
+
+/**
+ * Provides code actions for converting :) to an smiley emoji.
+ */
+export class Emojizer implements vscode.CodeActionProvider {
+
+ public static readonly providedCodeActionKinds = [
+ vscode.CodeActionKind.QuickFix
+ ];
+
+ public provideCodeActions(document: vscode.TextDocument, range: vscode.Range): vscode.CodeAction[] | undefined {
+ if (!this.isAtStartOfSmiley(document, range)) {
+ return;
+ }
+
+ const replaceWithSmileyCatFix = this.createFix(document, range, '😺');
+
+ const replaceWithSmileyFix = this.createFix(document, range, '😀');
+ // Marking a single fix as `preferred` means that users can apply it with a
+ // single keyboard shortcut using the `Auto Fix` command.
+ replaceWithSmileyFix.isPreferred = true;
+
+ const replaceWithSmileyHankyFix = this.createFix(document, range, '💩');
+
+ const commandAction = this.createCommand();
+
+ return [
+ replaceWithSmileyCatFix,
+ replaceWithSmileyFix,
+ replaceWithSmileyHankyFix,
+ commandAction
+ ];
+ }
+
+ private isAtStartOfSmiley(document: vscode.TextDocument, range: vscode.Range) {
+ const start = range.start;
+ const line = document.lineAt(start.line);
+ return line.text[start.character] === ':' && line.text[start.character + 1] === ')';
+ }
+
+ private createFix(document: vscode.TextDocument, range: vscode.Range, emoji: string): vscode.CodeAction {
+ const fix = new vscode.CodeAction(`Convert to ${emoji}`, vscode.CodeActionKind.QuickFix);
+ fix.edit = new vscode.WorkspaceEdit();
+ fix.edit.replace(document.uri, new vscode.Range(range.start, range.start.translate(0, 2)), emoji);
+ return fix;
+ }
+
+ private createCommand(): vscode.CodeAction {
+ const action = new vscode.CodeAction('Learn more...', vscode.CodeActionKind.Empty);
+ action.command = { command: COMMAND, title: 'Learn more about emojis', tooltip: 'This will open the unicode emoji page.' };
+ return action;
+ }
+}
+
+/**
+ * Provides code actions corresponding to diagnostic problems.
+ */
+export class Emojinfo implements vscode.CodeActionProvider {
+
+ public static readonly providedCodeActionKinds = [
+ vscode.CodeActionKind.QuickFix
+ ];
+
+ provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): vscode.CodeAction[] {
+ // for each diagnostic entry that has the matching `code`, create a code action command
+ return context.diagnostics
+ .filter(diagnostic => diagnostic.code === EMOJI_MENTION)
+ .map(diagnostic => this.createCommandCodeAction(diagnostic));
+ }
+
+ private createCommandCodeAction(diagnostic: vscode.Diagnostic): vscode.CodeAction {
+ const action = new vscode.CodeAction('Learn more...', vscode.CodeActionKind.QuickFix);
+ action.command = { command: COMMAND, title: 'Learn more about emojis', tooltip: 'This will open the unicode emoji page.' };
+ action.diagnostics = [diagnostic];
+ action.isPreferred = true;
+ return action;
+ }
+}
\ No newline at end of file
diff --git a/previewhtml-sample/tsconfig.json b/code-actions-sample/tsconfig.json
similarity index 63%
rename from previewhtml-sample/tsconfig.json
rename to code-actions-sample/tsconfig.json
index 5aee25d9..b5a2028b 100644
--- a/previewhtml-sample/tsconfig.json
+++ b/code-actions-sample/tsconfig.json
@@ -1,15 +1,14 @@
-{
- "compilerOptions": {
- "module": "commonjs",
- "target": "es5",
- "outDir": "out",
- "lib": [
- "es6"
- ],
- "sourceMap": true,
- "rootDir": "src"
- },
- "exclude": [
- "node_modules"
- ]
-}
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "src"
+ },
+ "exclude": [
+ "node_modules",
+ ".vscode-test"
+ ]
+}
diff --git a/code-actions-sample/tslint.json b/code-actions-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/code-actions-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/comment-sample/.vscode/launch.json b/comment-sample/.vscode/launch.json
new file mode 100644
index 00000000..612397c4
--- /dev/null
+++ b/comment-sample/.vscode/launch.json
@@ -0,0 +1,22 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/comment-sample/.vscode/settings.json b/comment-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/comment-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/multi-diagnostics-sample/.vscode/tasks.json b/comment-sample/.vscode/tasks.json
similarity index 100%
rename from multi-diagnostics-sample/.vscode/tasks.json
rename to comment-sample/.vscode/tasks.json
diff --git a/comment-sample/README.md b/comment-sample/README.md
new file mode 100644
index 00000000..8f221183
--- /dev/null
+++ b/comment-sample/README.md
@@ -0,0 +1,16 @@
+# Commenting API Example
+
+This sample shows
+
+- How to create a comment controller.
+- How to support comment thread creation for documents.
+- How to update comment actions dynamically.
+
+
+
+## Running the Sample
+
+- Run `npm install` in terminal to install dependencies
+- Run the `Run Extension` target in the Debug View. This will:
+ - Start a task `npm: watch` to compile the code
+ - Run the extension in a new VS Code window
diff --git a/comment-sample/package-lock.json b/comment-sample/package-lock.json
new file mode 100644
index 00000000..eaf9172d
--- /dev/null
+++ b/comment-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "vscode-comment-api-example",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "6.14.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.4.tgz",
+ "integrity": "sha512-UqB7h2dVJr/KdZXRMJIhNUWT0HXVe9UNvfLCOsqiSGKAVaAp0QniYHlU9yegxyG6Ug2rc7VdAD4hYj3VghqvAw==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.37.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.37.0.tgz",
+ "integrity": "sha512-PRfeuqYuzk3vjf+puzxltIUWC+AhEGYpFX29/37w30DQSQnpf5AgMVf7GDBAdmTbWTBou+EMFz/Ne6XCM/KxzQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/comment-sample/package.json b/comment-sample/package.json
new file mode 100644
index 00000000..f5e8fe11
--- /dev/null
+++ b/comment-sample/package.json
@@ -0,0 +1,158 @@
+{
+ "name": "vscode-comment-api-example",
+ "displayName": "Comment API Sample",
+ "description": "Comment API Sample",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "engines": {
+ "vscode": "^1.35.0"
+ },
+ "enableProposedApi": true,
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "*"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "commands": [
+ {
+ "command": "mywiki.createNote",
+ "title": "Create Note",
+ "enablement": "!commentIsEmpty"
+ },
+ {
+ "command": "mywiki.replyNote",
+ "title": "Reply",
+ "enablement": "!commentIsEmpty"
+ },
+ {
+ "command": "mywiki.editNote",
+ "title": "Edit",
+ "icon": {
+ "dark": "resources/edit_inverse.svg",
+ "light": "resources/edit.svg"
+ }
+ },
+ {
+ "command": "mywiki.deleteNote",
+ "title": "Delete",
+ "icon": {
+ "dark": "resources/close_inverse.svg",
+ "light": "resources/close.svg"
+ }
+ },
+ {
+ "command": "mywiki.deleteNoteComment",
+ "title": "Delete",
+ "icon": {
+ "dark": "resources/close_inverse.svg",
+ "light": "resources/close.svg"
+ }
+ },
+ {
+ "command": "mywiki.saveNote",
+ "title": "Save"
+ },
+ {
+ "command": "mywiki.cancelsaveNote",
+ "title": "Cancel"
+ },
+ {
+ "command": "mywiki.startDraft",
+ "title": "Start draft",
+ "enablement": "!commentIsEmpty"
+ },
+ {
+ "command": "mywiki.finishDraft",
+ "title": "Finish draft"
+ },
+ {
+ "command": "mywiki.dispose",
+ "title": "Remove All Notes"
+ }
+ ],
+ "menus": {
+ "commandPalette": [
+ {
+ "command": "mywiki.createNote",
+ "when": "false"
+ },
+ {
+ "command": "mywiki.replyNote",
+ "when": "false"
+ },
+ {
+ "command": "mywiki.deleteNote",
+ "when": "false"
+ },
+ {
+ "command": "mywiki.deleteNoteComment",
+ "when": "false"
+ }
+ ],
+ "comments/commentThread/title": [
+ {
+ "command": "mywiki.deleteNote",
+ "group": "navigation",
+ "when": "!commentThreadIsEmpty"
+ }
+ ],
+ "comments/commentThread/context": [
+ {
+ "command": "mywiki.createNote",
+ "group": "inline",
+ "when": "commentThreadIsEmpty"
+ },
+ {
+ "command": "mywiki.replyNote",
+ "group": "inline",
+ "when": "!commentThreadIsEmpty"
+ },
+ {
+ "command": "mywiki.startDraft",
+ "group": "inline",
+ "when": "commentThread != draft"
+ },
+ {
+ "command": "mywiki.finishDraft",
+ "group": "inline",
+ "when": "commentThread == draft"
+ }
+ ],
+ "comments/comment/title": [
+ {
+ "command": "mywiki.editNote",
+ "group": "group@1"
+ },
+ {
+ "command": "mywiki.deleteNoteComment",
+ "group": "group@2"
+ }
+ ],
+ "comments/comment/context": [
+ {
+ "command": "mywiki.cancelsaveNote",
+ "group": "inline@1"
+ },
+ {
+ "command": "mywiki.saveNote",
+ "group": "inline@2"
+ }
+ ]
+ }
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "watch": "tsc -watch -p ./",
+ "lint": "tslint -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^6.0.40",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.35.0"
+ }
+}
diff --git a/comment-sample/resources/close.svg b/comment-sample/resources/close.svg
new file mode 100644
index 00000000..fde34404
--- /dev/null
+++ b/comment-sample/resources/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/comment-sample/resources/close_inverse.svg b/comment-sample/resources/close_inverse.svg
new file mode 100644
index 00000000..d88aa121
--- /dev/null
+++ b/comment-sample/resources/close_inverse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/comment-sample/resources/edit.svg b/comment-sample/resources/edit.svg
new file mode 100755
index 00000000..ecde9240
--- /dev/null
+++ b/comment-sample/resources/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/comment-sample/resources/edit_inverse.svg b/comment-sample/resources/edit_inverse.svg
new file mode 100755
index 00000000..da956cb2
--- /dev/null
+++ b/comment-sample/resources/edit_inverse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/comment-sample/src/extension.ts b/comment-sample/src/extension.ts
new file mode 100644
index 00000000..c2f6daf7
--- /dev/null
+++ b/comment-sample/src/extension.ts
@@ -0,0 +1,135 @@
+'use strict';
+
+import * as vscode from 'vscode';
+
+let commentId = 1;
+
+class NoteComment implements vscode.Comment {
+ id: number;
+ label: string | undefined;
+ constructor(
+ public body: string | vscode.MarkdownString,
+ public mode: vscode.CommentMode,
+ public author: vscode.CommentAuthorInformation,
+ public parent?: vscode.CommentThread
+ ) {
+ this.id = ++commentId;
+ }
+}
+
+export function activate(context: vscode.ExtensionContext) {
+ // A `CommentController` is able to provide comments for documents.
+ const commentController = vscode.comments.createCommentController('comment-sample', 'Comment API Sample');
+ context.subscriptions.push(commentController);
+ vscode.commands.executeCommand('setContext', 'inDraft', false);
+
+ // commenting range provider
+ commentController.commentingRangeProvider = {
+ provideCommentingRanges: (document: vscode.TextDocument, token: vscode.CancellationToken) => {
+ let lineCount = document.lineCount;
+ return [new vscode.Range(0, 0, lineCount - 1, 0)];
+ }
+ };
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.createNote', (reply: vscode.CommentReply) => {
+ replyNote(reply);
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.replyNote', (reply: vscode.CommentReply) => {
+ replyNote(reply);
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.startDraft', (reply: vscode.CommentReply) => {
+ let thread = reply.thread;
+ thread.contextValue = 'draft';
+ let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread);
+ newComment.label = 'pending';
+ thread.comments = [...thread.comments, newComment];
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.finishDraft', (reply: vscode.CommentReply) => {
+ vscode.commands.executeCommand('setContext', 'inDraft', false);
+
+ let thread = reply.thread;
+
+ if (!thread) {
+ return;
+ }
+
+ thread.collapsibleState = vscode.CommentThreadCollapsibleState.Collapsed;
+ let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread);
+ thread.comments = [...thread.comments, newComment].map(comment => {
+ comment.label = undefined;
+ return comment;
+ });
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.deleteNoteComment', (comment: NoteComment) => {
+ let thread = comment.parent;
+ if (!thread) {
+ return;
+ }
+
+ thread.comments = thread.comments.filter(cmt => (cmt as NoteComment).id !== comment.id);
+
+ if (thread.comments.length === 0) {
+ thread.dispose();
+ }
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.deleteNote', (thread: vscode.CommentThread) => {
+ thread.dispose();
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.cancelsaveNote', (comment: NoteComment) => {
+ if (!comment.parent) {
+ return;
+ }
+
+ comment.parent.comments = comment.parent.comments.map(cmt => {
+ if ((cmt as NoteComment).id === comment.id) {
+ cmt.mode = vscode.CommentMode.Preview;
+ }
+
+ return cmt;
+ });
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.saveNote', (comment: NoteComment) => {
+ if (!comment.parent) {
+ return;
+ }
+
+ comment.parent.comments = comment.parent.comments.map(cmt => {
+ if ((cmt as NoteComment).id === comment.id) {
+ cmt.mode = vscode.CommentMode.Preview;
+ }
+
+ return cmt;
+ });
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.editNote', (comment: NoteComment) => {
+ if (!comment.parent) {
+ return;
+ }
+
+ comment.parent.comments = comment.parent.comments.map(cmt => {
+ if ((cmt as NoteComment).id === comment.id) {
+ cmt.mode = vscode.CommentMode.Editing;
+ }
+
+ return cmt;
+ });
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('mywiki.dispose', () => {
+ commentController.dispose();
+ }));
+
+ function replyNote(reply: vscode.CommentReply) {
+ let thread = reply.thread;
+ let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread);
+ thread.comments = [...thread.comments, newComment];
+ }
+}
diff --git a/comment-sample/tsconfig.json b/comment-sample/tsconfig.json
new file mode 100644
index 00000000..4ce52747
--- /dev/null
+++ b/comment-sample/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "src"
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/comment-sample/tslint.json b/comment-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/comment-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/comment-sample/wiki-demo.gif b/comment-sample/wiki-demo.gif
new file mode 100644
index 00000000..3d542d48
Binary files /dev/null and b/comment-sample/wiki-demo.gif differ
diff --git a/completions-sample/.vscode/launch.json b/completions-sample/.vscode/launch.json
new file mode 100644
index 00000000..e9e60976
--- /dev/null
+++ b/completions-sample/.vscode/launch.json
@@ -0,0 +1,22 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
diff --git a/completions-sample/.vscode/settings.json b/completions-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/completions-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/completions-sample/.vscode/tasks.json b/completions-sample/.vscode/tasks.json
new file mode 100644
index 00000000..241aa6d9
--- /dev/null
+++ b/completions-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/completions-sample/README.md b/completions-sample/README.md
index 7e2b11fd..b10cf569 100644
--- a/completions-sample/README.md
+++ b/completions-sample/README.md
@@ -1 +1,12 @@
# Completion Item Provider Sample
+
+This sample shows how to provide completions aka IntelliSense into the editor. The sample uses the `CompletionItemProvider` api.
+
+
+
+
+## VS Code API
+
+### `vscode` module
+
+- [`languages.registerCompletionItemProvider`](https://code.visualstudio.com/api/references/vscode-api#languages.registerCompletionItemProvider)
diff --git a/completions-sample/demo.gif b/completions-sample/demo.gif
new file mode 100644
index 00000000..42b5a3c3
Binary files /dev/null and b/completions-sample/demo.gif differ
diff --git a/completions-sample/package-lock.json b/completions-sample/package-lock.json
index 3607e99e..e8777759 100644
--- a/completions-sample/package-lock.json
+++ b/completions-sample/package-lock.json
@@ -4,312 +4,102 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
"@types/node": {
- "version": "6.0.108",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.108.tgz",
- "integrity": "sha512-5q14jNJCPW+Iwk6Y1JxtA7T5ov1aVRS2VA2PvRgFMZtCjoIo8WT1WO56dSV0MSiHR7BEoe2QNuXigBQNqbWdAw==",
+ "version": "10.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz",
+ "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==",
"dev": true
},
- "ajv": {
- "version": "5.5.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
- "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
- "dev": true,
- "requires": {
- "co": "4.6.0",
- "fast-deep-equal": "1.1.0",
- "fast-json-stable-stringify": "2.0.0",
- "json-schema-traverse": "0.3.1"
- }
- },
- "ansi-cyan": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
- "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-red": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
- "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
"dev": true
},
"ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
- "dev": true
- },
- "arr-diff": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
- "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
- "arr-flatten": "1.1.0",
- "array-slice": "0.2.3"
+ "color-convert": "^1.9.0"
}
},
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
- "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
- "dev": true
- },
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
- "dev": true
- },
- "array-slice": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
- "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
- "dev": true
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
- "array-uniq": "1.0.3"
+ "sprintf-js": "~1.0.2"
}
},
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "dev": true
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
- "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "dev": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
- "dev": true
- },
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "boom": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
- "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
- "dev": true,
- "requires": {
- "hoek": "4.2.1"
- }
- },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
- "balanced-match": "1.0.0",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "browser-stdout": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
- "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
- "dev": true
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
- "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
"dev": true
},
"chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "clone": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
- "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
- "dev": true
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
- "dev": true
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
- "dev": true
- },
- "cloneable-readable": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
- "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
- "dev": true,
- "requires": {
- "inherits": "2.0.3",
- "process-nextick-args": "2.0.0",
- "readable-stream": "2.3.6"
- }
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
- "dev": true
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
- "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "dev": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"concat-map": {
@@ -318,325 +108,28 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "convert-source-map": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
- "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "cryptiles": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
- "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
- "dev": true,
- "requires": {
- "boom": "5.2.0"
- },
- "dependencies": {
- "boom": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
- "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
- "dev": true,
- "requires": {
- "hoek": "4.2.1"
- }
- }
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "dev": true
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-assign": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz",
- "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
- "dev": true,
- "requires": {
- "is-obj": "1.0.1"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
"diff": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
- "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
- "dev": true
- },
- "duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "dev": true,
- "requires": {
- "readable-stream": "1.1.14"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
- }
- },
- "duplexify": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
- "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
- "dev": true,
- "requires": {
- "end-of-stream": "1.4.1",
- "inherits": "2.0.3",
- "readable-stream": "2.3.6",
- "stream-shift": "1.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "dev": true,
- "requires": {
- "once": "1.4.0"
- }
- },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
- "event-stream": {
- "version": "3.3.4",
- "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
- "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
- "dev": true,
- "requires": {
- "duplexer": "0.1.1",
- "from": "0.1.7",
- "map-stream": "0.1.0",
- "pause-stream": "0.0.11",
- "split": "0.3.3",
- "stream-combiner": "0.0.4",
- "through": "2.3.8"
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
- "extend-shallow": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
- "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
- "dev": true,
- "requires": {
- "kind-of": "1.1.0"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fancy-log": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
- "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
- "dev": true,
- "requires": {
- "ansi-gray": "0.1.1",
- "color-support": "1.1.3",
- "time-stamp": "1.1.0"
- }
- },
- "fast-deep-equal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
- "dev": true
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "fd-slicer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
- "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
- "dev": true,
- "requires": {
- "pend": "1.2.0"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "dev": true,
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "first-chunk-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
- "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
- "dev": true
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true,
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
- "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
- "dev": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.6",
- "mime-types": "2.1.18"
- }
- },
- "from": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
- "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
"dev": true
},
"fs.realpath": {
@@ -645,542 +138,18 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "fstream": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
- "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
- "dev": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.2"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
"glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dev": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- },
- "dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- }
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dev": true,
- "requires": {
- "is-glob": "3.1.0",
- "path-dirname": "1.0.2"
- }
- },
- "glob-stream": {
- "version": "5.3.5",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
- "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
- "dev": true,
- "requires": {
- "extend": "3.0.1",
- "glob": "5.0.15",
- "glob-parent": "3.1.0",
- "micromatch": "2.3.11",
- "ordered-read-streams": "0.3.0",
- "through2": "0.6.5",
- "to-absolute-glob": "0.1.1",
- "unique-stream": "2.2.1"
- },
- "dependencies": {
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- }
- }
- }
- },
- "glogg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
- "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
- "dev": true,
- "requires": {
- "sparkles": "1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
- "dev": true
- },
- "growl": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
- "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
- "dev": true
- },
- "gulp-chmod": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz",
- "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=",
- "dev": true,
- "requires": {
- "deep-assign": "1.0.0",
- "stat-mode": "0.2.2",
- "through2": "2.0.3"
- }
- },
- "gulp-filter": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz",
- "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=",
- "dev": true,
- "requires": {
- "multimatch": "2.1.0",
- "plugin-error": "0.1.2",
- "streamfilter": "1.0.7"
- }
- },
- "gulp-gunzip": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz",
- "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=",
- "dev": true,
- "requires": {
- "through2": "0.6.5",
- "vinyl": "0.4.6"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- }
- }
- }
- },
- "gulp-remote-src-vscode": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz",
- "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==",
- "dev": true,
- "requires": {
- "event-stream": "3.3.4",
- "node.extend": "1.1.6",
- "request": "2.85.0",
- "through2": "2.0.3",
- "vinyl": "2.1.0"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
- "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "vinyl": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
- "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
- "dev": true,
- "requires": {
- "clone": "2.1.1",
- "clone-buffer": "1.0.0",
- "clone-stats": "1.0.0",
- "cloneable-readable": "1.1.2",
- "remove-trailing-separator": "1.1.0",
- "replace-ext": "1.0.0"
- }
- }
- }
- },
- "gulp-sourcemaps": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
- "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
- "dev": true,
- "requires": {
- "convert-source-map": "1.5.1",
- "graceful-fs": "4.1.11",
- "strip-bom": "2.0.0",
- "through2": "2.0.3",
- "vinyl": "1.2.0"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
- },
- "vinyl": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
- "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
- "dev": true,
- "requires": {
- "clone": "1.0.4",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "gulp-symdest": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz",
- "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=",
- "dev": true,
- "requires": {
- "event-stream": "3.3.4",
- "mkdirp": "0.5.1",
- "queue": "3.1.0",
- "vinyl-fs": "2.4.4"
- }
- },
- "gulp-untar": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz",
- "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=",
- "dev": true,
- "requires": {
- "event-stream": "3.3.4",
- "gulp-util": "3.0.8",
- "streamifier": "0.1.1",
- "tar": "2.2.1",
- "through2": "2.0.3"
- }
- },
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "dev": true,
- "requires": {
- "array-differ": "1.0.0",
- "array-uniq": "1.0.3",
- "beeper": "1.1.1",
- "chalk": "1.1.3",
- "dateformat": "2.2.0",
- "fancy-log": "1.3.2",
- "gulplog": "1.0.0",
- "has-gulplog": "0.1.0",
- "lodash._reescape": "3.0.0",
- "lodash._reevaluate": "3.0.0",
- "lodash._reinterpolate": "3.0.0",
- "lodash.template": "3.6.2",
- "minimist": "1.2.0",
- "multipipe": "0.1.2",
- "object-assign": "3.0.0",
- "replace-ext": "0.0.1",
- "through2": "2.0.3",
- "vinyl": "0.5.3"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
- "dev": true
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
- },
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "dev": true,
- "requires": {
- "clone": "1.0.4",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "gulp-vinyl-zip": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz",
- "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=",
- "dev": true,
- "requires": {
- "event-stream": "3.3.4",
- "queue": "4.4.2",
- "through2": "2.0.3",
- "vinyl": "2.1.0",
- "vinyl-fs": "2.4.4",
- "yauzl": "2.9.1",
- "yazl": "2.4.3"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
- "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "queue": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz",
- "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "vinyl": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
- "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
- "dev": true,
- "requires": {
- "clone": "2.1.1",
- "clone-buffer": "1.0.0",
- "clone-stats": "1.0.0",
- "cloneable-readable": "1.1.2",
- "remove-trailing-separator": "1.1.0",
- "replace-ext": "1.0.0"
- }
- }
- }
- },
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "dev": true,
- "requires": {
- "glogg": "1.0.1"
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
- "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
- "dev": true,
- "requires": {
- "ajv": "5.5.2",
- "har-schema": "2.0.0"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-flag": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
- "dev": true
- },
- "has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dev": true,
- "requires": {
- "sparkles": "1.0.0"
- }
- },
- "hawk": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
- "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
- "dev": true,
- "requires": {
- "boom": "4.3.1",
- "cryptiles": "3.1.2",
- "hoek": "4.2.1",
- "sntp": "2.1.0"
- }
- },
- "he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
- "dev": true
- },
- "hoek": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
- "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
- "dev": true
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "jsprim": "1.4.1",
- "sshpk": "1.14.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"inflight": {
@@ -1189,8 +158,8 @@
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -1199,413 +168,20 @@
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
- "is": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz",
- "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=",
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "dev": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"dev": true,
"requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "2.1.1"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
- "dev": true
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-valid-glob": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
- "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
- "dev": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "dev": true,
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "kind-of": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
- "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
- "dev": true
- },
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "dev": true,
- "requires": {
- "readable-stream": "2.3.6"
- }
- },
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
- "dev": true
- },
- "lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
- "dev": true
- },
- "lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
- "dev": true
- },
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
- "dev": true
- },
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
- "dev": true
- },
- "lodash._reescape": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
- "dev": true
- },
- "lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
- "dev": true
- },
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
- "dev": true
- },
- "lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
- "dev": true
- },
- "lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
- "dev": true,
- "requires": {
- "lodash._root": "3.0.1"
- }
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
- "dev": true
- },
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
- "dev": true
- },
- "lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
- "dev": true
- },
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "dev": true,
- "requires": {
- "lodash._getnative": "3.9.1",
- "lodash.isarguments": "3.1.0",
- "lodash.isarray": "3.0.4"
- }
- },
- "lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
- "dev": true
- },
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "3.0.1",
- "lodash._basetostring": "3.0.1",
- "lodash._basevalues": "3.0.0",
- "lodash._isiterateecall": "3.0.9",
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0",
- "lodash.keys": "3.1.2",
- "lodash.restparam": "3.6.1",
- "lodash.templatesettings": "3.1.1"
- }
- },
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "dev": true,
- "requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0"
- }
- },
- "map-stream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
- "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
- "dev": true
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "dev": true,
- "requires": {
- "readable-stream": "2.3.6"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- },
- "dependencies": {
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true,
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "dev": true,
- "requires": {
- "mime-db": "1.33.0"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
}
},
"minimatch": {
@@ -1614,7 +190,7 @@
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
- "brace-expansion": "1.1.11"
+ "brace-expansion": "^1.1.7"
}
},
"minimist": {
@@ -1632,787 +208,120 @@
"minimist": "0.0.8"
}
},
- "mocha": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
- "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
- "dev": true,
- "requires": {
- "browser-stdout": "1.3.0",
- "commander": "2.11.0",
- "debug": "3.1.0",
- "diff": "3.3.1",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.2",
- "growl": "1.10.3",
- "he": "1.1.1",
- "mkdirp": "0.5.1",
- "supports-color": "4.4.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
- "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
- "dev": true,
- "requires": {
- "has-flag": "2.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "multimatch": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
- "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
- "dev": true,
- "requires": {
- "array-differ": "1.0.0",
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "minimatch": "3.0.4"
- }
- },
- "multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
- "dev": true,
- "requires": {
- "duplexer2": "0.0.2"
- }
- },
- "node.extend": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz",
- "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=",
- "dev": true,
- "requires": {
- "is": "3.2.1"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "dev": true,
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
- "ordered-read-streams": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
- "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
- "dev": true,
- "requires": {
- "is-stream": "1.1.0",
- "readable-stream": "2.3.6"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "dev": true,
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- }
- }
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
- "dev": true
- },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
- "pause-stream": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
- "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
"dev": true,
"requires": {
- "through": "2.3.8"
+ "path-parse": "^1.0.6"
}
},
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
- "dev": true
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "plugin-error": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
- "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
- "dev": true,
- "requires": {
- "ansi-cyan": "0.1.1",
- "ansi-red": "0.1.1",
- "arr-diff": "1.1.0",
- "arr-union": "2.1.0",
- "extend-shallow": "1.1.4"
- }
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "dev": true
- },
- "querystringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
- "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
- "dev": true
- },
- "queue": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz",
- "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "dev": true,
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.2",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "request": {
- "version": "2.85.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
- "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
- "dev": true,
- "requires": {
- "aws-sign2": "0.7.0",
- "aws4": "1.7.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.6",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.3.2",
- "har-validator": "5.0.3",
- "hawk": "6.0.2",
- "http-signature": "1.2.0",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.18",
- "oauth-sign": "0.8.2",
- "performance-now": "2.1.0",
- "qs": "6.5.2",
- "safe-buffer": "5.1.2",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.4",
- "tunnel-agent": "0.6.0",
- "uuid": "3.2.1"
- }
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "dev": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
"semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true
},
- "sntp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
- "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
- "dev": true,
- "requires": {
- "hoek": "4.2.1"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "source-map-support": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz",
- "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==",
- "dev": true,
- "requires": {
- "buffer-from": "1.0.0",
- "source-map": "0.6.1"
- }
- },
- "sparkles": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
- "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
- "dev": true
- },
- "split": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
- "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
- "dev": true,
- "requires": {
- "through": "2.3.8"
- }
- },
- "sshpk": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
- "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
- "dev": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- }
- },
- "stat-mode": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
- "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
- "dev": true
- },
- "stream-combiner": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
- "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
- "dev": true,
- "requires": {
- "duplexer": "0.1.1"
- }
- },
- "stream-shift": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
- "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
- "dev": true
- },
- "streamfilter": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz",
- "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==",
- "dev": true,
- "requires": {
- "readable-stream": "2.3.6"
- }
- },
- "streamifier": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
- "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
- "dev": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "0.2.1"
- }
- },
- "strip-bom-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
- "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
- "dev": true,
- "requires": {
- "first-chunk-stream": "1.0.0",
- "strip-bom": "2.0.0"
- }
- },
"supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tar": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
- "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
- "dev": true
- },
- "through2": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
- "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
- "dev": true,
- "requires": {
- "readable-stream": "2.3.6",
- "xtend": "4.0.1"
- }
- },
- "through2-filter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
- "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
- "dev": true,
- "requires": {
- "through2": "2.0.3",
- "xtend": "4.0.1"
- }
- },
- "time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
- "dev": true
- },
- "to-absolute-glob": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
- "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
- "dev": true,
- "requires": {
- "extend-shallow": "2.0.1"
+ "has-flag": "^3.0.0"
},
"dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
}
}
},
- "tough-cookie": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
- "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
"dev": true,
"requires": {
- "punycode": "1.4.1"
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ }
}
},
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
"dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "tslib": "^1.8.1"
}
},
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true,
- "optional": true
- },
"typescript": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
- "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
"dev": true
},
- "unique-stream": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
- "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
- "dev": true,
- "requires": {
- "json-stable-stringify": "1.0.1",
- "through2-filter": "2.0.0"
- }
- },
- "url-parse": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz",
- "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==",
- "dev": true,
- "requires": {
- "querystringify": "2.0.0",
- "requires-port": "1.0.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "uuid": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
- "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
- "dev": true
- },
- "vali-date": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
- "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "1.3.0"
- }
- },
- "vinyl": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
- "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
- "dev": true,
- "requires": {
- "clone": "0.2.0",
- "clone-stats": "0.0.1"
- }
- },
- "vinyl-fs": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
- "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
- "dev": true,
- "requires": {
- "duplexify": "3.5.4",
- "glob-stream": "5.3.5",
- "graceful-fs": "4.1.11",
- "gulp-sourcemaps": "1.6.0",
- "is-valid-glob": "0.3.0",
- "lazystream": "1.0.0",
- "lodash.isequal": "4.5.0",
- "merge-stream": "1.0.1",
- "mkdirp": "0.5.1",
- "object-assign": "4.1.1",
- "readable-stream": "2.3.6",
- "strip-bom": "2.0.0",
- "strip-bom-stream": "1.0.0",
- "through2": "2.0.3",
- "through2-filter": "2.0.0",
- "vali-date": "1.0.0",
- "vinyl": "1.2.0"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
- },
- "vinyl": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
- "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
- "dev": true,
- "requires": {
- "clone": "1.0.4",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "vinyl-source-stream": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
- "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
- "dev": true,
- "requires": {
- "through2": "2.0.3",
- "vinyl": "0.4.6"
- }
- },
- "vscode": {
- "version": "1.1.17",
- "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.17.tgz",
- "integrity": "sha512-yNMyrgEua2qyW7+trNNYhA6PeldRrBcwtLtlazkdtzcmkHMKECM/08bPF8HF2ZFuwHgD+8FQsdqd/DvJYQYjJg==",
- "dev": true,
- "requires": {
- "glob": "7.1.2",
- "gulp-chmod": "2.0.0",
- "gulp-filter": "5.1.0",
- "gulp-gunzip": "1.0.0",
- "gulp-remote-src-vscode": "0.5.0",
- "gulp-symdest": "1.1.0",
- "gulp-untar": "0.0.6",
- "gulp-vinyl-zip": "2.1.0",
- "mocha": "4.1.0",
- "request": "2.85.0",
- "semver": "5.5.0",
- "source-map-support": "0.5.5",
- "url-parse": "1.4.0",
- "vinyl-source-stream": "1.1.2"
- }
- },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
- },
- "yauzl": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
- "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
- "dev": true,
- "requires": {
- "buffer-crc32": "0.2.13",
- "fd-slicer": "1.0.1"
- }
- },
- "yazl": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz",
- "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=",
- "dev": true,
- "requires": {
- "buffer-crc32": "0.2.13"
- }
}
}
}
diff --git a/completions-sample/package.json b/completions-sample/package.json
index 99308b92..b90efb67 100644
--- a/completions-sample/package.json
+++ b/completions-sample/package.json
@@ -2,7 +2,7 @@
"name": "completions-sample",
"displayName": "Completion Item Provider Sample",
"version": "0.0.2",
- "publisher": "jrieken",
+ "publisher": "vscode-samples",
"repository": {
"type": "git",
"url": "https://github.com/Microsoft/vscode-extension-samples"
@@ -11,7 +11,7 @@
"url": "https://github.com/Microsoft/vscode-extension-samples/issues"
},
"engines": {
- "vscode": "^1.18.0"
+ "vscode": "^1.32.0"
},
"categories": [
"Other"
@@ -19,16 +19,17 @@
"activationEvents": [
"*"
],
- "main": "./out/extension",
+ "main": "./out/extension.js",
"scripts": {
- "vscode:prepublish": "tsc -p ./",
- "compile": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install",
- "tslint": "tslint -c tslint.json src/extension.ts"
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
},
"devDependencies": {
- "typescript": "^2.1.4",
- "vscode": "^1.1.17",
- "@types/node": "^6.0.40"
+ "@types/node": "^10.12.18",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
}
}
diff --git a/completions-sample/src/extension.ts b/completions-sample/src/extension.ts
index 316947b3..306d43de 100644
--- a/completions-sample/src/extension.ts
+++ b/completions-sample/src/extension.ts
@@ -2,38 +2,71 @@
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
-'use strict';
-
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
- // The most simple completion item provider which
- // * registers for text files (`'plaintext'`), and
- // * return the 'Hello World' and
- // a snippet-based completion item.
- vscode.languages.registerCompletionItemProvider('plaintext', {
+ let provider1 = vscode.languages.registerCompletionItemProvider('plaintext', {
+
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
+
+ // a simple completion item which inserts `Hello World!`
+ const simpleCompletion = new vscode.CompletionItem('Hello World!');
+
+ // a completion item that inserts its text as snippet,
+ // the `insertText`-property is a `SnippetString` which will be
+ // honored by the editor.
+ const snippetCompletion = new vscode.CompletionItem('Good part of the day');
+ snippetCompletion.insertText = new vscode.SnippetString('Good ${1|morning,afternoon,evening|}. It is ${1}, right?');
+ snippetCompletion.documentation = new vscode.MarkdownString("Inserts a snippet that lets you select the _appropriate_ part of the day for your greeting.");
+
+ // a completion item that can be accepted by a commit character,
+ // the `commitCharacters`-property is set which means that the completion will
+ // be inserted and then the character will be typed.
+ const commitCharacterCompletion = new vscode.CompletionItem('console');
+ commitCharacterCompletion.commitCharacters = ['.'];
+ commitCharacterCompletion.documentation = new vscode.MarkdownString('Press `.` to get `console.`');
+
+ // a completion item that retriggers IntelliSense when being accepted,
+ // the `command`-property is set which the editor will execute after
+ // completion has been inserted. Also, the `insertText` is set so that
+ // a space is inserted after `new`
+ const commandCompletion = new vscode.CompletionItem('new');
+ commandCompletion.kind = vscode.CompletionItemKind.Keyword;
+ commandCompletion.insertText = 'new ';
+ commandCompletion.command = { command: 'editor.action.triggerSuggest', title: 'Re-trigger completions...' };
+
+ // return all completion items as array
return [
- new vscode.CompletionItem('Hello World!'),
- createSnippetItem()
+ simpleCompletion,
+ snippetCompletion,
+ commitCharacterCompletion,
+ commandCompletion
];
}
});
- function createSnippetItem(): vscode.CompletionItem {
+ const provider2 = vscode.languages.registerCompletionItemProvider(
+ 'plaintext',
+ {
+ provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {
- // Read more here:
- // https://code.visualstudio.com/docs/extensionAPI/vscode-api#CompletionItem
- // https://code.visualstudio.com/docs/extensionAPI/vscode-api#SnippetString
+ // get all text until the `position` and check if it reads `console.`
+ // and if so then complete if `log`, `warn`, and `error`
+ let linePrefix = document.lineAt(position).text.substr(0, position.character);
+ if (!linePrefix.endsWith('console.')) {
+ return undefined;
+ }
- // For SnippetString syntax look here:
- // https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets
+ return [
+ new vscode.CompletionItem('log', vscode.CompletionItemKind.Method),
+ new vscode.CompletionItem('warn', vscode.CompletionItemKind.Method),
+ new vscode.CompletionItem('error', vscode.CompletionItemKind.Method),
+ ];
+ }
+ },
+ '.' // triggered whenever a '.' is being typed
+ );
- let item = new vscode.CompletionItem('Good part of the day', vscode.CompletionItemKind.Snippet);
- item.insertText = new vscode.SnippetString("Good ${1|morning,afternoon,evening|}. It is ${1}, right?");
- item.documentation = new vscode.MarkdownString("Inserts a snippet that lets you select the _appropriate_ part of the day for your greeting.");
-
- return item;
- }
+ context.subscriptions.push(provider1, provider2);
}
diff --git a/completions-sample/tsconfig.json b/completions-sample/tsconfig.json
index c79b0fa0..b5a2028b 100644
--- a/completions-sample/tsconfig.json
+++ b/completions-sample/tsconfig.json
@@ -1,15 +1,14 @@
{
"compilerOptions": {
"module": "commonjs",
- "target": "es5",
+ "target": "es6",
"outDir": "out",
- "lib": [
- "es6"
- ],
"sourceMap": true,
+ "strict": true,
"rootDir": "src"
},
"exclude": [
- "node_modules"
+ "node_modules",
+ ".vscode-test"
]
}
diff --git a/completions-sample/tslint.json b/completions-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/completions-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/configuration-sample/.vscode/launch.json b/configuration-sample/.vscode/launch.json
index d0aa1a18..9b05b66b 100644
--- a/configuration-sample/.vscode/launch.json
+++ b/configuration-sample/.vscode/launch.json
@@ -1,6 +1,6 @@
// A launch configuration that compiles the extension and then opens it inside a new window
{
- "version": "0.1.0",
+ "version": "0.2.0",
"configurations": [
{
"name": "Launch Extension",
@@ -17,32 +17,15 @@
],
"preLaunchTask": "npm: watch"
},
- {
- "name": "Launch Tests",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": [
- "--extensionDevelopmentPath=${workspaceRoot}",
- "--extensionTestsPath=${workspaceRoot}/out/test"
- ],
- "stopOnEntry": false,
- "sourceMaps": true,
- "outFiles": [
- "${workspaceRoot}/out/test/**/*.js"
- ],
- "preLaunchTask": "npm: watch"
- },
{
"type": "node",
"request": "attach",
"name": "Attach to Extension Host",
- "protocol": "legacy",
+ "protocol": "inspector",
"port": 5870,
- "sourceMaps": true,
"restart": true,
"outFiles": [
- "${workspaceRoot}/out/src/**/*.js"
+ "${workspaceRoot}/out/src"
]
}
]
diff --git a/configuration-sample/.vscode/settings.json b/configuration-sample/.vscode/settings.json
index 66ed94c5..c89394a5 100644
--- a/configuration-sample/.vscode/settings.json
+++ b/configuration-sample/.vscode/settings.json
@@ -7,5 +7,6 @@
"out": true // set this to false to include "out" folder in search results
},
"typescript.tsdk": "./node_modules/typescript/lib", // we want to use the TS server from our node_modules folder to control its version
- "typescript.tsc.autoDetect": "off"
+ "typescript.tsc.autoDetect": "off",
+ "editor.insertSpaces": false,
}
\ No newline at end of file
diff --git a/configuration-sample/package-lock.json b/configuration-sample/package-lock.json
new file mode 100644
index 00000000..bd06d110
--- /dev/null
+++ b/configuration-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "configuration-sample",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "10.12.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz",
+ "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
+ "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/configuration-sample/package.json b/configuration-sample/package.json
index 622b66e3..d55a4a2f 100644
--- a/configuration-sample/package.json
+++ b/configuration-sample/package.json
@@ -3,17 +3,19 @@
"displayName": "Configuration Sample",
"description": "How to contribute and use configurations in VS Code",
"version": "0.0.1",
- "publisher": "ms-vscode",
+ "publisher": "vscode-samples",
"engines": {
- "vscode": "^1.17.0"
+ "vscode": "^1.32.0"
},
"categories": [
"Other"
],
"activationEvents": [
- "*"
+ "onCommand:config.commands.configureViewOnWindowOpen",
+ "onCommand:config.commands.configureEmptyLastLineCurrentFile",
+ "onCommand:config.commands.configureEmptyLastLineFiles"
],
- "main": "./out/src/extension",
+ "main": "./out/extension",
"keywords": [
"multi-root ready"
],
@@ -38,7 +40,7 @@
"conf.resource.insertEmptyLastLine": {
"type": "object",
"default": {},
- "description": "Resource configurtion: Configure files using glob patterns to have an empty last line always",
+ "description": "Resource configuration: Configure files using glob patterns to have an empty last line always",
"scope": "resource"
}
}
@@ -63,13 +65,15 @@
]
},
"scripts": {
- "vscode:prepublish": "tsc -p ./",
- "watch": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install"
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
},
"devDependencies": {
- "typescript": "^2.1.4",
- "vscode": "^1.1.17",
- "@types/node": "*"
+ "@types/node": "*",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
}
-}
\ No newline at end of file
+}
diff --git a/configuration-sample/src/extension.ts b/configuration-sample/src/extension.ts
index bb6df742..dc6bdc83 100644
--- a/configuration-sample/src/extension.ts
+++ b/configuration-sample/src/extension.ts
@@ -61,10 +61,10 @@ export function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(vscode.workspace.onDidOpenTextDocument(e => {
// 1) Get the configured glob pattern value for the current file
- const value = vscode.workspace.getConfiguration('', e.uri).get('conf.resource.insertEmptyLastLine');
+ const value: any = vscode.workspace.getConfiguration('', e.uri).get('conf.resource.insertEmptyLastLine');
// 2) Check if the current resource matches the glob pattern
- const matches = value[e.fileName];
+ const matches = value ? value[e.fileName] : undefined;
// 3) If matches, insert empty last line
if (matches) {
@@ -91,9 +91,8 @@ export function activate(context: vscode.ExtensionContext) {
const value = { ...currentValue, ...{ [currentDocument.fileName]: true } };
// 4) Update the configuration
- await configuration.update('conf.resource.insertEmptyLastLine', value, target)
+ await configuration.update('conf.resource.insertEmptyLastLine', value, target);
}
-
});
// Example 5: Updating Resource scoped Configuration
@@ -118,7 +117,7 @@ export function activate(context: vscode.ExtensionContext) {
if (target.target === vscode.ConfigurationTarget.WorkspaceFolder) {
// 3) Getting the workspace folder
- let workspaceFolder = await vscode.window.showWorkspaceFolderPick({ placeHolder: 'Pick Workspace Folder to which this setting should be applied' })
+ let workspaceFolder = await vscode.window.showWorkspaceFolderPick({ placeHolder: 'Pick Workspace Folder to which this setting should be applied' });
if (workspaceFolder) {
// 4) Get the configuration for the workspace folder
@@ -140,7 +139,7 @@ export function activate(context: vscode.ExtensionContext) {
// 4) Get the current value
const currentValue = configuration.get('conf.resource.insertEmptyLastLine');
- const newValue = { ...currentValue, ...{ [value]: true } };
+ const newValue = { ...currentValue, ...(value ? { [value]: true } : {}) };
// 3) Update the value in the target
await vscode.workspace.getConfiguration().update('conf.resource.insertEmptyLastLine', newValue, target.target);
@@ -154,7 +153,7 @@ export function activate(context: vscode.ExtensionContext) {
// 3) Get the current value
const currentValue = configuration.get('conf.resource.insertEmptyLastLine');
- const newValue = { ...currentValue, ...{ [value]: true } };
+ const newValue = { ...currentValue, ...(value ? { [value]: true } : {}) };
// 4) Update the value in the User Settings
await vscode.workspace.getConfiguration().update('conf.resource.insertEmptyLastLine', newValue, vscode.ConfigurationTarget.Global);
@@ -170,7 +169,7 @@ export function activate(context: vscode.ExtensionContext) {
const currentDocument = vscode.window.activeTextEditor.document;
// 1) Get the configured glob pattern value for the current file
- const value = vscode.workspace.getConfiguration('', currentDocument.uri).get('conf.resource.insertEmptyLastLine');
+ const value: any = vscode.workspace.getConfiguration('', currentDocument.uri).get('conf.resource.insertEmptyLastLine');
// 2) Check if the current resource matches the glob pattern
const matches = value[currentDocument.fileName];
diff --git a/configuration-sample/tsconfig.json b/configuration-sample/tsconfig.json
index d9689931..cedba68c 100644
--- a/configuration-sample/tsconfig.json
+++ b/configuration-sample/tsconfig.json
@@ -3,14 +3,12 @@
"module": "commonjs",
"target": "es6",
"outDir": "out",
- "lib": [
- "es6"
- ],
"sourceMap": true,
- "rootDir": "."
+ "strict": true,
+ "rootDir": "src"
},
"exclude": [
"node_modules",
".vscode-test"
]
-}
+}
\ No newline at end of file
diff --git a/configuration-sample/tslint.json b/configuration-sample/tslint.json
new file mode 100644
index 00000000..522458b3
--- /dev/null
+++ b/configuration-sample/tslint.json
@@ -0,0 +1,12 @@
+{
+ "rules": {
+ "indent": [
+ true,
+ "tabs"
+ ],
+ "semicolon": [
+ true,
+ "always"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/contentprovider-sample/.vscode/settings.json b/contentprovider-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/contentprovider-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/contentprovider-sample/README.md b/contentprovider-sample/README.md
index 85de7853..5d8e070b 100644
--- a/contentprovider-sample/README.md
+++ b/contentprovider-sample/README.md
@@ -13,8 +13,8 @@ It is not intended as a product quality extension.
# How it works, what it shows?
-- The extension implements and registers a [`TextDocumentContentProvider`](http://code.visualstudio.com/docs/extensionAPI/vscode-api#TextDocumentContentProvider) for a particular URI scheme.
-- The content provider uses the [`vscode.executeReferenceProvider`](http://code.visualstudio.com/docs/extensionAPI/vscode-api-commands)-API command to delegate searching for references to the language extensions, like TypeScript, vscode-go, or C#
+- The extension implements and registers a [`TextDocumentContentProvider`](https://code.visualstudio.com/api/references/vscode-api#TextDocumentContentProvider) for a particular URI scheme.
+- The content provider uses the [`vscode.executeReferenceProvider`](https://code.visualstudio.com/api/references/commands)-API command to delegate searching for references to the language extensions, like TypeScript, vscode-go, or C#
- The generated document initially contains a caption only and incrementally updates as each reference location is resolved.
- Add links for each result in the virtual document pointing to the reference.
- Add an entry to editor context menu via `package.json`
diff --git a/contentprovider-sample/package-lock.json b/contentprovider-sample/package-lock.json
new file mode 100644
index 00000000..0096b0b8
--- /dev/null
+++ b/contentprovider-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "references-plusplus",
+ "version": "0.0.5",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "6.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.6.tgz",
+ "integrity": "sha512-rFs9zCFtSHuseiNXxYxFlun8ibu+jtZPgRM+2ILCmeLiGeGLiIGxuOzD+cNyHegI1GD+da3R/cIbs9+xCLp13w==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
+ "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/contentprovider-sample/package.json b/contentprovider-sample/package.json
index e457e792..c1a7931d 100644
--- a/contentprovider-sample/package.json
+++ b/contentprovider-sample/package.json
@@ -3,7 +3,7 @@
"displayName": "References++",
"description": "Show the results of 'Find References' as formatted text in an editor",
"version": "0.0.5",
- "publisher": "jrieken",
+ "publisher": "vscode-samples",
"repository": {
"type": "git",
"url": "https://github.com/Microsoft/vscode-extension-samples"
@@ -12,7 +12,7 @@
"url": "https://github.com/Microsoft/vscode-extension-samples/issues"
},
"engines": {
- "vscode": "^1.4.0"
+ "vscode": "^1.32.0"
},
"categories": [
"Other"
@@ -20,7 +20,7 @@
"activationEvents": [
"onCommand:editor.printReferences"
],
- "main": "./out/extension",
+ "main": "./out/extension.js",
"contributes": {
"commands": [
{
@@ -57,14 +57,15 @@
]
},
"scripts": {
- "vscode:prepublish": "tsc -p ./",
- "watch": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install"
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
},
"devDependencies": {
- "tslint": "^3.8.1",
- "typescript": "^2.1.4",
- "vscode": "^1.1.17",
- "@types/node": "^6.0.40"
+ "@types/node": "^6.0.40",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
}
}
diff --git a/contentprovider-sample/src/extension.ts b/contentprovider-sample/src/extension.ts
index 97b0dafd..ccffa01b 100644
--- a/contentprovider-sample/src/extension.ts
+++ b/contentprovider-sample/src/extension.ts
@@ -1,7 +1,6 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
-'use strict';
import { workspace, languages, window, commands, ExtensionContext, Disposable } from 'vscode';
import ContentProvider, { encodeLocation } from './provider';
@@ -21,7 +20,7 @@ export function activate(context: ExtensionContext) {
// open the dynamic document, and shows it in the next editor
const commandRegistration = commands.registerTextEditorCommand('editor.printReferences', editor => {
const uri = encodeLocation(editor.document.uri, editor.selection.active);
- return workspace.openTextDocument(uri).then(doc => window.showTextDocument(doc, editor.viewColumn + 1));
+ return workspace.openTextDocument(uri).then(doc => window.showTextDocument(doc, editor.viewColumn! + 1));
});
context.subscriptions.push(
diff --git a/contentprovider-sample/src/provider.ts b/contentprovider-sample/src/provider.ts
index 49160d9c..1cf663af 100644
--- a/contentprovider-sample/src/provider.ts
+++ b/contentprovider-sample/src/provider.ts
@@ -1,7 +1,6 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
-'use strict';
import * as vscode from 'vscode';
import ReferencesDocument from './referencesDocument';
@@ -47,15 +46,16 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc
}
// Decode target-uri and target-position from the provided uri and execute the
- // `reference provider` command (http://code.visualstudio.com/docs/extensionAPI/vscode-api-commands).
+ // `reference provider` command (https://code.visualstudio.com/api/references/commands).
// From the result create a references document which is in charge of loading,
// printing, and formatting references
const [target, pos] = decodeLocation(uri);
return vscode.commands.executeCommand('vscode.executeReferenceProvider', target, pos).then(locations => {
+ locations = locations || [];
// sort by locations and shuffle to begin from target resource
let idx = 0;
- locations.sort(Provider._compareLocations).find((loc, i) => loc.uri.toString() === target.toString() && (idx = i) && true);
+ locations.sort(Provider._compareLocations).find((loc, i) => loc.uri.toString() === target.toString() && !!(idx = i) && true);
locations.push(...locations.splice(0, idx));
// create document and return its early state
@@ -71,11 +71,11 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc
} else if (a.uri.toString() > b.uri.toString()) {
return 1;
} else {
- return a.range.start.compareTo(b.range.start)
+ return a.range.start.compareTo(b.range.start);
}
}
- provideDocumentLinks(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.DocumentLink[] {
+ provideDocumentLinks(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.DocumentLink[] | undefined {
// While building the virtual document we have already created the links.
// Those are composed from the range inside the document and a target uri
// to which they point
diff --git a/contentprovider-sample/src/referencesDocument.ts b/contentprovider-sample/src/referencesDocument.ts
index beb4c91f..bedc8b87 100644
--- a/contentprovider-sample/src/referencesDocument.ts
+++ b/contentprovider-sample/src/referencesDocument.ts
@@ -1,7 +1,6 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
-'use strict';
import * as vscode from 'vscode';
@@ -13,7 +12,7 @@ export default class ReferencesDocument {
private _lines: string[];
private _links: vscode.DocumentLink[];
- private _join: Thenable;
+ private _join?: Thenable;
constructor(uri: vscode.Uri, locations: vscode.Location[], emitter: vscode.EventEmitter) {
this._uri = uri;
@@ -37,7 +36,7 @@ export default class ReferencesDocument {
return this._links;
}
- join(): Thenable {
+ join(): Thenable | undefined {
return this._join;
}
@@ -81,7 +80,7 @@ export default class ReferencesDocument {
this._emitter.fire(this._uri);
next();
});
- }
+ };
next();
});
}
@@ -96,7 +95,7 @@ export default class ReferencesDocument {
this._lines.push('', uri.toString());
for (let i = 0; i < ranges.length; i++) {
- const {start: {line}} = ranges[i];
+ const { start: { line } } = ranges[i];
this._appendLeading(doc, line, ranges[i - 1]);
this._appendMatch(doc, line, ranges[i], uri);
this._appendTrailing(doc, line, ranges[i + 1]);
diff --git a/contentprovider-sample/tsconfig.json b/contentprovider-sample/tsconfig.json
index c79b0fa0..45c5d094 100644
--- a/contentprovider-sample/tsconfig.json
+++ b/contentprovider-sample/tsconfig.json
@@ -1,15 +1,11 @@
{
"compilerOptions": {
"module": "commonjs",
- "target": "es5",
+ "target": "es6",
"outDir": "out",
- "lib": [
- "es6"
- ],
"sourceMap": true,
+ "strict": true,
"rootDir": "src"
},
- "exclude": [
- "node_modules"
- ]
+ "exclude": ["node_modules"]
}
diff --git a/contentprovider-sample/tslint.json b/contentprovider-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/contentprovider-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/custom-data-sample/.vscode/launch.json b/custom-data-sample/.vscode/launch.json
new file mode 100644
index 00000000..9a1bdb20
--- /dev/null
+++ b/custom-data-sample/.vscode/launch.json
@@ -0,0 +1,12 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": ["--extensionDevelopmentPath=${workspaceFolder}"]
+ }
+ ]
+}
diff --git a/custom-data-sample/.vscode/settings.json b/custom-data-sample/.vscode/settings.json
new file mode 100644
index 00000000..48813806
--- /dev/null
+++ b/custom-data-sample/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+ "html.customData": ["./html.html-data.json"],
+ "css.customData": ["./css.css-data.json"]
+}
diff --git a/custom-data-sample/README.md b/custom-data-sample/README.md
new file mode 100644
index 00000000..ae505030
--- /dev/null
+++ b/custom-data-sample/README.md
@@ -0,0 +1,22 @@
+# Custom Data Sample
+
+This demonstrates packaging [custom data](https://github.com/microsoft/vscode-custom-data) into a VS Code extension.
+
+Guide for this sample: https://code.visualstudio.com/api/extension-guides/custom-data-extension.
+
+## Demo
+
+
+
+## VS Code API
+
+### Contribution Points
+
+- [`contributes.html.customData`](https://code.visualstudio.com/api/extension-guides/custom-data-extension)
+- [`contributes.css.customData`](https://code.visualstudio.com/api/extension-guides/custom-data-extension)
+
+## Running the Sample
+
+- Run the `Run Extension` target in the Debug View.
+- Open a HTML file. You should receive auto completion and hover information for the HTML entities defined in `html.html-data.json`.
+- Open a CSS file. You should receive auto completion and hover information for the CSS entities defined in `css.css-data.json`.
\ No newline at end of file
diff --git a/custom-data-sample/css.css-data.json b/custom-data-sample/css.css-data.json
new file mode 100644
index 00000000..7ecb26c5
--- /dev/null
+++ b/custom-data-sample/css.css-data.json
@@ -0,0 +1,17 @@
+{
+ "version": 1.1,
+ "properties": [{
+ "name": "my-size",
+ "description": "Compiles down to `width` and `height`. See details at https://github.com/postcss/postcss-size",
+ "references": [
+ {
+ "name": "GitHub",
+ "url": "https://github.com/postcss/postcss-size"
+ }
+ ]
+ }],
+ "pseudoClasses": [{
+ "name": ":my-link",
+ "description": ":any-link pseudo class. See details at https://preset-env.cssdb.org/features#any-link-pseudo-class"
+ }]
+}
\ No newline at end of file
diff --git a/custom-data-sample/demo.gif b/custom-data-sample/demo.gif
new file mode 100644
index 00000000..bdd06d2a
Binary files /dev/null and b/custom-data-sample/demo.gif differ
diff --git a/custom-data-sample/html.html-data.json b/custom-data-sample/html.html-data.json
new file mode 100644
index 00000000..ed8cef4d
--- /dev/null
+++ b/custom-data-sample/html.html-data.json
@@ -0,0 +1,20 @@
+{
+ "version": 1.1,
+ "tags": [{
+ "name": "my-button",
+ "description": "My button",
+ "attributes": [{
+ "name": "type",
+ "description": "My button type",
+ "values": [
+ { "name": "alert" }
+ ]
+ }],
+ "references": [
+ {
+ "name": "Bootstrap buttons",
+ "url": "https://getbootstrap.com/docs/4.0/components/buttons/"
+ }
+ ]
+ }]
+}
\ No newline at end of file
diff --git a/custom-data-sample/package.json b/custom-data-sample/package.json
new file mode 100644
index 00000000..197195bd
--- /dev/null
+++ b/custom-data-sample/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "custom-data-sample",
+ "description": "Custom Data sample extension for VS Code",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "repository": "https://github.com/Microsoft/vscode-extension-samples",
+ "engines": {
+ "vscode": "^1.38.0"
+ },
+ "contributes": {
+ "html": {
+ "customData": [
+ "./html.html-data.json"
+ ]
+ },
+ "css": {
+ "customData": [
+ "./css.css-data.json"
+ ]
+ }
+ }
+}
diff --git a/decorator-sample/.vscode/settings.json b/decorator-sample/.vscode/settings.json
new file mode 100644
index 00000000..8d047dad
--- /dev/null
+++ b/decorator-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/decorator-sample/.vscodeignore b/decorator-sample/.vscodeignore
index 9ca85fe6..213bfc7a 100644
--- a/decorator-sample/.vscodeignore
+++ b/decorator-sample/.vscodeignore
@@ -1,7 +1,6 @@
.vscode/**
-typings/**
**/*.ts
**/*.map
.gitignore
+tslint.json
tsconfig.json
-vsc-extension-quickstart.md
diff --git a/decorator-sample/README.md b/decorator-sample/README.md
index 2178d8cf..29491ad8 100644
--- a/decorator-sample/README.md
+++ b/decorator-sample/README.md
@@ -1,16 +1,31 @@
-# README
-## This is the README for the "decorator-sample"
--------------------
+# Decorator Sample
-This folder contains a sample VS code extension that demonstrates the decorator API.
+This folder contains a sample VS code extension that demonstrates the editor decorator API.
The sample creates a decoration for each number that appears in the active editor. It
demonstrates some of the decorator features such as borders, background colors, cursors
-and hovers.
+and hovers.
+
+The sample also shows the use of a user defined themeable color. Instead of hardcoding a color value this allows users (and themes) to redefine the color in the user settings.

-# How to run locally
+## VSCode API
-* `npm run compile` to start the compiler in watch mode
+The sample code show the usage of the vscode.[`TextEditor.setDecorations`](https://code.visualstudio.com/api/references/vscode-api#TextEditor.setDecorations) and [`vscode.window.createTextEditorDecorationType`](https://code.visualstudio.com/api/references/vscode-api#window.createTextEditorDecorationType) APIs as well as the `colors` contribution point.
+
+## Running the Sample
+
+* `npm install` to initialize the project
+* `npm run watch` to start the compiler in watch mode
* open this folder in VS Code and press `F5`
+* this will open the `[Extension Development Host]` window, running the extension:
+ * Open any document that contains single and multi-digit numbers.
+ * The extension will decorate single and multiple-digit numbers as shown in the screenshot above.
+ * In the user settings, add
+ ```
+ "workbench.colorCustomizations": {
+ "myextension.largeNumberBackground": "#ff00ff"
+ }
+ ```
+ to customize the large number decoration color.
diff --git a/decorator-sample/USAGE.md b/decorator-sample/USAGE.md
index 7a38187d..af7ad6b7 100644
--- a/decorator-sample/USAGE.md
+++ b/decorator-sample/USAGE.md
@@ -6,9 +6,9 @@ The following steps can be done to decorate content in an editor:
## Decoration Types
-the [TextEditorDecorationType](https://code.visualstudio.com/docs/extensionAPI/vscode-api#TextEditorDecorationType) class defines how to style a decoration.
+the [TextEditorDecorationType](https://code.visualstudio.com/api/references/vscode-api#TextEditorDecorationType) class defines how to style a decoration.
-It can be created using `vscode.window.createTextEditorDecorationType`. It takes an object as a parameter which includes any of the properties of [DecorationRenderOptions](https://code.visualstudio.com/docs/extensionAPI/vscode-api#DecorationRenderOptions) which match up to their CSS properties.
+It can be created using `vscode.window.createTextEditorDecorationType`. It takes an object as a parameter which includes any of the properties of [DecorationRenderOptions](https://code.visualstudio.com/api/references/vscode-api#DecorationRenderOptions) which match up to their CSS properties.
```typescript
const smallNumberDecorationType = vscode.window.createTextEditorDecorationType({
@@ -29,9 +29,9 @@ const smallNumberDecorationType = vscode.window.createTextEditorDecorationType({
## Creating an array of Ranges
-the Decorator API requires an array of [Ranges](https://code.visualstudio.com/docs/extensionAPI/vscode-api#Range). A VS Code range object describes a range of code which can span across both rows and columns in a single file.
+the Decorator API requires an array of [Ranges](https://code.visualstudio.com/api/references/vscode-api#Range). A VS Code range object describes a range of code which can span across both rows and columns in a single file.
-you can either use a `Range[]` or a [DecorationOptions[]](https://code.visualstudio.com/docs/extensionAPI/vscode-api#DecorationOptions).
+you can either use a `Range[]` or a [DecorationOptions[]](https://code.visualstudio.com/api/references/vscode-api#DecorationOptions).
For simple sets of selections, using a regular expression can be useful.
@@ -56,7 +56,7 @@ const decoration = { range: new vscode.Range(startPos, endPos), hoverMessage: 'N
## Setting the decoration
-Finally, you can insert the decoration into any editor with the `setDecorations` method of the [TextEditor](https://code.visualstudio.com/docs/extensionAPI/vscode-api#TextEditor) class. It takes two arguments:
+Finally, you can insert the decoration into any editor with the `setDecorations` method of the [TextEditor](https://code.visualstudio.com/api/references/vscode-api#TextEditor) class. It takes two arguments:
* The `TextEditorDecorationType` defined for the decoration.
* Either a `Range` array or a `DecorationOptions` array.
@@ -67,4 +67,6 @@ activeEditor.setDecorations(smallNumberDecorationType, smallNumbers);
## Tips
-As a note, if you insert a new range of decorations using `editor.setDecorations` with a `TextEditorDecorationType` that has already been used, it will overwrite the previous set of decorations.
\ No newline at end of file
+As a note, if you insert a new range of decorations using `editor.setDecorations` with a `TextEditorDecorationType` that has already been used, it will overwrite the previous set of decorations.
+
+If you'd like to remove a decoration(s) of a certain decoration type then pass in an empty array to clear it from the editor. Example: `editor.setDecorations(decorationType, []);`
diff --git a/decorator-sample/package-lock.json b/decorator-sample/package-lock.json
new file mode 100644
index 00000000..c1ad1d34
--- /dev/null
+++ b/decorator-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "decorator-sample",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "8.10.36",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.36.tgz",
+ "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/decorator-sample/package.json b/decorator-sample/package.json
index e5407858..41bd385f 100644
--- a/decorator-sample/package.json
+++ b/decorator-sample/package.json
@@ -1,28 +1,45 @@
-{
- "name": "decorator-sample",
- "description": "Sample for the decorator API",
- "version": "0.0.1",
- "publisher": "Microsoft",
- "license": "MIT",
- "engines": {
- "vscode": "^1.15.0"
- },
- "categories": [
- "Other"
- ],
- "activationEvents": [
- "*"
- ],
- "main": "./out/extension",
- "scripts": {
- "vscode:prepublish": "npm run compile",
- "compile": "tsc -p ./",
- "watch": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install"
- },
- "devDependencies": {
- "vscode": "^1.1.17",
- "typescript": "^2.5.3",
- "@types/node": "7.0.4"
- }
-}
+{
+ "name": "decorator-sample",
+ "description": "Sample for the decorator API",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "license": "MIT",
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "repository": {
+ "url": "https://github.com/Microsoft/vscode-extension-samples"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "*"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "colors": [
+ {
+ "id": "myextension.largeNumberBackground",
+ "description": "Background decoration color for large numbers",
+ "defaults": {
+ "dark": "#FF000055",
+ "light": "#FF000055",
+ "highContrast": "#FF000055"
+ }
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^8.9.1",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
+ }
+}
diff --git a/decorator-sample/preview.png b/decorator-sample/preview.png
index c7fd8d9c..fd8518e5 100644
Binary files a/decorator-sample/preview.png and b/decorator-sample/preview.png differ
diff --git a/decorator-sample/src/extension.ts b/decorator-sample/src/extension.ts
index 5f746f56..3790a6ad 100644
--- a/decorator-sample/src/extension.ts
+++ b/decorator-sample/src/extension.ts
@@ -5,6 +5,8 @@ export function activate(context: vscode.ExtensionContext) {
console.log('decorator sample is activated');
+ let timeout: NodeJS.Timer | undefined = undefined;
+
// create a decorator type that we use to decorate small numbers
const smallNumberDecorationType = vscode.window.createTextEditorDecorationType({
borderWidth: '1px',
@@ -24,34 +26,11 @@ export function activate(context: vscode.ExtensionContext) {
// create a decorator type that we use to decorate large numbers
const largeNumberDecorationType = vscode.window.createTextEditorDecorationType({
cursor: 'crosshair',
- backgroundColor: 'rgba(255,0,0,0.3)'
+ // use a themable color. See package.json for the declaration and default values.
+ backgroundColor: { id: 'myextension.largeNumberBackground' }
});
let activeEditor = vscode.window.activeTextEditor;
- if (activeEditor) {
- triggerUpdateDecorations();
- }
-
- vscode.window.onDidChangeActiveTextEditor(editor => {
- activeEditor = editor;
- if (editor) {
- triggerUpdateDecorations();
- }
- }, null, context.subscriptions);
-
- vscode.workspace.onDidChangeTextDocument(event => {
- if (activeEditor && event.document === activeEditor.document) {
- triggerUpdateDecorations();
- }
- }, null, context.subscriptions);
-
- var timeout = null;
- function triggerUpdateDecorations() {
- if (timeout) {
- clearTimeout(timeout);
- }
- timeout = setTimeout(updateDecorations, 500);
- }
function updateDecorations() {
if (!activeEditor) {
@@ -75,5 +54,31 @@ export function activate(context: vscode.ExtensionContext) {
activeEditor.setDecorations(smallNumberDecorationType, smallNumbers);
activeEditor.setDecorations(largeNumberDecorationType, largeNumbers);
}
+
+ function triggerUpdateDecorations() {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = undefined;
+ }
+ timeout = setTimeout(updateDecorations, 500);
+ }
+
+ if (activeEditor) {
+ triggerUpdateDecorations();
+ }
+
+ vscode.window.onDidChangeActiveTextEditor(editor => {
+ activeEditor = editor;
+ if (editor) {
+ triggerUpdateDecorations();
+ }
+ }, null, context.subscriptions);
+
+ vscode.workspace.onDidChangeTextDocument(event => {
+ if (activeEditor && event.document === activeEditor.document) {
+ triggerUpdateDecorations();
+ }
+ }, null, context.subscriptions);
+
}
diff --git a/decorator-sample/tsconfig.json b/decorator-sample/tsconfig.json
index 5aee25d9..781154d7 100644
--- a/decorator-sample/tsconfig.json
+++ b/decorator-sample/tsconfig.json
@@ -1,15 +1,11 @@
{
"compilerOptions": {
"module": "commonjs",
- "target": "es5",
+ "target": "es6",
"outDir": "out",
- "lib": [
- "es6"
- ],
"sourceMap": true,
+ "strict": true,
"rootDir": "src"
},
- "exclude": [
- "node_modules"
- ]
-}
+ "exclude": ["node_modules", ".vscode-test"]
+}
\ No newline at end of file
diff --git a/decorator-sample/tslint.json b/decorator-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/decorator-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/diagnostic-related-information-sample/.gitignore b/diagnostic-related-information-sample/.gitignore
new file mode 100644
index 00000000..5fe00fea
--- /dev/null
+++ b/diagnostic-related-information-sample/.gitignore
@@ -0,0 +1,4 @@
+out
+node_modules
+.vscode-test/
+*.vsix
diff --git a/multi-diagnostics-sample/.vscode/launch.json b/diagnostic-related-information-sample/.vscode/launch.json
similarity index 100%
rename from multi-diagnostics-sample/.vscode/launch.json
rename to diagnostic-related-information-sample/.vscode/launch.json
diff --git a/multi-diagnostics-sample/.vscode/settings.json b/diagnostic-related-information-sample/.vscode/settings.json
similarity index 100%
rename from multi-diagnostics-sample/.vscode/settings.json
rename to diagnostic-related-information-sample/.vscode/settings.json
diff --git a/diagnostic-related-information-sample/.vscode/tasks.json b/diagnostic-related-information-sample/.vscode/tasks.json
new file mode 100644
index 00000000..604e38f5
--- /dev/null
+++ b/diagnostic-related-information-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/diagnostic-related-information-sample/.vscodeignore b/diagnostic-related-information-sample/.vscodeignore
new file mode 100644
index 00000000..85571789
--- /dev/null
+++ b/diagnostic-related-information-sample/.vscodeignore
@@ -0,0 +1,9 @@
+.vscode/**
+.vscode-test/**
+out/test/**
+out/**/*.map
+src/**
+.gitignore
+tsconfig.json
+vsc-extension-quickstart.md
+tslint.json
\ No newline at end of file
diff --git a/multi-diagnostics-sample/README.md b/diagnostic-related-information-sample/README.md
similarity index 86%
rename from multi-diagnostics-sample/README.md
rename to diagnostic-related-information-sample/README.md
index c5e3f830..e4ee1987 100644
--- a/multi-diagnostics-sample/README.md
+++ b/diagnostic-related-information-sample/README.md
@@ -2,6 +2,8 @@
This sample generates diagnostics with related information which can be seen in Problems view and in the editor.
+
+
## Set up & Test
- Clone this extension
diff --git a/diagnostic-related-information-sample/package-lock.json b/diagnostic-related-information-sample/package-lock.json
new file mode 100644
index 00000000..cb876b0f
--- /dev/null
+++ b/diagnostic-related-information-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "diagnostic-related-information-sample",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "7.0.56",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.56.tgz",
+ "integrity": "sha512-NgjN3xPyqbAXSIpznNAR5Cisx5uKqJWxcS9kefzSFEX/9J7O01/FHyfnvPI7SztBf9p6c8mqOn3olZWJx3ja6g==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
+ "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/diagnostic-related-information-sample/package.json b/diagnostic-related-information-sample/package.json
new file mode 100644
index 00000000..295ae730
--- /dev/null
+++ b/diagnostic-related-information-sample/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "diagnostic-related-information-sample",
+ "displayName": "Diagnostic Related Information Sample",
+ "description": "Diagnostic Related Information Sample",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "*"
+ ],
+ "main": "./out/extension.js",
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^7.0.43",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
+ }
+}
diff --git a/diagnostic-related-information-sample/resources/diagnostic-related-info.png b/diagnostic-related-information-sample/resources/diagnostic-related-info.png
new file mode 100644
index 00000000..21c1c621
Binary files /dev/null and b/diagnostic-related-information-sample/resources/diagnostic-related-info.png differ
diff --git a/multi-diagnostics-sample/sample-demo.rs b/diagnostic-related-information-sample/sample-demo.rs
similarity index 100%
rename from multi-diagnostics-sample/sample-demo.rs
rename to diagnostic-related-information-sample/sample-demo.rs
diff --git a/diagnostic-related-information-sample/src/extension.ts b/diagnostic-related-information-sample/src/extension.ts
new file mode 100644
index 00000000..37640122
--- /dev/null
+++ b/diagnostic-related-information-sample/src/extension.ts
@@ -0,0 +1,37 @@
+'use strict';
+import * as vscode from 'vscode';
+import * as path from 'path';
+
+export function activate(context: vscode.ExtensionContext) {
+
+ const collection = vscode.languages.createDiagnosticCollection('test');
+ if (vscode.window.activeTextEditor) {
+ updateDiagnostics(vscode.window.activeTextEditor.document, collection);
+ }
+ context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(editor => {
+ if (editor) {
+ updateDiagnostics(editor.document, collection);
+ }
+ }));
+}
+
+function updateDiagnostics(document: vscode.TextDocument, collection: vscode.DiagnosticCollection): void {
+ if (document && path.basename(document.uri.fsPath) === 'sample-demo.rs') {
+ collection.set(document.uri, [{
+ code: '',
+ message: 'cannot assign twice to immutable variable `x`',
+ range: new vscode.Range(new vscode.Position(3, 4), new vscode.Position(3, 10)),
+ severity: vscode.DiagnosticSeverity.Error,
+ source: '',
+ relatedInformation: [
+ new vscode.DiagnosticRelatedInformation(new vscode.Location(document.uri, new vscode.Range(new vscode.Position(1, 8), new vscode.Position(1, 9))), 'first assignment to `x`')
+ ]
+ }]);
+ } else {
+ collection.clear();
+ }
+}
+
+// this method is called when your extension is deactivated
+export function deactivate() {
+}
\ No newline at end of file
diff --git a/diagnostic-related-information-sample/tsconfig.json b/diagnostic-related-information-sample/tsconfig.json
new file mode 100644
index 00000000..cedba68c
--- /dev/null
+++ b/diagnostic-related-information-sample/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "src"
+ },
+ "exclude": [
+ "node_modules",
+ ".vscode-test"
+ ]
+}
\ No newline at end of file
diff --git a/diagnostic-related-information-sample/tslint.json b/diagnostic-related-information-sample/tslint.json
new file mode 100644
index 00000000..522458b3
--- /dev/null
+++ b/diagnostic-related-information-sample/tslint.json
@@ -0,0 +1,12 @@
+{
+ "rules": {
+ "indent": [
+ true,
+ "tabs"
+ ],
+ "semicolon": [
+ true,
+ "always"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/document-editing-sample/.vscode/launch.json b/document-editing-sample/.vscode/launch.json
new file mode 100644
index 00000000..f027d529
--- /dev/null
+++ b/document-editing-sample/.vscode/launch.json
@@ -0,0 +1,22 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/document-editing-sample/.vscode/settings.json b/document-editing-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/document-editing-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/document-editing-sample/.vscode/tasks.json b/document-editing-sample/.vscode/tasks.json
new file mode 100644
index 00000000..604e38f5
--- /dev/null
+++ b/document-editing-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/document-editing-sample/README.md b/document-editing-sample/README.md
new file mode 100644
index 00000000..b450e823
--- /dev/null
+++ b/document-editing-sample/README.md
@@ -0,0 +1,5 @@
+# Document Editing Sample
+
+This sample shows
+
+- How to update document in current active editor through commands.
diff --git a/document-editing-sample/package-lock.json b/document-editing-sample/package-lock.json
new file mode 100644
index 00000000..78657474
--- /dev/null
+++ b/document-editing-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "reverseword",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "6.14.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.4.tgz",
+ "integrity": "sha512-UqB7h2dVJr/KdZXRMJIhNUWT0HXVe9UNvfLCOsqiSGKAVaAp0QniYHlU9yegxyG6Ug2rc7VdAD4hYj3VghqvAw==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/document-editing-sample/package.json b/document-editing-sample/package.json
new file mode 100644
index 00000000..5fe74fa5
--- /dev/null
+++ b/document-editing-sample/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "reverseword",
+ "displayName": "ReverseWord",
+ "description": "Reverse a word",
+ "version": "0.0.1",
+ "publisher": "rebornix",
+ "engines": {
+ "vscode": "^1.32.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onCommand:extension.reverseWord"
+ ],
+ "main": "./out/extension",
+ "contributes": {
+ "commands": [
+ {
+ "command": "extension.reverseWord",
+ "title": "Reverse Word"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint ./src/*.ts",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^6.0.40",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1",
+ "@types/vscode": "^1.32.0"
+ }
+}
diff --git a/document-editing-sample/src/extension.ts b/document-editing-sample/src/extension.ts
new file mode 100644
index 00000000..0213b930
--- /dev/null
+++ b/document-editing-sample/src/extension.ts
@@ -0,0 +1,24 @@
+'use strict';
+
+import * as vscode from 'vscode';
+
+export function activate(context: vscode.ExtensionContext) {
+ let disposable = vscode.commands.registerCommand('extension.reverseWord', function () {
+ // Get the active text editor
+ let editor = vscode.window.activeTextEditor;
+
+ if (editor) {
+ let document = editor.document;
+ let selection = editor.selection;
+
+ // Get the word within the selection
+ let word = document.getText(selection);
+ let reversed = word.split('').reverse().join('');
+ editor.edit(editBuilder => {
+ editBuilder.replace(selection, reversed);
+ });
+ }
+ });
+
+ context.subscriptions.push(disposable);
+}
\ No newline at end of file
diff --git a/document-editing-sample/tsconfig.json b/document-editing-sample/tsconfig.json
new file mode 100644
index 00000000..4ce52747
--- /dev/null
+++ b/document-editing-sample/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "src"
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/document-editing-sample/tslint.json b/document-editing-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/document-editing-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-1/.vscode/launch.json b/extension-deps-sample/test-extension-pack-1/.vscode/launch.json
deleted file mode 100644
index 8384213d..00000000
--- a/extension-deps-sample/test-extension-pack-1/.vscode/launch.json
+++ /dev/null
@@ -1,13 +0,0 @@
-// A launch configuration that launches the extension inside a new window
-{
- "version": "0.1.0",
- "configurations": [
- {
- "name": "Launch Extension",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": ["--extensionDevelopmentPath=${workspaceRoot}" ]
- }
- ]
-}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-1/README.md b/extension-deps-sample/test-extension-pack-1/README.md
deleted file mode 100644
index 7a77337a..00000000
--- a/extension-deps-sample/test-extension-pack-1/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Testing Install Extension Pack
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-1/package.json b/extension-deps-sample/test-extension-pack-1/package.json
deleted file mode 100644
index ee8bfa54..00000000
--- a/extension-deps-sample/test-extension-pack-1/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "999-extension-pack1",
- "displayName": "999-extension-pack1",
- "description": "Test extension pack1",
- "version": "0.0.2",
- "publisher": "sandy081",
- "engines": {
- "vscode": "^1.6.0"
- },
- "categories": [
- "Other"
- ],
- "galleryBanner": {
- "color": "#f0efe7",
- "theme": "light"
- },
- "icon": "",
- "homepage": "https://github.com/Microsoft/vscode-extension-samples/blob/master/README.md",
- "bugs": {
- "url": "https://github.com/Microsoft/vscode-extension-samples/issues"
- },
- "license": "SEE LICENSE IN LICENSE.md",
- "repository": {
- "type": "git",
- "url": "https://github.com/Microsoft/vscode-extension-samples"
- },
- "extensionPack": [
- "sandy081.999-pack2",
- "sandy081.todotasks",
- "designbright.theme-suicidesquad",
- "jirkafajfr.vscode-kitchen",
- "iZDT.javascript-unit-test-snippet",
- "MarinhoBrandao.Angular2Tests"
- ]
-}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-2/.vscode/launch.json b/extension-deps-sample/test-extension-pack-2/.vscode/launch.json
deleted file mode 100644
index 8384213d..00000000
--- a/extension-deps-sample/test-extension-pack-2/.vscode/launch.json
+++ /dev/null
@@ -1,13 +0,0 @@
-// A launch configuration that launches the extension inside a new window
-{
- "version": "0.1.0",
- "configurations": [
- {
- "name": "Launch Extension",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": ["--extensionDevelopmentPath=${workspaceRoot}" ]
- }
- ]
-}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-2/README.md b/extension-deps-sample/test-extension-pack-2/README.md
deleted file mode 100644
index 1adfd0db..00000000
--- a/extension-deps-sample/test-extension-pack-2/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Testing Install Extension Pack 2
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-2/package.json b/extension-deps-sample/test-extension-pack-2/package.json
deleted file mode 100644
index 0d049440..00000000
--- a/extension-deps-sample/test-extension-pack-2/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "999-pack2",
- "displayName": "999-pack2",
- "description": "Test extension pack 2",
- "version": "0.9.0",
- "publisher": "sandy081",
- "engines": {
- "vscode": "^1.0.0"
- },
- "categories": [
- "Other"
- ],
- "galleryBanner": {
- "color": "#f0efe7",
- "theme": "light"
- },
- "icon": "",
- "homepage": "https://github.com/Microsoft/vscode-extension-samples/blob/master/README.md",
- "bugs": {
- "url": "https://github.com/Microsoft/vscode-extension-samples/issues"
- },
- "license": "SEE LICENSE IN LICENSE.md",
- "repository": {
- "type": "git",
- "url": "https://github.com/Microsoft/vscode-extension-samples"
- },
- "extensionDependencies": [
- "sandy081.999-pack3",
- "lukehoban.Go",
- "dbaeumer.vscode-eslint",
- "eg2.tslint"
- ]
-}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-3/.vscode/launch.json b/extension-deps-sample/test-extension-pack-3/.vscode/launch.json
deleted file mode 100644
index 8384213d..00000000
--- a/extension-deps-sample/test-extension-pack-3/.vscode/launch.json
+++ /dev/null
@@ -1,13 +0,0 @@
-// A launch configuration that launches the extension inside a new window
-{
- "version": "0.1.0",
- "configurations": [
- {
- "name": "Launch Extension",
- "type": "extensionHost",
- "request": "launch",
- "runtimeExecutable": "${execPath}",
- "args": ["--extensionDevelopmentPath=${workspaceRoot}" ]
- }
- ]
-}
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-3/README.md b/extension-deps-sample/test-extension-pack-3/README.md
deleted file mode 100644
index 1adfd0db..00000000
--- a/extension-deps-sample/test-extension-pack-3/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Testing Install Extension Pack 2
\ No newline at end of file
diff --git a/extension-deps-sample/test-extension-pack-3/package.json b/extension-deps-sample/test-extension-pack-3/package.json
deleted file mode 100644
index 98d3f958..00000000
--- a/extension-deps-sample/test-extension-pack-3/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "999-pack3",
- "displayName": "999-pack3",
- "description": "999-pack3",
- "version": "0.5.0",
- "publisher": "sandy081",
- "engines": {
- "vscode": "^1.0.0"
- },
- "categories": [
- "Other"
- ],
- "galleryBanner": {
- "color": "#f0efe7",
- "theme": "light"
- },
- "icon": "",
- "homepage": "https://github.com/Microsoft/vscode-extension-samples/blob/master/README.md",
- "bugs": {
- "url": "https://github.com/Microsoft/vscode-extension-samples/issues"
- },
- "license": "SEE LICENSE IN LICENSE.md",
- "repository": {
- "type": "git",
- "url": "https://github.com/Microsoft/vscode-extension-samples"
- },
- "extensionDependencies": [
- "sandy081.999-pack1",
- "eg2.tslint",
- "be5invis.vscode-icontheme-nomo-dark",
- "MarinhoBrandao.Angular2Tests"
- ]
-}
\ No newline at end of file
diff --git a/extension-samples-quickstart.md b/extension-samples-quickstart.md
deleted file mode 100644
index d84df700..00000000
--- a/extension-samples-quickstart.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# Welcome to the extension samples
-
-## What's here
-* These folders contain sample [VS Code extensions](https://code.visualstudio.com/docs/extensions/overview) that demonstrate various extension APIs.
-
-## Get up and running straight away
-* Launch `npm install` in terminal in the root folder to initialize all samples
-* Open the debug view and select the sample to launch
-* set breakpoints inside a sample's `extension.ts` to debug an extension
-* find output from your extension in the debug console
-
-## Make changes
-* you can relaunch a sample from the debug toolbar after changing code in `extension.ts`
-* you can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes
-
-## Explore the API
-* you can open the full set of our API when you open the file node_modules/vscode/vscode.d.ts in each
-sample
\ No newline at end of file
diff --git a/previewhtml-sample/.gitignore b/extension-terminal-sample/.gitignore
similarity index 100%
rename from previewhtml-sample/.gitignore
rename to extension-terminal-sample/.gitignore
diff --git a/extension-terminal-sample/.vscode/launch.json b/extension-terminal-sample/.vscode/launch.json
new file mode 100644
index 00000000..a8090de8
--- /dev/null
+++ b/extension-terminal-sample/.vscode/launch.json
@@ -0,0 +1,22 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/extension-terminal-sample/.vscode/settings.json b/extension-terminal-sample/.vscode/settings.json
new file mode 100644
index 00000000..e46111f1
--- /dev/null
+++ b/extension-terminal-sample/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.insertSpaces": false
+}
\ No newline at end of file
diff --git a/extension-terminal-sample/.vscode/tasks.json b/extension-terminal-sample/.vscode/tasks.json
new file mode 100644
index 00000000..604e38f5
--- /dev/null
+++ b/extension-terminal-sample/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/extension-terminal-sample/.vscodeignore b/extension-terminal-sample/.vscodeignore
new file mode 100644
index 00000000..93e28ff2
--- /dev/null
+++ b/extension-terminal-sample/.vscodeignore
@@ -0,0 +1,9 @@
+.vscode/**
+typings/**
+out/test/**
+test/**
+src/**
+**/*.map
+.gitignore
+tsconfig.json
+vsc-extension-quickstart.md
diff --git a/extension-terminal-sample/README.md b/extension-terminal-sample/README.md
new file mode 100644
index 00000000..97beece7
--- /dev/null
+++ b/extension-terminal-sample/README.md
@@ -0,0 +1,25 @@
+# extension-terminal-sample
+
+This extension shows how to leverage the extension terminal API proposed in v1.37 that enables an extension to handle a terminal's input and emit output.
+
+## VS Code API
+
+### `vscode` module
+
+- [window.createTerminal](https://code.visualstudio.com/api/references/vscode-api#window.createTerminal)
+
+### Proposed API
+
+- `window.Pseudoterminal`
+- `window.ExtensionTerminalOptions`
+
+### Contribution Points
+
+- [`contributes.commands`](https://code.visualstudio.com/api/references/contribution-points#contributes.commands)
+
+## Running the Sample
+
+- Run `npm install` in terminal to install dependencies
+- Run the `Run Extension` target in the Debug View. This will:
+ - Start a task `npm: watch` to compile the code
+ - Run the extension in a new VS Code window
diff --git a/extension-terminal-sample/package-lock.json b/extension-terminal-sample/package-lock.json
new file mode 100644
index 00000000..c9b30973
--- /dev/null
+++ b/extension-terminal-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "vscode-terminal-api-example",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.0.tgz",
+ "integrity": "sha512-6tQyh4Q4B5pECcXBOQDZ5KjyBIxRZGzrweGPM47sAYTdVG4+7R+2EGMTmp0h6ZwgqHrFRCeg2gdhsG9xXEl2Sg==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/extension-terminal-sample/package.json b/extension-terminal-sample/package.json
new file mode 100644
index 00000000..621d56eb
--- /dev/null
+++ b/extension-terminal-sample/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "extension-terminal-sample",
+ "displayName": "extension-terminal-sample",
+ "description": "An example usage of the extension terminal API",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "engines": {
+ "vscode": "^1.37.0"
+ },
+ "enableProposedApi": true,
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onCommand:extensionTerminalSample.create",
+ "onCommand:extensionTerminalSample.clear"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "commands": [
+ {
+ "command": "extensionTerminalSample.create",
+ "title": "Extension Terminal Sample: Create"
+ },
+ {
+ "command": "extensionTerminalSample.clear",
+ "title": "Extension Terminal Sample: Clear"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "watch": "tsc -watch -p ./",
+ "lint": "tslint -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^6.0.40",
+ "@types/vscode": "^1.33.0",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1"
+ }
+}
diff --git a/extension-terminal-sample/src/extension.ts b/extension-terminal-sample/src/extension.ts
new file mode 100644
index 00000000..cc8ae297
--- /dev/null
+++ b/extension-terminal-sample/src/extension.ts
@@ -0,0 +1,58 @@
+'use strict';
+
+import * as vscode from 'vscode';
+
+export function activate(context: vscode.ExtensionContext) {
+ const writeEmitter = new vscode.EventEmitter();
+ context.subscriptions.push(vscode.commands.registerCommand('extensionTerminalSample.create', () => {
+ let line = '';
+ const pty = {
+ onDidWrite: writeEmitter.event,
+ open: () => writeEmitter.fire('Type and press enter to echo the text\r\n\r\n'),
+ close: () => {},
+ handleInput: (data: string) => {
+ if (data === '\r') { // Enter
+ writeEmitter.fire(`\r\necho: "${colorText(line)}"\r\n\n`);
+ line = '';
+ return;
+ }
+ if (data === '\x7f') { // Backspace
+ if (line.length === 0) {
+ return;
+ }
+ line = line.substr(0, line.length - 1);
+ // Move cursor backward
+ writeEmitter.fire('\x1b[D');
+ // Delete character
+ writeEmitter.fire('\x1b[P');
+ return;
+ }
+ line += data;
+ writeEmitter.fire(data);
+ }
+ };
+ const terminal = (vscode.window).createTerminal({ name: `My Extension REPL`, pty });
+ terminal.show();
+ }));
+
+ context.subscriptions.push(vscode.commands.registerCommand('extensionTerminalSample.clear', () => {
+ writeEmitter.fire('\x1b[2J\x1b[3J\x1b[;H');
+ }));
+}
+
+function colorText(text: string): string {
+ let output = '';
+ let colorIndex = 1;
+ for (let i = 0; i < text.length; i++) {
+ const char = text.charAt(i);
+ if (char === ' ' || char === '\r' || char === '\n') {
+ output += char;
+ } else {
+ output += `\x1b[3${colorIndex++}m${text.charAt(i)}\x1b[0m`;
+ if (colorIndex > 6) {
+ colorIndex = 1;
+ }
+ }
+ }
+ return output;
+}
\ No newline at end of file
diff --git a/extension-terminal-sample/tsconfig.json b/extension-terminal-sample/tsconfig.json
new file mode 100644
index 00000000..4ce52747
--- /dev/null
+++ b/extension-terminal-sample/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "src"
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/extension-terminal-sample/tslint.json b/extension-terminal-sample/tslint.json
new file mode 100644
index 00000000..0ab0ca6e
--- /dev/null
+++ b/extension-terminal-sample/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "indent": [true, "tabs"],
+ "semicolon": [true, "always"]
+ }
+}
\ No newline at end of file
diff --git a/smart-template-strings-sample/.gitignore b/fsconsumer-sample/.gitignore
similarity index 100%
rename from smart-template-strings-sample/.gitignore
rename to fsconsumer-sample/.gitignore
diff --git a/smart-template-strings-sample/.vscode/launch.json b/fsconsumer-sample/.vscode/launch.json
similarity index 58%
rename from smart-template-strings-sample/.vscode/launch.json
rename to fsconsumer-sample/.vscode/launch.json
index 523895f3..a07aa3e6 100644
--- a/smart-template-strings-sample/.vscode/launch.json
+++ b/fsconsumer-sample/.vscode/launch.json
@@ -1,21 +1,21 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
{
- // Use IntelliSense to learn about possible Node.js debug attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
+ "name": "Launch Extension",
"type": "extensionHost",
"request": "launch",
- "name": "Launch Extension",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceRoot}"
],
+ "stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
- "${workspaceRoot}/out/**/*.js"
- ]
+ "${workspaceRoot}/out/src/**/*.js"
+ ],
+ "preLaunchTask": "npm: watch"
}
]
}
diff --git a/fsconsumer-sample/.vscode/tasks.json b/fsconsumer-sample/.vscode/tasks.json
new file mode 100644
index 00000000..caff4fc0
--- /dev/null
+++ b/fsconsumer-sample/.vscode/tasks.json
@@ -0,0 +1,15 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
+ // for the documentation about the tasks.json format
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": [
+ "$tsc-watch"
+ ],
+ "isBackground": true
+ }
+ ]
+}
diff --git a/fsconsumer-sample/.vscodeignore b/fsconsumer-sample/.vscodeignore
new file mode 100644
index 00000000..1cf89fdf
--- /dev/null
+++ b/fsconsumer-sample/.vscodeignore
@@ -0,0 +1,9 @@
+.vscode/**
+.vscode-test/**
+out/test/**
+test/**
+src/**
+**/*.map
+.gitignore
+tsconfig.json
+
diff --git a/fsconsumer-sample/README.md b/fsconsumer-sample/README.md
new file mode 100644
index 00000000..6c7c610a
--- /dev/null
+++ b/fsconsumer-sample/README.md
@@ -0,0 +1,18 @@
+# FileSystem Usage Sample
+
+This is a sample extension that shows how to use the `vscode.workspace.fs` API. It is a series of commands, all prefixed with *FS*, that demonstrate file system capabilities and how to derive file-uris from existing uris.
+
+
+### Derive new paths with `path.posix`
+
+Throughout this sample [`path.posix`](https://nodejs.org/dist/latest-v10.x/docs/api/path.html#path_path_posix) is being used. This is important because uri paths are always slash-separated (`/`) and because the backslash (`\`) can be a valid file name. For more details see: https://nodejs.org/dist/latest-v10.x/docs/api/path.html#path_windows_vs_posix
+
+# How it works, what it shows?
+
+- The extension registers different commands that use the `workspace.fs`-API.
+- Registers command and the corresponding activation events via `package.json`
+
+# How to run locally
+
+* `npm run watch` to start the compiler in watch mode
+* open this folder in VS Code and press `F5`
diff --git a/fsconsumer-sample/package-lock.json b/fsconsumer-sample/package-lock.json
new file mode 100644
index 00000000..1aa9627d
--- /dev/null
+++ b/fsconsumer-sample/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "vscode-memfs",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "7.10.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
+ "integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.33.0.tgz",
+ "integrity": "sha512-JSmGiValbrcG5g20jjCfKakLiuWyrcjVezj+SEAEZ4klXQktE5EtowuGlkLVqbkiBK4iY5wy/4yW8OjecuHnjQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
+ "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+ "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.0",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/fsconsumer-sample/package.json b/fsconsumer-sample/package.json
new file mode 100644
index 00000000..310ee584
--- /dev/null
+++ b/fsconsumer-sample/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "vscode-memfs",
+ "displayName": "FileSystem Consumer Sample",
+ "description": "Showcase for using the workspace.fs.-API which allows reading and writing files and folder",
+ "version": "0.0.1",
+ "publisher": "vscode-samples",
+ "repository": {
+ "url": "https://github.com/Microsoft/vscode-extension-samples.git",
+ "type": "git"
+ },
+ "engines": {
+ "vscode": "^1.37.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onCommand:fs/openJS",
+ "onCommand:fs/sumSizes",
+ "onCommand:fs/readWriteFile"
+ ],
+ "main": "./out/src/extension",
+ "contributes": {
+ "commands": [
+ {
+ "command": "fs/openJS",
+ "title": "Open JavaScript-file for TypeScript-file...",
+ "category": "FS"
+ },
+ {
+ "command": "fs/sumSizes",
+ "title": "Show folder information for current file",
+ "category": "FS"
+ },
+ {
+ "command": "fs/readWriteFile",
+ "title": "Read and Write file",
+ "category": "FS"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "lint": "tslint -p ./",
+ "watch": "tsc -watch -p ./"
+ },
+ "devDependencies": {
+ "@types/node": "^7.0.43",
+ "@types/vscode": "^1.37.0",
+ "tslint": "^5.16.0",
+ "typescript": "^3.5.1"
+ }
+}
diff --git a/fsconsumer-sample/src/extension.ts b/fsconsumer-sample/src/extension.ts
new file mode 100644
index 00000000..bf27281c
--- /dev/null
+++ b/fsconsumer-sample/src/extension.ts
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------
+ * Copyright (C) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------*/
+
+'use strict';
+
+import * as vscode from 'vscode';
+import { posix } from 'path';
+
+export function activate(context: vscode.ExtensionContext) {
+
+ // Command #1 - Check and show a JavaScript-file for a TypeScript-file
+ // * shows how to derive a new uri from an existing uri
+ // * shows how to check for existence of a file
+ vscode.commands.registerCommand('fs/openJS', async function () {
+ if (
+ !vscode.window.activeTextEditor
+ || posix.extname(vscode.window.activeTextEditor.document.uri.path) !== '.ts'
+ ) {
+ return vscode.window.showInformationMessage('Open a TypeScript file first');
+ }
+
+ const tsUri = vscode.window.activeTextEditor.document.uri;
+ const jsPath = posix.join(tsUri.path, '..', posix.basename(tsUri.path, '.ts') + '.js');
+ const jsUri = tsUri.with({ path: jsPath });
+
+ try {
+ await vscode.workspace.fs.stat(jsUri);
+ vscode.window.showTextDocument(jsUri, { viewColumn: vscode.ViewColumn.Beside });
+ } catch {
+ vscode.window.showInformationMessage(`${jsUri.toString(true)} file does *not* exist`);
+ }
+ });
+
+ // Command #2 - Compute total size of files in a folder
+ // * shows how to read a directory
+ // * shows how retrieve metadata for a file
+ // * create an untitled document that shows count and total of files
+ vscode.commands.registerCommand('fs/sumSizes', async function () {
+
+ async function countAndTotalOfFilesInFolder(folder: vscode.Uri): Promise<{ total: number, count: number }> {
+ let total = 0;
+ let count = 0;
+ for (const [name, type] of await vscode.workspace.fs.readDirectory(folder)) {
+ if (type === vscode.FileType.File) {
+ const filePath = posix.join(folder.path, name);
+ const stat = await vscode.workspace.fs.stat(folder.with({ path: filePath }));
+ total += stat.size;
+ count += 1;
+ }
+ }
+ return { total, count };
+ }
+
+ if (!vscode.window.activeTextEditor) {
+ return vscode.window.showInformationMessage('Open a file first');
+ }
+
+ const fileUri = vscode.window.activeTextEditor.document.uri;
+ const folderPath = posix.dirname(fileUri.path);
+ const folderUri = fileUri.with({ path: folderPath });
+
+ const info = await countAndTotalOfFilesInFolder(folderUri);
+ const doc = await vscode.workspace.openTextDocument({ content: `${info.count} files in ${folderUri.toString(true)} with a total of ${info.total} bytes` });
+ vscode.window.showTextDocument(doc, { viewColumn: vscode.ViewColumn.Beside });
+ });
+
+ // Command #3 - Write and read a file
+ // * shows how to derive a new file-uri from a folder-uri
+ // * shows how to convert a string into a typed array and back
+ vscode.commands.registerCommand('fs/readWriteFile', async function () {
+
+ if (!vscode.workspace.workspaceFolders) {
+ return vscode.window.showInformationMessage('No folder or workspace opened');
+ }
+
+ const writeStr = '1€ is 1.12$ is 0.9£';
+ const writeData = Buffer.from(writeStr, 'utf8');
+
+ const folderUri = vscode.workspace.workspaceFolders[0].uri;
+ const fileUri = folderUri.with({ path: posix.join(folderUri.path, 'test.txt') });
+
+ await vscode.workspace.fs.writeFile(fileUri, writeData);
+
+ const readData = await vscode.workspace.fs.readFile(fileUri);
+ const readStr = Buffer.from(readData).toString('utf8');
+
+ vscode.window.showInformationMessage(readStr);
+ vscode.window.showTextDocument(fileUri);
+ });
+
+}
diff --git a/fsconsumer-sample/tsconfig.json b/fsconsumer-sample/tsconfig.json
new file mode 100644
index 00000000..e04ff1b4
--- /dev/null
+++ b/fsconsumer-sample/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "strictNullChecks": true,
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "sourceMap": true,
+ "strict": true,
+ "rootDir": "."
+ },
+ "exclude": ["node_modules", ".vscode-test"]
+}
diff --git a/fsconsumer-sample/tslint.json b/fsconsumer-sample/tslint.json
new file mode 100644
index 00000000..469c59d5
--- /dev/null
+++ b/fsconsumer-sample/tslint.json
@@ -0,0 +1,12 @@
+{
+ "rules": {
+ "no-string-throw": true,
+ "no-unused-expression": true,
+ "no-duplicate-variable": true,
+ "curly": true,
+ "class-name": true,
+ "semicolon": [true, "always"],
+ "triple-equals": true
+ },
+ "defaultSeverity": "warning"
+}
diff --git a/fsconsumer-sample/vscode.d.ts b/fsconsumer-sample/vscode.d.ts
new file mode 100644
index 00000000..78643939
--- /dev/null
+++ b/fsconsumer-sample/vscode.d.ts
@@ -0,0 +1,9409 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+declare module 'vscode' {
+
+ /**
+ * The version of the editor.
+ */
+ export const version: string;
+
+ /**
+ * Represents a reference to a command. Provides a title which
+ * will be used to represent a command in the UI and, optionally,
+ * an array of arguments which will be passed to the command handler
+ * function when invoked.
+ */
+ export interface Command {
+ /**
+ * Title of the command, like `save`.
+ */
+ title: string;
+
+ /**
+ * The identifier of the actual command handler.
+ * @see [commands.registerCommand](#commands.registerCommand).
+ */
+ command: string;
+
+ /**
+ * A tooltip for the command, when represented in the UI.
+ */
+ tooltip?: string;
+
+ /**
+ * Arguments that the command handler should be
+ * invoked with.
+ */
+ arguments?: any[];
+ }
+
+ /**
+ * Represents a line of text, such as a line of source code.
+ *
+ * TextLine objects are __immutable__. When a [document](#TextDocument) changes,
+ * previously retrieved lines will not represent the latest state.
+ */
+ export interface TextLine {
+
+ /**
+ * The zero-based line number.
+ */
+ readonly lineNumber: number;
+
+ /**
+ * The text of this line without the line separator characters.
+ */
+ readonly text: string;
+
+ /**
+ * The range this line covers without the line separator characters.
+ */
+ readonly range: Range;
+
+ /**
+ * The range this line covers with the line separator characters.
+ */
+ readonly rangeIncludingLineBreak: Range;
+
+ /**
+ * The offset of the first character which is not a whitespace character as defined
+ * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned.
+ */
+ readonly firstNonWhitespaceCharacterIndex: number;
+
+ /**
+ * Whether this line is whitespace only, shorthand
+ * for [TextLine.firstNonWhitespaceCharacterIndex](#TextLine.firstNonWhitespaceCharacterIndex) === [TextLine.text.length](#TextLine.text).
+ */
+ readonly isEmptyOrWhitespace: boolean;
+ }
+
+ /**
+ * Represents a text document, such as a source file. Text documents have
+ * [lines](#TextLine) and knowledge about an underlying resource like a file.
+ */
+ export interface TextDocument {
+
+ /**
+ * The associated uri for this document.
+ *
+ * *Note* that most documents use the `file`-scheme, which means they are files on disk. However, **not** all documents are
+ * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk.
+ *
+ * @see [FileSystemProvider](#FileSystemProvider)
+ * @see [TextDocumentContentProvider](#TextDocumentContentProvider)
+ */
+ readonly uri: Uri;
+
+ /**
+ * The file system path of the associated resource. Shorthand
+ * notation for [TextDocument.uri.fsPath](#TextDocument.uri). Independent of the uri scheme.
+ */
+ readonly fileName: string;
+
+ /**
+ * Is this document representing an untitled file which has never been saved yet. *Note* that
+ * this does not mean the document will be saved to disk, use [`uri.scheme`](#Uri.scheme)
+ * to figure out where a document will be [saved](#FileSystemProvider), e.g. `file`, `ftp` etc.
+ */
+ readonly isUntitled: boolean;
+
+ /**
+ * The identifier of the language associated with this document.
+ */
+ readonly languageId: string;
+
+ /**
+ * The version number of this document (it will strictly increase after each
+ * change, including undo/redo).
+ */
+ readonly version: number;
+
+ /**
+ * `true` if there are unpersisted changes.
+ */
+ readonly isDirty: boolean;
+
+ /**
+ * `true` if the document have been closed. A closed document isn't synchronized anymore
+ * and won't be re-used when the same resource is opened again.
+ */
+ readonly isClosed: boolean;
+
+ /**
+ * Save the underlying file.
+ *
+ * @return A promise that will resolve to true when the file
+ * has been saved. If the file was not dirty or the save failed,
+ * will return false.
+ */
+ save(): Thenable;
+
+ /**
+ * The [end of line](#EndOfLine) sequence that is predominately
+ * used in this document.
+ */
+ readonly eol: EndOfLine;
+
+ /**
+ * The number of lines in this document.
+ */
+ readonly lineCount: number;
+
+ /**
+ * Returns a text line denoted by the line number. Note
+ * that the returned object is *not* live and changes to the
+ * document are not reflected.
+ *
+ * @param line A line number in [0, lineCount).
+ * @return A [line](#TextLine).
+ */
+ lineAt(line: number): TextLine;
+
+ /**
+ * Returns a text line denoted by the position. Note
+ * that the returned object is *not* live and changes to the
+ * document are not reflected.
+ *
+ * The position will be [adjusted](#TextDocument.validatePosition).
+ *
+ * @see [TextDocument.lineAt](#TextDocument.lineAt)
+ * @param position A position.
+ * @return A [line](#TextLine).
+ */
+ lineAt(position: Position): TextLine;
+
+ /**
+ * Converts the position to a zero-based offset.
+ *
+ * The position will be [adjusted](#TextDocument.validatePosition).
+ *
+ * @param position A position.
+ * @return A valid zero-based offset.
+ */
+ offsetAt(position: Position): number;
+
+ /**
+ * Converts a zero-based offset to a position.
+ *
+ * @param offset A zero-based offset.
+ * @return A valid [position](#Position).
+ */
+ positionAt(offset: number): Position;
+
+ /**
+ * Get the text of this document. A substring can be retrieved by providing
+ * a range. The range will be [adjusted](#TextDocument.validateRange).
+ *
+ * @param range Include only the text included by the range.
+ * @return The text inside the provided range or the entire text.
+ */
+ getText(range?: Range): string;
+
+ /**
+ * Get a word-range at the given position. By default words are defined by
+ * common separators, like space, -, _, etc. In addition, per language custom
+ * [word definitions](#LanguageConfiguration.wordPattern) can be defined. It
+ * is also possible to provide a custom regular expression.
+ *
+ * * *Note 1:* A custom regular expression must not match the empty string and
+ * if it does, it will be ignored.
+ * * *Note 2:* A custom regular expression will fail to match multiline strings
+ * and in the name of speed regular expressions should not match words with
+ * spaces. Use [`TextLine.text`](#TextLine.text) for more complex, non-wordy, scenarios.
+ *
+ * The position will be [adjusted](#TextDocument.validatePosition).
+ *
+ * @param position A position.
+ * @param regex Optional regular expression that describes what a word is.
+ * @return A range spanning a word, or `undefined`.
+ */
+ getWordRangeAtPosition(position: Position, regex?: RegExp): Range | undefined;
+
+ /**
+ * Ensure a range is completely contained in this document.
+ *
+ * @param range A range.
+ * @return The given range or a new, adjusted range.
+ */
+ validateRange(range: Range): Range;
+
+ /**
+ * Ensure a position is contained in the range of this document.
+ *
+ * @param position A position.
+ * @return The given position or a new, adjusted position.
+ */
+ validatePosition(position: Position): Position;
+ }
+
+ /**
+ * Represents a line and character position, such as
+ * the position of the cursor.
+ *
+ * Position objects are __immutable__. Use the [with](#Position.with) or
+ * [translate](#Position.translate) methods to derive new positions
+ * from an existing position.
+ */
+ export class Position {
+
+ /**
+ * The zero-based line value.
+ */
+ readonly line: number;
+
+ /**
+ * The zero-based character value.
+ */
+ readonly character: number;
+
+ /**
+ * @param line A zero-based line value.
+ * @param character A zero-based character value.
+ */
+ constructor(line: number, character: number);
+
+ /**
+ * Check if this position is before `other`.
+ *
+ * @param other A position.
+ * @return `true` if position is on a smaller line
+ * or on the same line on a smaller character.
+ */
+ isBefore(other: Position): boolean;
+
+ /**
+ * Check if this position is before or equal to `other`.
+ *
+ * @param other A position.
+ * @return `true` if position is on a smaller line
+ * or on the same line on a smaller or equal character.
+ */
+ isBeforeOrEqual(other: Position): boolean;
+
+ /**
+ * Check if this position is after `other`.
+ *
+ * @param other A position.
+ * @return `true` if position is on a greater line
+ * or on the same line on a greater character.
+ */
+ isAfter(other: Position): boolean;
+
+ /**
+ * Check if this position is after or equal to `other`.
+ *
+ * @param other A position.
+ * @return `true` if position is on a greater line
+ * or on the same line on a greater or equal character.
+ */
+ isAfterOrEqual(other: Position): boolean;
+
+ /**
+ * Check if this position is equal to `other`.
+ *
+ * @param other A position.
+ * @return `true` if the line and character of the given position are equal to
+ * the line and character of this position.
+ */
+ isEqual(other: Position): boolean;
+
+ /**
+ * Compare this to `other`.
+ *
+ * @param other A position.
+ * @return A number smaller than zero if this position is before the given position,
+ * a number greater than zero if this position is after the given position, or zero when
+ * this and the given position are equal.
+ */
+ compareTo(other: Position): number;
+
+ /**
+ * Create a new position relative to this position.
+ *
+ * @param lineDelta Delta value for the line value, default is `0`.
+ * @param characterDelta Delta value for the character value, default is `0`.
+ * @return A position which line and character is the sum of the current line and
+ * character and the corresponding deltas.
+ */
+ translate(lineDelta?: number, characterDelta?: number): Position;
+
+ /**
+ * Derived a new position relative to this position.
+ *
+ * @param change An object that describes a delta to this position.
+ * @return A position that reflects the given delta. Will return `this` position if the change
+ * is not changing anything.
+ */
+ translate(change: { lineDelta?: number; characterDelta?: number; }): Position;
+
+ /**
+ * Create a new position derived from this position.
+ *
+ * @param line Value that should be used as line value, default is the [existing value](#Position.line)
+ * @param character Value that should be used as character value, default is the [existing value](#Position.character)
+ * @return A position where line and character are replaced by the given values.
+ */
+ with(line?: number, character?: number): Position;
+
+ /**
+ * Derived a new position from this position.
+ *
+ * @param change An object that describes a change to this position.
+ * @return A position that reflects the given change. Will return `this` position if the change
+ * is not changing anything.
+ */
+ with(change: { line?: number; character?: number; }): Position;
+ }
+
+ /**
+ * A range represents an ordered pair of two positions.
+ * It is guaranteed that [start](#Range.start).isBeforeOrEqual([end](#Range.end))
+ *
+ * Range objects are __immutable__. Use the [with](#Range.with),
+ * [intersection](#Range.intersection), or [union](#Range.union) methods
+ * to derive new ranges from an existing range.
+ */
+ export class Range {
+
+ /**
+ * The start position. It is before or equal to [end](#Range.end).
+ */
+ readonly start: Position;
+
+ /**
+ * The end position. It is after or equal to [start](#Range.start).
+ */
+ readonly end: Position;
+
+ /**
+ * Create a new range from two positions. If `start` is not
+ * before or equal to `end`, the values will be swapped.
+ *
+ * @param start A position.
+ * @param end A position.
+ */
+ constructor(start: Position, end: Position);
+
+ /**
+ * Create a new range from number coordinates. It is a shorter equivalent of
+ * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))`
+ *
+ * @param startLine A zero-based line value.
+ * @param startCharacter A zero-based character value.
+ * @param endLine A zero-based line value.
+ * @param endCharacter A zero-based character value.
+ */
+ constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number);
+
+ /**
+ * `true` if `start` and `end` are equal.
+ */
+ isEmpty: boolean;
+
+ /**
+ * `true` if `start.line` and `end.line` are equal.
+ */
+ isSingleLine: boolean;
+
+ /**
+ * Check if a position or a range is contained in this range.
+ *
+ * @param positionOrRange A position or a range.
+ * @return `true` if the position or range is inside or equal
+ * to this range.
+ */
+ contains(positionOrRange: Position | Range): boolean;
+
+ /**
+ * Check if `other` equals this range.
+ *
+ * @param other A range.
+ * @return `true` when start and end are [equal](#Position.isEqual) to
+ * start and end of this range.
+ */
+ isEqual(other: Range): boolean;
+
+ /**
+ * Intersect `range` with this range and returns a new range or `undefined`
+ * if the ranges have no overlap.
+ *
+ * @param range A range.
+ * @return A range of the greater start and smaller end positions. Will
+ * return undefined when there is no overlap.
+ */
+ intersection(range: Range): Range | undefined;
+
+ /**
+ * Compute the union of `other` with this range.
+ *
+ * @param other A range.
+ * @return A range of smaller start position and the greater end position.
+ */
+ union(other: Range): Range;
+
+ /**
+ * Derived a new range from this range.
+ *
+ * @param start A position that should be used as start. The default value is the [current start](#Range.start).
+ * @param end A position that should be used as end. The default value is the [current end](#Range.end).
+ * @return A range derived from this range with the given start and end position.
+ * If start and end are not different `this` range will be returned.
+ */
+ with(start?: Position, end?: Position): Range;
+
+ /**
+ * Derived a new range from this range.
+ *
+ * @param change An object that describes a change to this range.
+ * @return A range that reflects the given change. Will return `this` range if the change
+ * is not changing anything.
+ */
+ with(change: { start?: Position, end?: Position }): Range;
+ }
+
+ /**
+ * Represents a text selection in an editor.
+ */
+ export class Selection extends Range {
+
+ /**
+ * The position at which the selection starts.
+ * This position might be before or after [active](#Selection.active).
+ */
+ anchor: Position;
+
+ /**
+ * The position of the cursor.
+ * This position might be before or after [anchor](#Selection.anchor).
+ */
+ active: Position;
+
+ /**
+ * Create a selection from two positions.
+ *
+ * @param anchor A position.
+ * @param active A position.
+ */
+ constructor(anchor: Position, active: Position);
+
+ /**
+ * Create a selection from four coordinates.
+ *
+ * @param anchorLine A zero-based line value.
+ * @param anchorCharacter A zero-based character value.
+ * @param activeLine A zero-based line value.
+ * @param activeCharacter A zero-based character value.
+ */
+ constructor(anchorLine: number, anchorCharacter: number, activeLine: number, activeCharacter: number);
+
+ /**
+ * A selection is reversed if [active](#Selection.active).isBefore([anchor](#Selection.anchor)).
+ */
+ isReversed: boolean;
+ }
+
+ /**
+ * Represents sources that can cause [selection change events](#window.onDidChangeTextEditorSelection).
+ */
+ export enum TextEditorSelectionChangeKind {
+ /**
+ * Selection changed due to typing in the editor.
+ */
+ Keyboard = 1,
+ /**
+ * Selection change due to clicking in the editor.
+ */
+ Mouse = 2,
+ /**
+ * Selection changed because a command ran.
+ */
+ Command = 3
+ }
+
+ /**
+ * Represents an event describing the change in a [text editor's selections](#TextEditor.selections).
+ */
+ export interface TextEditorSelectionChangeEvent {
+ /**
+ * The [text editor](#TextEditor) for which the selections have changed.
+ */
+ readonly textEditor: TextEditor;
+ /**
+ * The new value for the [text editor's selections](#TextEditor.selections).
+ */
+ readonly selections: ReadonlyArray;
+ /**
+ * The [change kind](#TextEditorSelectionChangeKind) which has triggered this
+ * event. Can be `undefined`.
+ */
+ readonly kind?: TextEditorSelectionChangeKind;
+ }
+
+ /**
+ * Represents an event describing the change in a [text editor's visible ranges](#TextEditor.visibleRanges).
+ */
+ export interface TextEditorVisibleRangesChangeEvent {
+ /**
+ * The [text editor](#TextEditor) for which the visible ranges have changed.
+ */
+ readonly textEditor: TextEditor;
+ /**
+ * The new value for the [text editor's visible ranges](#TextEditor.visibleRanges).
+ */
+ readonly visibleRanges: ReadonlyArray;
+ }
+
+ /**
+ * Represents an event describing the change in a [text editor's options](#TextEditor.options).
+ */
+ export interface TextEditorOptionsChangeEvent {
+ /**
+ * The [text editor](#TextEditor) for which the options have changed.
+ */
+ readonly textEditor: TextEditor;
+ /**
+ * The new value for the [text editor's options](#TextEditor.options).
+ */
+ readonly options: TextEditorOptions;
+ }
+
+ /**
+ * Represents an event describing the change of a [text editor's view column](#TextEditor.viewColumn).
+ */
+ export interface TextEditorViewColumnChangeEvent {
+ /**
+ * The [text editor](#TextEditor) for which the view column has changed.
+ */
+ readonly textEditor: TextEditor;
+ /**
+ * The new value for the [text editor's view column](#TextEditor.viewColumn).
+ */
+ readonly viewColumn: ViewColumn;
+ }
+
+ /**
+ * Rendering style of the cursor.
+ */
+ export enum TextEditorCursorStyle {
+ /**
+ * Render the cursor as a vertical thick line.
+ */
+ Line = 1,
+ /**
+ * Render the cursor as a block filled.
+ */
+ Block = 2,
+ /**
+ * Render the cursor as a thick horizontal line.
+ */
+ Underline = 3,
+ /**
+ * Render the cursor as a vertical thin line.
+ */
+ LineThin = 4,
+ /**
+ * Render the cursor as a block outlined.
+ */
+ BlockOutline = 5,
+ /**
+ * Render the cursor as a thin horizontal line.
+ */
+ UnderlineThin = 6
+ }
+
+ /**
+ * Rendering style of the line numbers.
+ */
+ export enum TextEditorLineNumbersStyle {
+ /**
+ * Do not render the line numbers.
+ */
+ Off = 0,
+ /**
+ * Render the line numbers.
+ */
+ On = 1,
+ /**
+ * Render the line numbers with values relative to the primary cursor location.
+ */
+ Relative = 2
+ }
+
+ /**
+ * Represents a [text editor](#TextEditor)'s [options](#TextEditor.options).
+ */
+ export interface TextEditorOptions {
+
+ /**
+ * The size in spaces a tab takes. This is used for two purposes:
+ * - the rendering width of a tab character;
+ * - the number of spaces to insert when [insertSpaces](#TextEditorOptions.insertSpaces) is true.
+ *
+ * When getting a text editor's options, this property will always be a number (resolved).
+ * When setting a text editor's options, this property is optional and it can be a number or `"auto"`.
+ */
+ tabSize?: number | string;
+
+ /**
+ * When pressing Tab insert [n](#TextEditorOptions.tabSize) spaces.
+ * When getting a text editor's options, this property will always be a boolean (resolved).
+ * When setting a text editor's options, this property is optional and it can be a boolean or `"auto"`.
+ */
+ insertSpaces?: boolean | string;
+
+ /**
+ * The rendering style of the cursor in this editor.
+ * When getting a text editor's options, this property will always be present.
+ * When setting a text editor's options, this property is optional.
+ */
+ cursorStyle?: TextEditorCursorStyle;
+
+ /**
+ * Render relative line numbers w.r.t. the current line number.
+ * When getting a text editor's options, this property will always be present.
+ * When setting a text editor's options, this property is optional.
+ */
+ lineNumbers?: TextEditorLineNumbersStyle;
+ }
+
+ /**
+ * Represents a handle to a set of decorations
+ * sharing the same [styling options](#DecorationRenderOptions) in a [text editor](#TextEditor).
+ *
+ * To get an instance of a `TextEditorDecorationType` use
+ * [createTextEditorDecorationType](#window.createTextEditorDecorationType).
+ */
+ export interface TextEditorDecorationType {
+
+ /**
+ * Internal representation of the handle.
+ */
+ readonly key: string;
+
+ /**
+ * Remove this decoration type and all decorations on all text editors using it.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Represents different [reveal](#TextEditor.revealRange) strategies in a text editor.
+ */
+ export enum TextEditorRevealType {
+ /**
+ * The range will be revealed with as little scrolling as possible.
+ */
+ Default = 0,
+ /**
+ * The range will always be revealed in the center of the viewport.
+ */
+ InCenter = 1,
+ /**
+ * If the range is outside the viewport, it will be revealed in the center of the viewport.
+ * Otherwise, it will be revealed with as little scrolling as possible.
+ */
+ InCenterIfOutsideViewport = 2,
+ /**
+ * The range will always be revealed at the top of the viewport.
+ */
+ AtTop = 3
+ }
+
+ /**
+ * Represents different positions for rendering a decoration in an [overview ruler](#DecorationRenderOptions.overviewRulerLane).
+ * The overview ruler supports three lanes.
+ */
+ export enum OverviewRulerLane {
+ Left = 1,
+ Center = 2,
+ Right = 4,
+ Full = 7
+ }
+
+ /**
+ * Describes the behavior of decorations when typing/editing at their edges.
+ */
+ export enum DecorationRangeBehavior {
+ /**
+ * The decoration's range will widen when edits occur at the start or end.
+ */
+ OpenOpen = 0,
+ /**
+ * The decoration's range will not widen when edits occur at the start of end.
+ */
+ ClosedClosed = 1,
+ /**
+ * The decoration's range will widen when edits occur at the start, but not at the end.
+ */
+ OpenClosed = 2,
+ /**
+ * The decoration's range will widen when edits occur at the end, but not at the start.
+ */
+ ClosedOpen = 3
+ }
+
+ /**
+ * Represents options to configure the behavior of showing a [document](#TextDocument) in an [editor](#TextEditor).
+ */
+ export interface TextDocumentShowOptions {
+ /**
+ * An optional view column in which the [editor](#TextEditor) should be shown.
+ * The default is the [active](#ViewColumn.Active), other values are adjusted to
+ * be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is
+ * not adjusted. Use [`ViewColumn.Beside`](#ViewColumn.Beside) to open the
+ * editor to the side of the currently active one.
+ */
+ viewColumn?: ViewColumn;
+
+ /**
+ * An optional flag that when `true` will stop the [editor](#TextEditor) from taking focus.
+ */
+ preserveFocus?: boolean;
+
+ /**
+ * An optional flag that controls if an [editor](#TextEditor)-tab will be replaced
+ * with the next editor or if it will be kept.
+ */
+ preview?: boolean;
+
+ /**
+ * An optional selection to apply for the document in the [editor](#TextEditor).
+ */
+ selection?: Range;
+ }
+
+ /**
+ * A reference to one of the workbench colors as defined in https://code.visualstudio.com/docs/getstarted/theme-color-reference.
+ * Using a theme color is preferred over a custom color as it gives theme authors and users the possibility to change the color.
+ */
+ export class ThemeColor {
+
+ /**
+ * Creates a reference to a theme color.
+ * @param id of the color. The available colors are listed in https://code.visualstudio.com/docs/getstarted/theme-color-reference.
+ */
+ constructor(id: string);
+ }
+
+ /**
+ * A reference to a named icon. Currently only [File](#ThemeIcon.File) and [Folder](#ThemeIcon.Folder) are supported.
+ * Using a theme icon is preferred over a custom icon as it gives theme authors the possibility to change the icons.
+ */
+ export class ThemeIcon {
+ /**
+ * Reference to a icon representing a file. The icon is taken from the current file icon theme or a placeholder icon.
+ */
+ static readonly File: ThemeIcon;
+
+ /**
+ * Reference to a icon representing a folder. The icon is taken from the current file icon theme or a placeholder icon.
+ */
+ static readonly Folder: ThemeIcon;
+
+ private constructor(id: string);
+ }
+
+ /**
+ * Represents theme specific rendering styles for a [text editor decoration](#TextEditorDecorationType).
+ */
+ export interface ThemableDecorationRenderOptions {
+ /**
+ * Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations.
+ * Alternatively a color from the color registry can be [referenced](#ThemeColor).
+ */
+ backgroundColor?: string | ThemeColor;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ outline?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'outline' for setting one or more of the individual outline properties.
+ */
+ outlineColor?: string | ThemeColor;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'outline' for setting one or more of the individual outline properties.
+ */
+ outlineStyle?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'outline' for setting one or more of the individual outline properties.
+ */
+ outlineWidth?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ border?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'border' for setting one or more of the individual border properties.
+ */
+ borderColor?: string | ThemeColor;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'border' for setting one or more of the individual border properties.
+ */
+ borderRadius?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'border' for setting one or more of the individual border properties.
+ */
+ borderSpacing?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'border' for setting one or more of the individual border properties.
+ */
+ borderStyle?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ * Better use 'border' for setting one or more of the individual border properties.
+ */
+ borderWidth?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ fontStyle?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ fontWeight?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ textDecoration?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ cursor?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ color?: string | ThemeColor;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ opacity?: string;
+
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ letterSpacing?: string;
+
+ /**
+ * An **absolute path** or an URI to an image to be rendered in the gutter.
+ */
+ gutterIconPath?: string | Uri;
+
+ /**
+ * Specifies the size of the gutter icon.
+ * Available values are 'auto', 'contain', 'cover' and any percentage value.
+ * For further information: https://msdn.microsoft.com/en-us/library/jj127316(v=vs.85).aspx
+ */
+ gutterIconSize?: string;
+
+ /**
+ * The color of the decoration in the overview ruler. Use rgba() and define transparent colors to play well with other decorations.
+ */
+ overviewRulerColor?: string | ThemeColor;
+
+ /**
+ * Defines the rendering options of the attachment that is inserted before the decorated text.
+ */
+ before?: ThemableDecorationAttachmentRenderOptions;
+
+ /**
+ * Defines the rendering options of the attachment that is inserted after the decorated text.
+ */
+ after?: ThemableDecorationAttachmentRenderOptions;
+ }
+
+ export interface ThemableDecorationAttachmentRenderOptions {
+ /**
+ * Defines a text content that is shown in the attachment. Either an icon or a text can be shown, but not both.
+ */
+ contentText?: string;
+ /**
+ * An **absolute path** or an URI to an image to be rendered in the attachment. Either an icon
+ * or a text can be shown, but not both.
+ */
+ contentIconPath?: string | Uri;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ border?: string;
+ /**
+ * CSS styling property that will be applied to text enclosed by a decoration.
+ */
+ borderColor?: string | ThemeColor;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ fontStyle?: string;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ fontWeight?: string;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ textDecoration?: string;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ color?: string | ThemeColor;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ backgroundColor?: string | ThemeColor;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ margin?: string;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ width?: string;
+ /**
+ * CSS styling property that will be applied to the decoration attachment.
+ */
+ height?: string;
+ }
+
+ /**
+ * Represents rendering styles for a [text editor decoration](#TextEditorDecorationType).
+ */
+ export interface DecorationRenderOptions extends ThemableDecorationRenderOptions {
+ /**
+ * Should the decoration be rendered also on the whitespace after the line text.
+ * Defaults to `false`.
+ */
+ isWholeLine?: boolean;
+
+ /**
+ * Customize the growing behavior of the decoration when edits occur at the edges of the decoration's range.
+ * Defaults to `DecorationRangeBehavior.OpenOpen`.
+ */
+ rangeBehavior?: DecorationRangeBehavior;
+
+ /**
+ * The position in the overview ruler where the decoration should be rendered.
+ */
+ overviewRulerLane?: OverviewRulerLane;
+
+ /**
+ * Overwrite options for light themes.
+ */
+ light?: ThemableDecorationRenderOptions;
+
+ /**
+ * Overwrite options for dark themes.
+ */
+ dark?: ThemableDecorationRenderOptions;
+ }
+
+ /**
+ * Represents options for a specific decoration in a [decoration set](#TextEditorDecorationType).
+ */
+ export interface DecorationOptions {
+
+ /**
+ * Range to which this decoration is applied. The range must not be empty.
+ */
+ range: Range;
+
+ /**
+ * A message that should be rendered when hovering over the decoration.
+ */
+ hoverMessage?: MarkedString | MarkedString[];
+
+ /**
+ * Render options applied to the current decoration. For performance reasons, keep the
+ * number of decoration specific options small, and use decoration types wherever possible.
+ */
+ renderOptions?: DecorationInstanceRenderOptions;
+ }
+
+ export interface ThemableDecorationInstanceRenderOptions {
+ /**
+ * Defines the rendering options of the attachment that is inserted before the decorated text.
+ */
+ before?: ThemableDecorationAttachmentRenderOptions;
+
+ /**
+ * Defines the rendering options of the attachment that is inserted after the decorated text.
+ */
+ after?: ThemableDecorationAttachmentRenderOptions;
+ }
+
+ export interface DecorationInstanceRenderOptions extends ThemableDecorationInstanceRenderOptions {
+ /**
+ * Overwrite options for light themes.
+ */
+ light?: ThemableDecorationInstanceRenderOptions;
+
+ /**
+ * Overwrite options for dark themes.
+ */
+ dark?: ThemableDecorationInstanceRenderOptions;
+ }
+
+ /**
+ * Represents an editor that is attached to a [document](#TextDocument).
+ */
+ export interface TextEditor {
+
+ /**
+ * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor.
+ */
+ readonly document: TextDocument;
+
+ /**
+ * The primary selection on this text editor. Shorthand for `TextEditor.selections[0]`.
+ */
+ selection: Selection;
+
+ /**
+ * The selections in this text editor. The primary selection is always at index 0.
+ */
+ selections: Selection[];
+
+ /**
+ * The current visible ranges in the editor (vertically).
+ * This accounts only for vertical scrolling, and not for horizontal scrolling.
+ */
+ readonly visibleRanges: Range[];
+
+ /**
+ * Text editor options.
+ */
+ options: TextEditorOptions;
+
+ /**
+ * The column in which this editor shows. Will be `undefined` in case this
+ * isn't one of the main editors, e.g. an embedded editor, or when the editor
+ * column is larger than three.
+ */
+ viewColumn?: ViewColumn;
+
+ /**
+ * Perform an edit on the document associated with this text editor.
+ *
+ * The given callback-function is invoked with an [edit-builder](#TextEditorEdit) which must
+ * be used to make edits. Note that the edit-builder is only valid while the
+ * callback executes.
+ *
+ * @param callback A function which can create edits using an [edit-builder](#TextEditorEdit).
+ * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit.
+ * @return A promise that resolves with a value indicating if the edits could be applied.
+ */
+ edit(callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable;
+
+ /**
+ * Insert a [snippet](#SnippetString) and put the editor into snippet mode. "Snippet mode"
+ * means the editor adds placeholders and additional cursors so that the user can complete
+ * or accept the snippet.
+ *
+ * @param snippet The snippet to insert in this edit.
+ * @param location Position or range at which to insert the snippet, defaults to the current editor selection or selections.
+ * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit.
+ * @return A promise that resolves with a value indicating if the snippet could be inserted. Note that the promise does not signal
+ * that the snippet is completely filled-in or accepted.
+ */
+ insertSnippet(snippet: SnippetString, location?: Position | Range | ReadonlyArray | ReadonlyArray, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable;
+
+ /**
+ * Adds a set of decorations to the text editor. If a set of decorations already exists with
+ * the given [decoration type](#TextEditorDecorationType), they will be replaced.
+ *
+ * @see [createTextEditorDecorationType](#window.createTextEditorDecorationType).
+ *
+ * @param decorationType A decoration type.
+ * @param rangesOrOptions Either [ranges](#Range) or more detailed [options](#DecorationOptions).
+ */
+ setDecorations(decorationType: TextEditorDecorationType, rangesOrOptions: Range[] | DecorationOptions[]): void;
+
+ /**
+ * Scroll as indicated by `revealType` in order to reveal the given range.
+ *
+ * @param range A range.
+ * @param revealType The scrolling strategy for revealing `range`.
+ */
+ revealRange(range: Range, revealType?: TextEditorRevealType): void;
+
+ /**
+ * ~~Show the text editor.~~
+ *
+ * @deprecated Use [window.showTextDocument](#window.showTextDocument) instead.
+ *
+ * @param column The [column](#ViewColumn) in which to show this editor.
+ * This method shows unexpected behavior and will be removed in the next major update.
+ */
+ show(column?: ViewColumn): void;
+
+ /**
+ * ~~Hide the text editor.~~
+ *
+ * @deprecated Use the command `workbench.action.closeActiveEditor` instead.
+ * This method shows unexpected behavior and will be removed in the next major update.
+ */
+ hide(): void;
+ }
+
+ /**
+ * Represents an end of line character sequence in a [document](#TextDocument).
+ */
+ export enum EndOfLine {
+ /**
+ * The line feed `\n` character.
+ */
+ LF = 1,
+ /**
+ * The carriage return line feed `\r\n` sequence.
+ */
+ CRLF = 2
+ }
+
+ /**
+ * A complex edit that will be applied in one transaction on a TextEditor.
+ * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.)
+ * they can be applied on a [document](#TextDocument) associated with a [text editor](#TextEditor).
+ *
+ */
+ export interface TextEditorEdit {
+ /**
+ * Replace a certain text region with a new value.
+ * You can use \r\n or \n in `value` and they will be normalized to the current [document](#TextDocument).
+ *
+ * @param location The range this operation should remove.
+ * @param value The new text this operation should insert after removing `location`.
+ */
+ replace(location: Position | Range | Selection, value: string): void;
+
+ /**
+ * Insert text at a location.
+ * You can use \r\n or \n in `value` and they will be normalized to the current [document](#TextDocument).
+ * Although the equivalent text edit can be made with [replace](#TextEditorEdit.replace), `insert` will produce a different resulting selection (it will get moved).
+ *
+ * @param location The position where the new text should be inserted.
+ * @param value The new text this operation should insert.
+ */
+ insert(location: Position, value: string): void;
+
+ /**
+ * Delete a certain text region.
+ *
+ * @param location The range this operation should remove.
+ */
+ delete(location: Range | Selection): void;
+
+ /**
+ * Set the end of line sequence.
+ *
+ * @param endOfLine The new end of line for the [document](#TextDocument).
+ */
+ setEndOfLine(endOfLine: EndOfLine): void;
+ }
+
+ /**
+ * A universal resource identifier representing either a file on disk
+ * or another resource, like untitled resources.
+ */
+ export class Uri {
+
+ /**
+ * Create an URI from a string, e.g. `http://www.msft.com/some/path`,
+ * `file:///usr/home`, or `scheme:with/path`.
+ *
+ * *Note* that for a while uris without a `scheme` were accepted. That is not correct
+ * as all uris should have a scheme. To avoid breakage of existing code the optional
+ * `strict`-argument has been added. We *strongly* advise to use it, e.g. `Uri.parse('my:uri', true)`
+ *
+ * @see [Uri.toString](#Uri.toString)
+ * @param value The string value of an Uri.
+ * @param strict Throw an error when `value` is empty or when no `scheme` can be parsed.
+ * @return A new Uri instance.
+ */
+ static parse(value: string, strict?: boolean): Uri;
+
+ /**
+ * Create an URI from a file system path. The [scheme](#Uri.scheme)
+ * will be `file`.
+ *
+ * The *difference* between `Uri#parse` and `Uri#file` is that the latter treats the argument
+ * as path, not as stringified-uri. E.g. `Uri.file(path)` is *not* the same as
+ * `Uri.parse('file://' + path)` because the path might contain characters that are
+ * interpreted (# and ?). See the following sample:
+ * ```ts
+ const good = URI.file('/coding/c#/project1');
+ good.scheme === 'file';
+ good.path === '/coding/c#/project1';
+ good.fragment === '';
+
+ const bad = URI.parse('file://' + '/coding/c#/project1');
+ bad.scheme === 'file';
+ bad.path === '/coding/c'; // path is now broken
+ bad.fragment === '/project1';
+ ```
+ *
+ * @param path A file system or UNC path.
+ * @return A new Uri instance.
+ */
+ static file(path: string): Uri;
+
+ /**
+ * Use the `file` and `parse` factory functions to create new `Uri` objects.
+ */
+ private constructor(scheme: string, authority: string, path: string, query: string, fragment: string);
+
+ /**
+ * Scheme is the `http` part of `http://www.msft.com/some/path?query#fragment`.
+ * The part before the first colon.
+ */
+ readonly scheme: string;
+
+ /**
+ * Authority is the `www.msft.com` part of `http://www.msft.com/some/path?query#fragment`.
+ * The part between the first double slashes and the next slash.
+ */
+ readonly authority: string;
+
+ /**
+ * Path is the `/some/path` part of `http://www.msft.com/some/path?query#fragment`.
+ */
+ readonly path: string;
+
+ /**
+ * Query is the `query` part of `http://www.msft.com/some/path?query#fragment`.
+ */
+ readonly query: string;
+
+ /**
+ * Fragment is the `fragment` part of `http://www.msft.com/some/path?query#fragment`.
+ */
+ readonly fragment: string;
+
+ /**
+ * The string representing the corresponding file system path of this Uri.
+ *
+ * Will handle UNC paths and normalize windows drive letters to lower-case. Also
+ * uses the platform specific path separator.
+ *
+ * * Will *not* validate the path for invalid characters and semantics.
+ * * Will *not* look at the scheme of this Uri.
+ * * The resulting string shall *not* be used for display purposes but
+ * for disk operations, like `readFile` et al.
+ *
+ * The *difference* to the [`path`](#Uri.path)-property is the use of the platform specific
+ * path separator and the handling of UNC paths. The sample below outlines the difference:
+ * ```ts
+ const u = URI.parse('file://server/c$/folder/file.txt')
+ u.authority === 'server'
+ u.path === '/shares/c$/file.txt'
+ u.fsPath === '\\server\c$\folder\file.txt'
+ ```
+ */
+ readonly fsPath: string;
+
+ /**
+ * Derive a new Uri from this Uri.
+ *
+ * ```ts
+ * let file = Uri.parse('before:some/file/path');
+ * let other = file.with({ scheme: 'after' });
+ * assert.ok(other.toString() === 'after:some/file/path');
+ * ```
+ *
+ * @param change An object that describes a change to this Uri. To unset components use `null` or
+ * the empty string.
+ * @return A new Uri that reflects the given change. Will return `this` Uri if the change
+ * is not changing anything.
+ */
+ with(change: { scheme?: string; authority?: string; path?: string; query?: string; fragment?: string }): Uri;
+
+ /**
+ * Returns a string representation of this Uri. The representation and normalization
+ * of a URI depends on the scheme.
+ *
+ * * The resulting string can be safely used with [Uri.parse](#Uri.parse).
+ * * The resulting string shall *not* be used for display purposes.
+ *
+ * *Note* that the implementation will encode _aggressive_ which often leads to unexpected,
+ * but not incorrect, results. For instance, colons are encoded to `%3A` which might be unexpected
+ * in file-uri. Also `&` and `=` will be encoded which might be unexpected for http-uris. For stability
+ * reasons this cannot be changed anymore. If you suffer from too aggressive encoding you should use
+ * the `skipEncoding`-argument: `uri.toString(true)`.
+ *
+ * @param skipEncoding Do not percentage-encode the result, defaults to `false`. Note that
+ * the `#` and `?` characters occurring in the path will always be encoded.
+ * @returns A string representation of this Uri.
+ */
+ toString(skipEncoding?: boolean): string;
+
+ /**
+ * Returns a JSON representation of this Uri.
+ *
+ * @return An object.
+ */
+ toJSON(): any;
+ }
+
+ /**
+ * A cancellation token is passed to an asynchronous or long running
+ * operation to request cancellation, like cancelling a request
+ * for completion items because the user continued to type.
+ *
+ * To get an instance of a `CancellationToken` use a
+ * [CancellationTokenSource](#CancellationTokenSource).
+ */
+ export interface CancellationToken {
+
+ /**
+ * Is `true` when the token has been cancelled, `false` otherwise.
+ */
+ isCancellationRequested: boolean;
+
+ /**
+ * An [event](#Event) which fires upon cancellation.
+ */
+ onCancellationRequested: Event;
+ }
+
+ /**
+ * A cancellation source creates and controls a [cancellation token](#CancellationToken).
+ */
+ export class CancellationTokenSource {
+
+ /**
+ * The cancellation token of this source.
+ */
+ token: CancellationToken;
+
+ /**
+ * Signal cancellation on the token.
+ */
+ cancel(): void;
+
+ /**
+ * Dispose object and free resources.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Represents a type which can release resources, such
+ * as event listening or a timer.
+ */
+ export class Disposable {
+
+ /**
+ * Combine many disposable-likes into one. Use this method
+ * when having objects with a dispose function which are not
+ * instances of Disposable.
+ *
+ * @param disposableLikes Objects that have at least a `dispose`-function member.
+ * @return Returns a new disposable which, upon dispose, will
+ * dispose all provided disposables.
+ */
+ static from(...disposableLikes: { dispose: () => any }[]): Disposable;
+
+ /**
+ * Creates a new Disposable calling the provided function
+ * on dispose.
+ * @param callOnDispose Function that disposes something.
+ */
+ constructor(callOnDispose: Function);
+
+ /**
+ * Dispose this object.
+ */
+ dispose(): any;
+ }
+
+ /**
+ * Represents a typed event.
+ *
+ * A function that represents an event to which you subscribe by calling it with
+ * a listener function as argument.
+ *
+ * @sample `item.onDidChange(function(event) { console.log("Event happened: " + event); });`
+ */
+ export interface Event {
+
+ /**
+ * A function that represents an event to which you subscribe by calling it with
+ * a listener function as argument.
+ *
+ * @param listener The listener function will be called when the event happens.
+ * @param thisArgs The `this`-argument which will be used when calling the event listener.
+ * @param disposables An array to which a [disposable](#Disposable) will be added.
+ * @return A disposable which unsubscribes the event listener.
+ */
+ (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable;
+ }
+
+ /**
+ * An event emitter can be used to create and manage an [event](#Event) for others
+ * to subscribe to. One emitter always owns one event.
+ *
+ * Use this class if you want to provide event from within your extension, for instance
+ * inside a [TextDocumentContentProvider](#TextDocumentContentProvider) or when providing
+ * API to other extensions.
+ */
+ export class EventEmitter {
+
+ /**
+ * The event listeners can subscribe to.
+ */
+ event: Event;
+
+ /**
+ * Notify all subscribers of the [event](#EventEmitter.event). Failure
+ * of one or more listener will not fail this function call.
+ *
+ * @param data The event object.
+ */
+ fire(data?: T): void;
+
+ /**
+ * Dispose this object and free resources.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * A file system watcher notifies about changes to files and folders
+ * on disk.
+ *
+ * To get an instance of a `FileSystemWatcher` use
+ * [createFileSystemWatcher](#workspace.createFileSystemWatcher).
+ */
+ export interface FileSystemWatcher extends Disposable {
+
+ /**
+ * true if this file system watcher has been created such that
+ * it ignores creation file system events.
+ */
+ ignoreCreateEvents: boolean;
+
+ /**
+ * true if this file system watcher has been created such that
+ * it ignores change file system events.
+ */
+ ignoreChangeEvents: boolean;
+
+ /**
+ * true if this file system watcher has been created such that
+ * it ignores delete file system events.
+ */
+ ignoreDeleteEvents: boolean;
+
+ /**
+ * An event which fires on file/folder creation.
+ */
+ onDidCreate: Event;
+
+ /**
+ * An event which fires on file/folder change.
+ */
+ onDidChange: Event;
+
+ /**
+ * An event which fires on file/folder deletion.
+ */
+ onDidDelete: Event;
+ }
+
+ /**
+ * A text document content provider allows to add readonly documents
+ * to the editor, such as source from a dll or generated html from md.
+ *
+ * Content providers are [registered](#workspace.registerTextDocumentContentProvider)
+ * for a [uri-scheme](#Uri.scheme). When a uri with that scheme is to
+ * be [loaded](#workspace.openTextDocument) the content provider is
+ * asked.
+ */
+ export interface TextDocumentContentProvider {
+
+ /**
+ * An event to signal a resource has changed.
+ */
+ onDidChange?: Event;
+
+ /**
+ * Provide textual content for a given uri.
+ *
+ * The editor will use the returned string-content to create a readonly
+ * [document](#TextDocument). Resources allocated should be released when
+ * the corresponding document has been [closed](#workspace.onDidCloseTextDocument).
+ *
+ * **Note**: The contents of the created [document](#TextDocument) might not be
+ * identical to the provided text due to end-of-line-sequence normalization.
+ *
+ * @param uri An uri which scheme matches the scheme this provider was [registered](#workspace.registerTextDocumentContentProvider) for.
+ * @param token A cancellation token.
+ * @return A string or a thenable that resolves to such.
+ */
+ provideTextDocumentContent(uri: Uri, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents an item that can be selected from
+ * a list of items.
+ */
+ export interface QuickPickItem {
+
+ /**
+ * A human readable string which is rendered prominent.
+ */
+ label: string;
+
+ /**
+ * A human readable string which is rendered less prominent.
+ */
+ description?: string;
+
+ /**
+ * A human readable string which is rendered less prominent.
+ */
+ detail?: string;
+
+ /**
+ * Optional flag indicating if this item is picked initially.
+ * (Only honored when the picker allows multiple selections.)
+ *
+ * @see [QuickPickOptions.canPickMany](#QuickPickOptions.canPickMany)
+ */
+ picked?: boolean;
+
+ /**
+ * Always show this item.
+ */
+ alwaysShow?: boolean;
+ }
+
+ /**
+ * Options to configure the behavior of the quick pick UI.
+ */
+ export interface QuickPickOptions {
+ /**
+ * An optional flag to include the description when filtering the picks.
+ */
+ matchOnDescription?: boolean;
+
+ /**
+ * An optional flag to include the detail when filtering the picks.
+ */
+ matchOnDetail?: boolean;
+
+ /**
+ * An optional string to show as place holder in the input box to guide the user what to pick on.
+ */
+ placeHolder?: string;
+
+ /**
+ * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window.
+ */
+ ignoreFocusOut?: boolean;
+
+ /**
+ * An optional flag to make the picker accept multiple selections, if true the result is an array of picks.
+ */
+ canPickMany?: boolean;
+
+ /**
+ * An optional function that is invoked whenever an item is selected.
+ */
+ onDidSelectItem?(item: QuickPickItem | string): any;
+ }
+
+ /**
+ * Options to configure the behaviour of the [workspace folder](#WorkspaceFolder) pick UI.
+ */
+ export interface WorkspaceFolderPickOptions {
+
+ /**
+ * An optional string to show as place holder in the input box to guide the user what to pick on.
+ */
+ placeHolder?: string;
+
+ /**
+ * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window.
+ */
+ ignoreFocusOut?: boolean;
+ }
+
+ /**
+ * Options to configure the behaviour of a file open dialog.
+ *
+ * * Note 1: A dialog can select files, folders, or both. This is not true for Windows
+ * which enforces to open either files or folder, but *not both*.
+ * * Note 2: Explicitly setting `canSelectFiles` and `canSelectFolders` to `false` is futile
+ * and the editor then silently adjusts the options to select files.
+ */
+ export interface OpenDialogOptions {
+ /**
+ * The resource the dialog shows when opened.
+ */
+ defaultUri?: Uri;
+
+ /**
+ * A human-readable string for the open button.
+ */
+ openLabel?: string;
+
+ /**
+ * Allow to select files, defaults to `true`.
+ */
+ canSelectFiles?: boolean;
+
+ /**
+ * Allow to select folders, defaults to `false`.
+ */
+ canSelectFolders?: boolean;
+
+ /**
+ * Allow to select many files or folders.
+ */
+ canSelectMany?: boolean;
+
+ /**
+ * A set of file filters that are used by the dialog. Each entry is a human readable label,
+ * like "TypeScript", and an array of extensions, e.g.
+ * ```ts
+ * {
+ * 'Images': ['png', 'jpg']
+ * 'TypeScript': ['ts', 'tsx']
+ * }
+ * ```
+ */
+ filters?: { [name: string]: string[] };
+ }
+
+ /**
+ * Options to configure the behaviour of a file save dialog.
+ */
+ export interface SaveDialogOptions {
+ /**
+ * The resource the dialog shows when opened.
+ */
+ defaultUri?: Uri;
+
+ /**
+ * A human-readable string for the save button.
+ */
+ saveLabel?: string;
+
+ /**
+ * A set of file filters that are used by the dialog. Each entry is a human readable label,
+ * like "TypeScript", and an array of extensions, e.g.
+ * ```ts
+ * {
+ * 'Images': ['png', 'jpg']
+ * 'TypeScript': ['ts', 'tsx']
+ * }
+ * ```
+ */
+ filters?: { [name: string]: string[] };
+ }
+
+ /**
+ * Represents an action that is shown with an information, warning, or
+ * error message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ * @see [showWarningMessage](#window.showWarningMessage)
+ * @see [showErrorMessage](#window.showErrorMessage)
+ */
+ export interface MessageItem {
+
+ /**
+ * A short title like 'Retry', 'Open Log' etc.
+ */
+ title: string;
+
+ /**
+ * A hint for modal dialogs that the item should be triggered
+ * when the user cancels the dialog (e.g. by pressing the ESC
+ * key).
+ *
+ * Note: this option is ignored for non-modal messages.
+ */
+ isCloseAffordance?: boolean;
+ }
+
+ /**
+ * Options to configure the behavior of the message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ * @see [showWarningMessage](#window.showWarningMessage)
+ * @see [showErrorMessage](#window.showErrorMessage)
+ */
+ export interface MessageOptions {
+
+ /**
+ * Indicates that this message should be modal.
+ */
+ modal?: boolean;
+ }
+
+ /**
+ * Options to configure the behavior of the input box UI.
+ */
+ export interface InputBoxOptions {
+
+ /**
+ * The value to prefill in the input box.
+ */
+ value?: string;
+
+ /**
+ * Selection of the prefilled [`value`](#InputBoxOptions.value). Defined as tuple of two number where the
+ * first is the inclusive start index and the second the exclusive end index. When `undefined` the whole
+ * word will be selected, when empty (start equals end) only the cursor will be set,
+ * otherwise the defined range will be selected.
+ */
+ valueSelection?: [number, number];
+
+ /**
+ * The text to display underneath the input box.
+ */
+ prompt?: string;
+
+ /**
+ * An optional string to show as place holder in the input box to guide the user what to type.
+ */
+ placeHolder?: string;
+
+ /**
+ * Set to `true` to show a password prompt that will not show the typed value.
+ */
+ password?: boolean;
+
+ /**
+ * Set to `true` to keep the input box open when focus moves to another part of the editor or to another window.
+ */
+ ignoreFocusOut?: boolean;
+
+ /**
+ * An optional function that will be called to validate input and to give a hint
+ * to the user.
+ *
+ * @param value The current value of the input box.
+ * @return A human readable string which is presented as diagnostic message.
+ * Return `undefined`, `null`, or the empty string when 'value' is valid.
+ */
+ validateInput?(value: string): string | undefined | null | Thenable;
+ }
+
+ /**
+ * A relative pattern is a helper to construct glob patterns that are matched
+ * relatively to a base path. The base path can either be an absolute file path
+ * or a [workspace folder](#WorkspaceFolder).
+ */
+ export class RelativePattern {
+
+ /**
+ * A base file path to which this pattern will be matched against relatively.
+ */
+ base: string;
+
+ /**
+ * A file glob pattern like `*.{ts,js}` that will be matched on file paths
+ * relative to the base path.
+ *
+ * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`,
+ * the file glob pattern will match on `index.js`.
+ */
+ pattern: string;
+
+ /**
+ * Creates a new relative pattern object with a base path and pattern to match. This pattern
+ * will be matched on file paths relative to the base path.
+ *
+ * @param base A base file path to which this pattern will be matched against relatively.
+ * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on file paths
+ * relative to the base path.
+ */
+ constructor(base: WorkspaceFolder | string, pattern: string)
+ }
+
+ /**
+ * A file glob pattern to match file paths against. This can either be a glob pattern string
+ * (like `**/*.{ts,js}` or `*.{ts,js}`) or a [relative pattern](#RelativePattern).
+ *
+ * Glob patterns can have the following syntax:
+ * * `*` to match one or more characters in a path segment
+ * * `?` to match on one character in a path segment
+ * * `**` to match any number of path segments, including none
+ * * `{}` to group conditions (e.g. `**/*.{ts,js}` matches all TypeScript and JavaScript files)
+ * * `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * * `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+ *
+ * Note: a backslash (`\`) is not valid within a glob pattern. If you have an existing file
+ * path to match against, consider to use the [relative pattern](#RelativePattern) support
+ * that takes care of converting any backslash into slash. Otherwise, make sure to convert
+ * any backslash to slash when creating the glob pattern.
+ */
+ export type GlobPattern = string | RelativePattern;
+
+ /**
+ * A document filter denotes a document by different properties like
+ * the [language](#TextDocument.languageId), the [scheme](#Uri.scheme) of
+ * its resource, or a glob-pattern that is applied to the [path](#TextDocument.fileName).
+ *
+ * @sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }`
+ * @sample A language filter that applies to all package.json paths: `{ language: 'json', scheme: 'untitled', pattern: '**/package.json' }`
+ */
+ export interface DocumentFilter {
+
+ /**
+ * A language id, like `typescript`.
+ */
+ language?: string;
+
+ /**
+ * A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+ */
+ scheme?: string;
+
+ /**
+ * A [glob pattern](#GlobPattern) that is matched on the absolute path of the document. Use a [relative pattern](#RelativePattern)
+ * to filter documents to a [workspace folder](#WorkspaceFolder).
+ */
+ pattern?: GlobPattern;
+ }
+
+ /**
+ * A language selector is the combination of one or many language identifiers
+ * and [language filters](#DocumentFilter).
+ *
+ * *Note* that a document selector that is just a language identifier selects *all*
+ * documents, even those that are not saved on disk. Only use such selectors when
+ * a feature works without further context, e.g. without the need to resolve related
+ * 'files'.
+ *
+ * @sample `let sel:DocumentSelector = { scheme: 'file', language: 'typescript' }`;
+ */
+ export type DocumentSelector = DocumentFilter | string | Array;
+
+ /**
+ * A provider result represents the values a provider, like the [`HoverProvider`](#HoverProvider),
+ * may return. For once this is the actual result type `T`, like `Hover`, or a thenable that resolves
+ * to that type `T`. In addition, `null` and `undefined` can be returned - either directly or from a
+ * thenable.
+ *
+ * The snippets below are all valid implementations of the [`HoverProvider`](#HoverProvider):
+ *
+ * ```ts
+ * let a: HoverProvider = {
+ * provideHover(doc, pos, token): ProviderResult {
+ * return new Hover('Hello World');
+ * }
+ * }
+ *
+ * let b: HoverProvider = {
+ * provideHover(doc, pos, token): ProviderResult {
+ * return new Promise(resolve => {
+ * resolve(new Hover('Hello World'));
+ * });
+ * }
+ * }
+ *
+ * let c: HoverProvider = {
+ * provideHover(doc, pos, token): ProviderResult {
+ * return; // undefined
+ * }
+ * }
+ * ```
+ */
+ export type ProviderResult = T | undefined | null | Thenable;
+
+ /**
+ * Kind of a code action.
+ *
+ * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`.
+ *
+ * Code action kinds are used by VS Code for UI elements such as the refactoring context menu. Users
+ * can also trigger code actions with a specific kind with the `editor.action.codeAction` command.
+ */
+ export class CodeActionKind {
+ /**
+ * Empty kind.
+ */
+ static readonly Empty: CodeActionKind;
+
+ /**
+ * Base kind for quickfix actions: `quickfix`.
+ *
+ * Quick fix actions address a problem in the code and are shown in the normal code action context menu.
+ */
+ static readonly QuickFix: CodeActionKind;
+
+ /**
+ * Base kind for refactoring actions: `refactor`
+ *
+ * Refactoring actions are shown in the refactoring context menu.
+ */
+ static readonly Refactor: CodeActionKind;
+
+ /**
+ * Base kind for refactoring extraction actions: `refactor.extract`
+ *
+ * Example extract actions:
+ *
+ * - Extract method
+ * - Extract function
+ * - Extract variable
+ * - Extract interface from class
+ * - ...
+ */
+ static readonly RefactorExtract: CodeActionKind;
+
+ /**
+ * Base kind for refactoring inline actions: `refactor.inline`
+ *
+ * Example inline actions:
+ *
+ * - Inline function
+ * - Inline variable
+ * - Inline constant
+ * - ...
+ */
+ static readonly RefactorInline: CodeActionKind;
+
+ /**
+ * Base kind for refactoring rewrite actions: `refactor.rewrite`
+ *
+ * Example rewrite actions:
+ *
+ * - Convert JavaScript function to class
+ * - Add or remove parameter
+ * - Encapsulate field
+ * - Make method static
+ * - Move method to base class
+ * - ...
+ */
+ static readonly RefactorRewrite: CodeActionKind;
+
+ /**
+ * Base kind for source actions: `source`
+ *
+ * Source code actions apply to the entire file and can be run on save
+ * using `editor.codeActionsOnSave`. They also are shown in `source` context menu.
+ */
+ static readonly Source: CodeActionKind;
+
+ /**
+ * Base kind for an organize imports source action: `source.organizeImports`.
+ */
+ static readonly SourceOrganizeImports: CodeActionKind;
+
+ /**
+ * Base kind for auto-fix source actions: `source.fixAll`.
+ *
+ * Fix all actions automatically fix errors that have a clear fix that do not require user input.
+ * They should not suppress errors or perform unsafe fixes such as generating new types or classes.
+ */
+ static readonly SourceFixAll: CodeActionKind;
+
+ private constructor(value: string);
+
+ /**
+ * String value of the kind, e.g. `"refactor.extract.function"`.
+ */
+ readonly value: string;
+
+ /**
+ * Create a new kind by appending a more specific selector to the current kind.
+ *
+ * Does not modify the current kind.
+ */
+ append(parts: string): CodeActionKind;
+
+ /**
+ * Checks if this code action kind intersects `other`.
+ *
+ * The kind `"refactor.extract"` for example intersects `refactor`, `"refactor.extract"` and ``"refactor.extract.function"`,
+ * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"`.
+ *
+ * @param other Kind to check.
+ */
+ intersects(other: CodeActionKind): boolean;
+
+ /**
+ * Checks if `other` is a sub-kind of this `CodeActionKind`.
+ *
+ * The kind `"refactor.extract"` for example contains `"refactor.extract"` and ``"refactor.extract.function"`,
+ * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"` or `refactor`.
+ *
+ * @param other Kind to check.
+ */
+ contains(other: CodeActionKind): boolean;
+ }
+
+ /**
+ * Contains additional diagnostic information about the context in which
+ * a [code action](#CodeActionProvider.provideCodeActions) is run.
+ */
+ export interface CodeActionContext {
+ /**
+ * An array of diagnostics.
+ */
+ readonly diagnostics: ReadonlyArray;
+
+ /**
+ * Requested kind of actions to return.
+ *
+ * Actions not of this kind are filtered out before being shown by the lightbulb.
+ */
+ readonly only?: CodeActionKind;
+ }
+
+ /**
+ * A code action represents a change that can be performed in code, e.g. to fix a problem or
+ * to refactor code.
+ *
+ * A CodeAction must set either [`edit`](#CodeAction.edit) and/or a [`command`](#CodeAction.command). If both are supplied, the `edit` is applied first, then the command is executed.
+ */
+ export class CodeAction {
+
+ /**
+ * A short, human-readable, title for this code action.
+ */
+ title: string;
+
+ /**
+ * A [workspace edit](#WorkspaceEdit) this code action performs.
+ */
+ edit?: WorkspaceEdit;
+
+ /**
+ * [Diagnostics](#Diagnostic) that this code action resolves.
+ */
+ diagnostics?: Diagnostic[];
+
+ /**
+ * A [command](#Command) this code action executes.
+ */
+ command?: Command;
+
+ /**
+ * [Kind](#CodeActionKind) of the code action.
+ *
+ * Used to filter code actions.
+ */
+ kind?: CodeActionKind;
+
+ /**
+ * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
+ * by keybindings.
+ *
+ * A quick fix should be marked preferred if it properly addresses the underlying error.
+ * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+ */
+ isPreferred?: boolean;
+
+ /**
+ * Creates a new code action.
+ *
+ * A code action must have at least a [title](#CodeAction.title) and [edits](#CodeAction.edit)
+ * and/or a [command](#CodeAction.command).
+ *
+ * @param title The title of the code action.
+ * @param kind The kind of the code action.
+ */
+ constructor(title: string, kind?: CodeActionKind);
+ }
+
+ /**
+ * The code action interface defines the contract between extensions and
+ * the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature.
+ *
+ * A code action can be any command that is [known](#commands.getCommands) to the system.
+ */
+ export interface CodeActionProvider {
+ /**
+ * Provide commands for the given document and range.
+ *
+ * @param document The document in which the command was invoked.
+ * @param range The selector or range for which the command was invoked. This will always be a selection if
+ * there is a currently active editor.
+ * @param context Context carrying additional information.
+ * @param token A cancellation token.
+ * @return An array of commands, quick fixes, or refactorings or a thenable of such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideCodeActions(document: TextDocument, range: Range | Selection, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | CodeAction)[]>;
+ }
+
+ /**
+ * Metadata about the type of code actions that a [CodeActionProvider](#CodeActionProvider) providers
+ */
+ export interface CodeActionProviderMetadata {
+ /**
+ * [CodeActionKinds](#CodeActionKind) that this provider may return.
+ *
+ * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the provider
+ * may list our every specific kind they provide, such as `CodeActionKind.Refactor.Extract.append('function`)`
+ */
+ readonly providedCodeActionKinds?: ReadonlyArray;
+ }
+
+ /**
+ * A code lens represents a [command](#Command) that should be shown along with
+ * source text, like the number of references, a way to run tests, etc.
+ *
+ * A code lens is _unresolved_ when no command is associated to it. For performance
+ * reasons the creation of a code lens and resolving should be done to two stages.
+ *
+ * @see [CodeLensProvider.provideCodeLenses](#CodeLensProvider.provideCodeLenses)
+ * @see [CodeLensProvider.resolveCodeLens](#CodeLensProvider.resolveCodeLens)
+ */
+ export class CodeLens {
+
+ /**
+ * The range in which this code lens is valid. Should only span a single line.
+ */
+ range: Range;
+
+ /**
+ * The command this code lens represents.
+ */
+ command?: Command;
+
+ /**
+ * `true` when there is a command associated.
+ */
+ readonly isResolved: boolean;
+
+ /**
+ * Creates a new code lens object.
+ *
+ * @param range The range to which this code lens applies.
+ * @param command The command associated to this code lens.
+ */
+ constructor(range: Range, command?: Command);
+ }
+
+ /**
+ * A code lens provider adds [commands](#Command) to source text. The commands will be shown
+ * as dedicated horizontal lines in between the source text.
+ */
+ export interface CodeLensProvider {
+
+ /**
+ * An optional event to signal that the code lenses from this provider have changed.
+ */
+ onDidChangeCodeLenses?: Event;
+
+ /**
+ * Compute a list of [lenses](#CodeLens). This call should return as fast as possible and if
+ * computing the commands is expensive implementors should only return code lens objects with the
+ * range set and implement [resolve](#CodeLensProvider.resolveCodeLens).
+ *
+ * @param document The document in which the command was invoked.
+ * @param token A cancellation token.
+ * @return An array of code lenses or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult;
+
+ /**
+ * This function will be called for each visible code lens, usually when scrolling and after
+ * calls to [compute](#CodeLensProvider.provideCodeLenses)-lenses.
+ *
+ * @param codeLens code lens that must be resolved.
+ * @param token A cancellation token.
+ * @return The given, resolved code lens or thenable that resolves to such.
+ */
+ resolveCodeLens?(codeLens: CodeLens, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Information about where a symbol is defined.
+ *
+ * Provides additional metadata over normal [location](#Location) definitions, including the range of
+ * the defining symbol
+ */
+ export type DefinitionLink = LocationLink;
+
+ /**
+ * The definition of a symbol represented as one or many [locations](#Location).
+ * For most programming languages there is only one location at which a symbol is
+ * defined.
+ */
+ export type Definition = Location | Location[];
+
+ /**
+ * The definition provider interface defines the contract between extensions and
+ * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition)
+ * and peek definition features.
+ */
+ export interface DefinitionProvider {
+
+ /**
+ * Provide the definition of the symbol at the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return A definition or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The implementation provider interface defines the contract between extensions and
+ * the go to implementation feature.
+ */
+ export interface ImplementationProvider {
+
+ /**
+ * Provide the implementations of the symbol at the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return A definition or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideImplementation(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The type definition provider defines the contract between extensions and
+ * the go to type definition feature.
+ */
+ export interface TypeDefinitionProvider {
+
+ /**
+ * Provide the type definition of the symbol at the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return A definition or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideTypeDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The declaration of a symbol representation as one or many [locations](#Location)
+ * or [location links][#LocationLink].
+ */
+ export type Declaration = Location | Location[] | LocationLink[];
+
+ /**
+ * The declaration provider interface defines the contract between extensions and
+ * the go to declaration feature.
+ */
+ export interface DeclarationProvider {
+
+ /**
+ * Provide the declaration of the symbol at the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return A declaration or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideDeclaration(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The MarkdownString represents human readable text that supports formatting via the
+ * markdown syntax. Standard markdown is supported, also tables, but no embedded html.
+ */
+ export class MarkdownString {
+
+ /**
+ * The markdown string.
+ */
+ value: string;
+
+ /**
+ * Indicates that this markdown string is from a trusted source. Only *trusted*
+ * markdown supports links that execute commands, e.g. `[Run it](command:myCommandId)`.
+ */
+ isTrusted?: boolean;
+
+ /**
+ * Creates a new markdown string with the given value.
+ *
+ * @param value Optional, initial value.
+ */
+ constructor(value?: string);
+
+ /**
+ * Appends and escapes the given string to this markdown string.
+ * @param value Plain text.
+ */
+ appendText(value: string): MarkdownString;
+
+ /**
+ * Appends the given string 'as is' to this markdown string.
+ * @param value Markdown string.
+ */
+ appendMarkdown(value: string): MarkdownString;
+
+ /**
+ * Appends the given string as codeblock using the provided language.
+ * @param value A code snippet.
+ * @param language An optional [language identifier](#languages.getLanguages).
+ */
+ appendCodeblock(value: string, language?: string): MarkdownString;
+ }
+
+ /**
+ * ~~MarkedString can be used to render human readable text. It is either a markdown string
+ * or a code-block that provides a language and a code snippet. Note that
+ * markdown strings will be sanitized - that means html will be escaped.~~
+ *
+ * @deprecated This type is deprecated, please use [`MarkdownString`](#MarkdownString) instead.
+ */
+ export type MarkedString = MarkdownString | string | { language: string; value: string };
+
+ /**
+ * A hover represents additional information for a symbol or word. Hovers are
+ * rendered in a tooltip-like widget.
+ */
+ export class Hover {
+
+ /**
+ * The contents of this hover.
+ */
+ contents: MarkedString[];
+
+ /**
+ * The range to which this hover applies. When missing, the
+ * editor will use the range at the current position or the
+ * current position itself.
+ */
+ range?: Range;
+
+ /**
+ * Creates a new hover object.
+ *
+ * @param contents The contents of the hover.
+ * @param range The range to which the hover applies.
+ */
+ constructor(contents: MarkedString | MarkedString[], range?: Range);
+ }
+
+ /**
+ * The hover provider interface defines the contract between extensions and
+ * the [hover](https://code.visualstudio.com/docs/editor/intellisense)-feature.
+ */
+ export interface HoverProvider {
+
+ /**
+ * Provide a hover for the given position and document. Multiple hovers at the same
+ * position will be merged by the editor. A hover can have a range which defaults
+ * to the word range at the position when omitted.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return A hover or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A document highlight kind.
+ */
+ export enum DocumentHighlightKind {
+
+ /**
+ * A textual occurrence.
+ */
+ Text = 0,
+
+ /**
+ * Read-access of a symbol, like reading a variable.
+ */
+ Read = 1,
+
+ /**
+ * Write-access of a symbol, like writing to a variable.
+ */
+ Write = 2
+ }
+
+ /**
+ * A document highlight is a range inside a text document which deserves
+ * special attention. Usually a document highlight is visualized by changing
+ * the background color of its range.
+ */
+ export class DocumentHighlight {
+
+ /**
+ * The range this highlight applies to.
+ */
+ range: Range;
+
+ /**
+ * The highlight kind, default is [text](#DocumentHighlightKind.Text).
+ */
+ kind?: DocumentHighlightKind;
+
+ /**
+ * Creates a new document highlight object.
+ *
+ * @param range The range the highlight applies to.
+ * @param kind The highlight kind, default is [text](#DocumentHighlightKind.Text).
+ */
+ constructor(range: Range, kind?: DocumentHighlightKind);
+ }
+
+ /**
+ * The document highlight provider interface defines the contract between extensions and
+ * the word-highlight-feature.
+ */
+ export interface DocumentHighlightProvider {
+
+ /**
+ * Provide a set of document highlights, like all occurrences of a variable or
+ * all exit-points of a function.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentHighlights(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A symbol kind.
+ */
+ export enum SymbolKind {
+ File = 0,
+ Module = 1,
+ Namespace = 2,
+ Package = 3,
+ Class = 4,
+ Method = 5,
+ Property = 6,
+ Field = 7,
+ Constructor = 8,
+ Enum = 9,
+ Interface = 10,
+ Function = 11,
+ Variable = 12,
+ Constant = 13,
+ String = 14,
+ Number = 15,
+ Boolean = 16,
+ Array = 17,
+ Object = 18,
+ Key = 19,
+ Null = 20,
+ EnumMember = 21,
+ Struct = 22,
+ Event = 23,
+ Operator = 24,
+ TypeParameter = 25
+ }
+
+ /**
+ * Represents information about programming constructs like variables, classes,
+ * interfaces etc.
+ */
+ export class SymbolInformation {
+
+ /**
+ * The name of this symbol.
+ */
+ name: string;
+
+ /**
+ * The name of the symbol containing this symbol.
+ */
+ containerName: string;
+
+ /**
+ * The kind of this symbol.
+ */
+ kind: SymbolKind;
+
+ /**
+ * The location of this symbol.
+ */
+ location: Location;
+
+ /**
+ * Creates a new symbol information object.
+ *
+ * @param name The name of the symbol.
+ * @param kind The kind of the symbol.
+ * @param containerName The name of the symbol containing the symbol.
+ * @param location The location of the symbol.
+ */
+ constructor(name: string, kind: SymbolKind, containerName: string, location: Location);
+
+ /**
+ * ~~Creates a new symbol information object.~~
+ *
+ * @deprecated Please use the constructor taking a [location](#Location) object.
+ *
+ * @param name The name of the symbol.
+ * @param kind The kind of the symbol.
+ * @param range The range of the location of the symbol.
+ * @param uri The resource of the location of symbol, defaults to the current document.
+ * @param containerName The name of the symbol containing the symbol.
+ */
+ constructor(name: string, kind: SymbolKind, range: Range, uri?: Uri, containerName?: string);
+ }
+
+ /**
+ * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document
+ * symbols can be hierarchical and they have two ranges: one that encloses its definition and one that points to
+ * its most interesting range, e.g. the range of an identifier.
+ */
+ export class DocumentSymbol {
+
+ /**
+ * The name of this symbol.
+ */
+ name: string;
+
+ /**
+ * More detail for this symbol, e.g. the signature of a function.
+ */
+ detail: string;
+
+ /**
+ * The kind of this symbol.
+ */
+ kind: SymbolKind;
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code.
+ */
+ range: Range;
+
+ /**
+ * The range that should be selected and reveal when this symbol is being picked, e.g. the name of a function.
+ * Must be contained by the [`range`](#DocumentSymbol.range).
+ */
+ selectionRange: Range;
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ children: DocumentSymbol[];
+
+ /**
+ * Creates a new document symbol.
+ *
+ * @param name The name of the symbol.
+ * @param detail Details for the symbol.
+ * @param kind The kind of the symbol.
+ * @param range The full range of the symbol.
+ * @param selectionRange The range that should be reveal.
+ */
+ constructor(name: string, detail: string, kind: SymbolKind, range: Range, selectionRange: Range);
+ }
+
+ /**
+ * The document symbol provider interface defines the contract between extensions and
+ * the [go to symbol](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-symbol)-feature.
+ */
+ export interface DocumentSymbolProvider {
+
+ /**
+ * Provide symbol information for the given document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param token A cancellation token.
+ * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Metadata about a document symbol provider.
+ */
+ export interface DocumentSymbolProviderMetadata {
+ /**
+ * A human readable string that is shown when multiple outlines trees show for one document.
+ */
+ label?: string;
+ }
+
+ /**
+ * The workspace symbol provider interface defines the contract between extensions and
+ * the [symbol search](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name)-feature.
+ */
+ export interface WorkspaceSymbolProvider {
+
+ /**
+ * Project-wide search for a symbol matching the given query string.
+ *
+ * The `query`-parameter should be interpreted in a *relaxed way* as the editor will apply its own highlighting
+ * and scoring on the results. A good rule of thumb is to match case-insensitive and to simply check that the
+ * characters of *query* appear in their order in a candidate symbol. Don't use prefix, substring, or similar
+ * strict matching.
+ *
+ * To improve performance implementors can implement `resolveWorkspaceSymbol` and then provide symbols with partial
+ * [location](#SymbolInformation.location)-objects, without a `range` defined. The editor will then call
+ * `resolveWorkspaceSymbol` for selected symbols only, e.g. when opening a workspace symbol.
+ *
+ * @param query A query string, can be the empty string in which case all symbols should be returned.
+ * @param token A cancellation token.
+ * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideWorkspaceSymbols(query: string, token: CancellationToken): ProviderResult;
+
+ /**
+ * Given a symbol fill in its [location](#SymbolInformation.location). This method is called whenever a symbol
+ * is selected in the UI. Providers can implement this method and return incomplete symbols from
+ * [`provideWorkspaceSymbols`](#WorkspaceSymbolProvider.provideWorkspaceSymbols) which often helps to improve
+ * performance.
+ *
+ * @param symbol The symbol that is to be resolved. Guaranteed to be an instance of an object returned from an
+ * earlier call to `provideWorkspaceSymbols`.
+ * @param token A cancellation token.
+ * @return The resolved symbol or a thenable that resolves to that. When no result is returned,
+ * the given `symbol` is used.
+ */
+ resolveWorkspaceSymbol?(symbol: SymbolInformation, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Value-object that contains additional information when
+ * requesting references.
+ */
+ export interface ReferenceContext {
+
+ /**
+ * Include the declaration of the current symbol.
+ */
+ includeDeclaration: boolean;
+ }
+
+ /**
+ * The reference provider interface defines the contract between extensions and
+ * the [find references](https://code.visualstudio.com/docs/editor/editingevolved#_peek)-feature.
+ */
+ export interface ReferenceProvider {
+
+ /**
+ * Provide a set of project-wide references for the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ *
+ * @return An array of locations or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A text edit represents edits that should be applied
+ * to a document.
+ */
+ export class TextEdit {
+
+ /**
+ * Utility to create a replace edit.
+ *
+ * @param range A range.
+ * @param newText A string.
+ * @return A new text edit object.
+ */
+ static replace(range: Range, newText: string): TextEdit;
+
+ /**
+ * Utility to create an insert edit.
+ *
+ * @param position A position, will become an empty range.
+ * @param newText A string.
+ * @return A new text edit object.
+ */
+ static insert(position: Position, newText: string): TextEdit;
+
+ /**
+ * Utility to create a delete edit.
+ *
+ * @param range A range.
+ * @return A new text edit object.
+ */
+ static delete(range: Range): TextEdit;
+
+ /**
+ * Utility to create an eol-edit.
+ *
+ * @param eol An eol-sequence
+ * @return A new text edit object.
+ */
+ static setEndOfLine(eol: EndOfLine): TextEdit;
+
+ /**
+ * The range this edit applies to.
+ */
+ range: Range;
+
+ /**
+ * The string this edit will insert.
+ */
+ newText: string;
+
+ /**
+ * The eol-sequence used in the document.
+ *
+ * *Note* that the eol-sequence will be applied to the
+ * whole document.
+ */
+ newEol: EndOfLine;
+
+ /**
+ * Create a new TextEdit.
+ *
+ * @param range A range.
+ * @param newText A string.
+ */
+ constructor(range: Range, newText: string);
+ }
+
+ /**
+ * A workspace edit is a collection of textual and files changes for
+ * multiple resources and documents.
+ *
+ * Use the [applyEdit](#workspace.applyEdit)-function to apply a workspace edit.
+ */
+ export class WorkspaceEdit {
+
+ /**
+ * The number of affected resources of textual or resource changes.
+ */
+ readonly size: number;
+
+ /**
+ * Replace the given range with given text for the given resource.
+ *
+ * @param uri A resource identifier.
+ * @param range A range.
+ * @param newText A string.
+ */
+ replace(uri: Uri, range: Range, newText: string): void;
+
+ /**
+ * Insert the given text at the given position.
+ *
+ * @param uri A resource identifier.
+ * @param position A position.
+ * @param newText A string.
+ */
+ insert(uri: Uri, position: Position, newText: string): void;
+
+ /**
+ * Delete the text at the given range.
+ *
+ * @param uri A resource identifier.
+ * @param range A range.
+ */
+ delete(uri: Uri, range: Range): void;
+
+ /**
+ * Check if a text edit for a resource exists.
+ *
+ * @param uri A resource identifier.
+ * @return `true` if the given resource will be touched by this edit.
+ */
+ has(uri: Uri): boolean;
+
+ /**
+ * Set (and replace) text edits for a resource.
+ *
+ * @param uri A resource identifier.
+ * @param edits An array of text edits.
+ */
+ set(uri: Uri, edits: TextEdit[]): void;
+
+ /**
+ * Get the text edits for a resource.
+ *
+ * @param uri A resource identifier.
+ * @return An array of text edits.
+ */
+ get(uri: Uri): TextEdit[];
+
+ /**
+ * Create a regular file.
+ *
+ * @param uri Uri of the new file..
+ * @param options Defines if an existing file should be overwritten or be
+ * ignored. When overwrite and ignoreIfExists are both set overwrite wins.
+ */
+ createFile(uri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }): void;
+
+ /**
+ * Delete a file or folder.
+ *
+ * @param uri The uri of the file that is to be deleted.
+ */
+ deleteFile(uri: Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean }): void;
+
+ /**
+ * Rename a file or folder.
+ *
+ * @param oldUri The existing file.
+ * @param newUri The new location.
+ * @param options Defines if existing files should be overwritten or be
+ * ignored. When overwrite and ignoreIfExists are both set overwrite wins.
+ */
+ renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }): void;
+
+
+ /**
+ * Get all text edits grouped by resource.
+ *
+ * @return A shallow copy of `[Uri, TextEdit[]]`-tuples.
+ */
+ entries(): [Uri, TextEdit[]][];
+ }
+
+ /**
+ * A snippet string is a template which allows to insert text
+ * and to control the editor cursor when insertion happens.
+ *
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Variables are defined with `$name` and
+ * `${name:default value}`. The full snippet syntax is documented
+ * [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets).
+ */
+ export class SnippetString {
+
+ /**
+ * The snippet string.
+ */
+ value: string;
+
+ constructor(value?: string);
+
+ /**
+ * Builder-function that appends the given string to
+ * the [`value`](#SnippetString.value) of this snippet string.
+ *
+ * @param string A value to append 'as given'. The string will be escaped.
+ * @return This snippet string.
+ */
+ appendText(string: string): SnippetString;
+
+ /**
+ * Builder-function that appends a tabstop (`$1`, `$2` etc) to
+ * the [`value`](#SnippetString.value) of this snippet string.
+ *
+ * @param number The number of this tabstop, defaults to an auto-increment
+ * value starting at 1.
+ * @return This snippet string.
+ */
+ appendTabstop(number?: number): SnippetString;
+
+ /**
+ * Builder-function that appends a placeholder (`${1:value}`) to
+ * the [`value`](#SnippetString.value) of this snippet string.
+ *
+ * @param value The value of this placeholder - either a string or a function
+ * with which a nested snippet can be created.
+ * @param number The number of this tabstop, defaults to an auto-increment
+ * value starting at 1.
+ * @return This snippet string.
+ */
+ appendPlaceholder(value: string | ((snippet: SnippetString) => any), number?: number): SnippetString;
+
+ /**
+ * Builder-function that appends a variable (`${VAR}`) to
+ * the [`value`](#SnippetString.value) of this snippet string.
+ *
+ * @param name The name of the variable - excluding the `$`.
+ * @param defaultValue The default value which is used when the variable name cannot
+ * be resolved - either a string or a function with which a nested snippet can be created.
+ * @return This snippet string.
+ */
+ appendVariable(name: string, defaultValue: string | ((snippet: SnippetString) => any)): SnippetString;
+ }
+
+ /**
+ * The rename provider interface defines the contract between extensions and
+ * the [rename](https://code.visualstudio.com/docs/editor/editingevolved#_rename-symbol)-feature.
+ */
+ export interface RenameProvider {
+
+ /**
+ * Provide an edit that describes changes that have to be made to one
+ * or many resources to rename a symbol to a different name.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param newName The new name of the symbol. If the given name is not valid, the provider must return a rejected promise.
+ * @param token A cancellation token.
+ * @return A workspace edit or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideRenameEdits(document: TextDocument, position: Position, newName: string, token: CancellationToken): ProviderResult;
+
+ /**
+ * Optional function for resolving and validating a position *before* running rename. The result can
+ * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol
+ * which is being renamed - when omitted the text in the returned range is used.
+ *
+ * @param document The document in which rename will be invoked.
+ * @param position The position at which rename will be invoked.
+ * @param token A cancellation token.
+ * @return The range or range and placeholder text of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`.
+ */
+ prepareRename?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Value-object describing what options formatting should use.
+ */
+ export interface FormattingOptions {
+
+ /**
+ * Size of a tab in spaces.
+ */
+ tabSize: number;
+
+ /**
+ * Prefer spaces over tabs.
+ */
+ insertSpaces: boolean;
+
+ /**
+ * Signature for further properties.
+ */
+ [key: string]: boolean | number | string;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface DocumentFormattingEditProvider {
+
+ /**
+ * Provide formatting edits for a whole document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param options Options controlling formatting.
+ * @param token A cancellation token.
+ * @return A set of text edits or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentFormattingEdits(document: TextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface DocumentRangeFormattingEditProvider {
+
+ /**
+ * Provide formatting edits for a range in a document.
+ *
+ * The given range is a hint and providers can decide to format a smaller
+ * or larger range. Often this is done by adjusting the start and end
+ * of the range to full syntax nodes.
+ *
+ * @param document The document in which the command was invoked.
+ * @param range The range which should be formatted.
+ * @param options Options controlling formatting.
+ * @param token A cancellation token.
+ * @return A set of text edits or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface OnTypeFormattingEditProvider {
+
+ /**
+ * Provide formatting edits after a character has been typed.
+ *
+ * The given position and character should hint to the provider
+ * what range the position to expand to, like find the matching `{`
+ * when `}` has been entered.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param ch The character that has been typed.
+ * @param options Options controlling formatting.
+ * @param token A cancellation token.
+ * @return A set of text edits or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideOnTypeFormattingEdits(document: TextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents a parameter of a callable-signature. A parameter can
+ * have a label and a doc-comment.
+ */
+ export class ParameterInformation {
+
+ /**
+ * The label of this signature.
+ *
+ * Either a string or inclusive start and exclusive end offsets within its containing
+ * [signature label](#SignatureInformation.label). *Note*: A label of type string must be
+ * a substring of its containing signature information's [label](#SignatureInformation.label).
+ */
+ label: string | [number, number];
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown
+ * in the UI but can be omitted.
+ */
+ documentation?: string | MarkdownString;
+
+ /**
+ * Creates a new parameter information object.
+ *
+ * @param label A label string or inclusive start and exclusive end offsets within its containing signature label.
+ * @param documentation A doc string.
+ */
+ constructor(label: string | [number, number], documentation?: string | MarkdownString);
+ }
+
+ /**
+ * Represents the signature of something callable. A signature
+ * can have a label, like a function-name, a doc-comment, and
+ * a set of parameters.
+ */
+ export class SignatureInformation {
+
+ /**
+ * The label of this signature. Will be shown in
+ * the UI.
+ */
+ label: string;
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown
+ * in the UI but can be omitted.
+ */
+ documentation?: string | MarkdownString;
+
+ /**
+ * The parameters of this signature.
+ */
+ parameters: ParameterInformation[];
+
+ /**
+ * Creates a new signature information object.
+ *
+ * @param label A label string.
+ * @param documentation A doc string.
+ */
+ constructor(label: string, documentation?: string | MarkdownString);
+ }
+
+ /**
+ * Signature help represents the signature of something
+ * callable. There can be multiple signatures but only one
+ * active and only one active parameter.
+ */
+ export class SignatureHelp {
+
+ /**
+ * One or more signatures.
+ */
+ signatures: SignatureInformation[];
+
+ /**
+ * The active signature.
+ */
+ activeSignature: number;
+
+ /**
+ * The active parameter of the active signature.
+ */
+ activeParameter: number;
+ }
+
+ /**
+ * How a [`SignatureHelpProvider`](#SignatureHelpProvider) was triggered.
+ */
+ export enum SignatureHelpTriggerKind {
+ /**
+ * Signature help was invoked manually by the user or by a command.
+ */
+ Invoke = 1,
+
+ /**
+ * Signature help was triggered by a trigger character.
+ */
+ TriggerCharacter = 2,
+
+ /**
+ * Signature help was triggered by the cursor moving or by the document content changing.
+ */
+ ContentChange = 3,
+ }
+
+ /**
+ * Additional information about the context in which a
+ * [`SignatureHelpProvider`](#SignatureHelpProvider.provideSignatureHelp) was triggered.
+ */
+ export interface SignatureHelpContext {
+ /**
+ * Action that caused signature help to be triggered.
+ */
+ readonly triggerKind: SignatureHelpTriggerKind;
+
+ /**
+ * Character that caused signature help to be triggered.
+ *
+ * This is `undefined` when signature help is not triggered by typing, such as when manually invoking
+ * signature help or when moving the cursor.
+ */
+ readonly triggerCharacter?: string;
+
+ /**
+ * `true` if signature help was already showing when it was triggered.
+ *
+ * Retriggers occur when the signature help is already active and can be caused by actions such as
+ * typing a trigger character, a cursor move, or document content changes.
+ */
+ readonly isRetrigger: boolean;
+
+ /**
+ * The currently active [`SignatureHelp`](#SignatureHelp).
+ *
+ * The `activeSignatureHelp` has its [`SignatureHelp.activeSignature`] field updated based on
+ * the user arrowing through available signatures.
+ */
+ readonly activeSignatureHelp?: SignatureHelp;
+ }
+
+ /**
+ * The signature help provider interface defines the contract between extensions and
+ * the [parameter hints](https://code.visualstudio.com/docs/editor/intellisense)-feature.
+ */
+ export interface SignatureHelpProvider {
+
+ /**
+ * Provide help for the signature at the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @param context Information about how signature help was triggered.
+ *
+ * @return Signature help or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult;
+ }
+
+ /**
+ * Metadata about a registered [`SignatureHelpProvider`](#SignatureHelpProvider).
+ */
+ export interface SignatureHelpProviderMetadata {
+ /**
+ * List of characters that trigger signature help.
+ */
+ readonly triggerCharacters: ReadonlyArray;
+
+ /**
+ * List of characters that re-trigger signature help.
+ *
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ */
+ readonly retriggerCharacters: ReadonlyArray;
+ }
+
+ /**
+ * Completion item kinds.
+ */
+ export enum CompletionItemKind {
+ Text = 0,
+ Method = 1,
+ Function = 2,
+ Constructor = 3,
+ Field = 4,
+ Variable = 5,
+ Class = 6,
+ Interface = 7,
+ Module = 8,
+ Property = 9,
+ Unit = 10,
+ Value = 11,
+ Enum = 12,
+ Keyword = 13,
+ Snippet = 14,
+ Color = 15,
+ Reference = 17,
+ File = 16,
+ Folder = 18,
+ EnumMember = 19,
+ Constant = 20,
+ Struct = 21,
+ Event = 22,
+ Operator = 23,
+ TypeParameter = 24
+ }
+
+ /**
+ * A completion item represents a text snippet that is proposed to complete text that is being typed.
+ *
+ * It is sufficient to create a completion item from just a [label](#CompletionItem.label). In that
+ * case the completion item will replace the [word](#TextDocument.getWordRangeAtPosition)
+ * until the cursor with the given label or [insertText](#CompletionItem.insertText). Otherwise the
+ * given [edit](#CompletionItem.textEdit) is used.
+ *
+ * When selecting a completion item in the editor its defined or synthesized text edit will be applied
+ * to *all* cursors/selections whereas [additionalTextEdits](#CompletionItem.additionalTextEdits) will be
+ * applied as provided.
+ *
+ * @see [CompletionItemProvider.provideCompletionItems](#CompletionItemProvider.provideCompletionItems)
+ * @see [CompletionItemProvider.resolveCompletionItem](#CompletionItemProvider.resolveCompletionItem)
+ */
+ export class CompletionItem {
+
+ /**
+ * The label of this completion item. By default
+ * this is also the text that is inserted when selecting
+ * this completion.
+ */
+ label: string;
+
+ /**
+ * The kind of this completion item. Based on the kind
+ * an icon is chosen by the editor.
+ */
+ kind?: CompletionItemKind;
+
+ /**
+ * A human-readable string with additional information
+ * about this item, like type or symbol information.
+ */
+ detail?: string;
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ documentation?: string | MarkdownString;
+
+ /**
+ * A string that should be used when comparing this item
+ * with other items. When `falsy` the [label](#CompletionItem.label)
+ * is used.
+ */
+ sortText?: string;
+
+ /**
+ * A string that should be used when filtering a set of
+ * completion items. When `falsy` the [label](#CompletionItem.label)
+ * is used.
+ */
+ filterText?: string;
+
+ /**
+ * Select this item when showing. *Note* that only one completion item can be selected and
+ * that the editor decides which item that is. The rule is that the *first* item of those
+ * that match best is selected.
+ */
+ preselect?: boolean;
+
+ /**
+ * A string or snippet that should be inserted in a document when selecting
+ * this completion. When `falsy` the [label](#CompletionItem.label)
+ * is used.
+ */
+ insertText?: string | SnippetString;
+
+ /**
+ * A range of text that should be replaced by this completion item.
+ *
+ * Defaults to a range from the start of the [current word](#TextDocument.getWordRangeAtPosition) to the
+ * current position.
+ *
+ * *Note:* The range must be a [single line](#Range.isSingleLine) and it must
+ * [contain](#Range.contains) the position at which completion has been [requested](#CompletionItemProvider.provideCompletionItems).
+ */
+ range?: Range;
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. *Note* that all commit characters should have `length=1` and that superfluous
+ * characters will be ignored.
+ */
+ commitCharacters?: string[];
+
+ /**
+ * Keep whitespace of the [insertText](#CompletionItem.insertText) as is. By default, the editor adjusts leading
+ * whitespace of new lines so that they match the indentation of the line for which the item is accepted - setting
+ * this to `true` will prevent that.
+ */
+ keepWhitespace?: boolean;
+
+ /**
+ * @deprecated Use `CompletionItem.insertText` and `CompletionItem.range` instead.
+ *
+ * ~~An [edit](#TextEdit) which is applied to a document when selecting
+ * this completion. When an edit is provided the value of
+ * [insertText](#CompletionItem.insertText) is ignored.~~
+ *
+ * ~~The [range](#Range) of the edit must be single-line and on the same
+ * line completions were [requested](#CompletionItemProvider.provideCompletionItems) at.~~
+ */
+ textEdit?: TextEdit;
+
+ /**
+ * An optional array of additional [text edits](#TextEdit) that are applied when
+ * selecting this completion. Edits must not overlap with the main [edit](#CompletionItem.textEdit)
+ * nor with themselves.
+ */
+ additionalTextEdits?: TextEdit[];
+
+ /**
+ * An optional [command](#Command) that is executed *after* inserting this completion. *Note* that
+ * additional modifications to the current document should be described with the
+ * [additionalTextEdits](#CompletionItem.additionalTextEdits)-property.
+ */
+ command?: Command;
+
+ /**
+ * Creates a new completion item.
+ *
+ * Completion items must have at least a [label](#CompletionItem.label) which then
+ * will be used as insert text as well as for sorting and filtering.
+ *
+ * @param label The label of the completion.
+ * @param kind The [kind](#CompletionItemKind) of the completion.
+ */
+ constructor(label: string, kind?: CompletionItemKind);
+ }
+
+ /**
+ * Represents a collection of [completion items](#CompletionItem) to be presented
+ * in the editor.
+ */
+ export class CompletionList {
+
+ /**
+ * This list is not complete. Further typing should result in recomputing
+ * this list.
+ */
+ isIncomplete?: boolean;
+
+ /**
+ * The completion items.
+ */
+ items: CompletionItem[];
+
+ /**
+ * Creates a new completion list.
+ *
+ * @param items The completion items.
+ * @param isIncomplete The list is not complete.
+ */
+ constructor(items?: CompletionItem[], isIncomplete?: boolean);
+ }
+
+ /**
+ * How a [completion provider](#CompletionItemProvider) was triggered
+ */
+ export enum CompletionTriggerKind {
+ /**
+ * Completion was triggered normally.
+ */
+ Invoke = 0,
+ /**
+ * Completion was triggered by a trigger character.
+ */
+ TriggerCharacter = 1,
+ /**
+ * Completion was re-triggered as current completion list is incomplete
+ */
+ TriggerForIncompleteCompletions = 2
+ }
+
+ /**
+ * Contains additional information about the context in which
+ * [completion provider](#CompletionItemProvider.provideCompletionItems) is triggered.
+ */
+ export interface CompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ readonly triggerKind: CompletionTriggerKind;
+
+ /**
+ * Character that triggered the completion item provider.
+ *
+ * `undefined` if provider was not triggered by a character.
+ *
+ * The trigger character is already in the document when the completion provider is triggered.
+ */
+ readonly triggerCharacter?: string;
+ }
+
+ /**
+ * The completion item provider interface defines the contract between extensions and
+ * [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense).
+ *
+ * Providers can delay the computation of the [`detail`](#CompletionItem.detail)
+ * and [`documentation`](#CompletionItem.documentation) properties by implementing the
+ * [`resolveCompletionItem`](#CompletionItemProvider.resolveCompletionItem)-function. However, properties that
+ * are needed for the initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and `range`, must
+ * not be changed during resolve.
+ *
+ * Providers are asked for completions either explicitly by a user gesture or -depending on the configuration-
+ * implicitly when typing words or trigger characters.
+ */
+ export interface CompletionItemProvider {
+
+ /**
+ * Provide completion items for the given position and document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param position The position at which the command was invoked.
+ * @param token A cancellation token.
+ * @param context How the completion was triggered.
+ *
+ * @return An array of completions, a [completion list](#CompletionList), or a thenable that resolves to either.
+ * The lack of a result can be signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult;
+
+ /**
+ * Given a completion item fill in more data, like [doc-comment](#CompletionItem.documentation)
+ * or [details](#CompletionItem.detail).
+ *
+ * The editor will only resolve a completion item once.
+ *
+ * *Note* that accepting a completion item will not wait for it to be resolved. Because of that [`insertText`](#CompletionItem.insertText),
+ * [`additionalTextEdits`](#CompletionItem.additionalTextEdits), and [`command`](#CompletionItem.command) should not
+ * be changed when resolving an item.
+ *
+ * @param item A completion item currently active in the UI.
+ * @param token A cancellation token.
+ * @return The resolved completion item or a thenable that resolves to of such. It is OK to return the given
+ * `item`. When no result is returned, the given `item` will be used.
+ */
+ resolveCompletionItem?(item: CompletionItem, token: CancellationToken): ProviderResult;
+ }
+
+
+ /**
+ * A document link is a range in a text document that links to an internal or external resource, like another
+ * text document or a web site.
+ */
+ export class DocumentLink {
+
+ /**
+ * The range this link applies to.
+ */
+ range: Range;
+
+ /**
+ * The uri this link points to.
+ */
+ target?: Uri;
+
+ /**
+ * The tooltip text when you hover over this link.
+ *
+ * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
+ * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
+ * user settings, and localization.
+ */
+ tooltip?: string;
+
+ /**
+ * Creates a new document link.
+ *
+ * @param range The range the document link applies to. Must not be empty.
+ * @param target The uri the document link points to.
+ */
+ constructor(range: Range, target?: Uri);
+ }
+
+ /**
+ * The document link provider defines the contract between extensions and feature of showing
+ * links in the editor.
+ */
+ export interface DocumentLinkProvider {
+
+ /**
+ * Provide links for the given document. Note that the editor ships with a default provider that detects
+ * `http(s)` and `file` links.
+ *
+ * @param document The document in which the command was invoked.
+ * @param token A cancellation token.
+ * @return An array of [document links](#DocumentLink) or a thenable that resolves to such. The lack of a result
+ * can be signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentLinks(document: TextDocument, token: CancellationToken): ProviderResult;
+
+ /**
+ * Given a link fill in its [target](#DocumentLink.target). This method is called when an incomplete
+ * link is selected in the UI. Providers can implement this method and return incomplete links
+ * (without target) from the [`provideDocumentLinks`](#DocumentLinkProvider.provideDocumentLinks) method which
+ * often helps to improve performance.
+ *
+ * @param link The link that is to be resolved.
+ * @param token A cancellation token.
+ */
+ resolveDocumentLink?(link: DocumentLink, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents a color in RGBA space.
+ */
+ export class Color {
+
+ /**
+ * The red component of this color in the range [0-1].
+ */
+ readonly red: number;
+
+ /**
+ * The green component of this color in the range [0-1].
+ */
+ readonly green: number;
+
+ /**
+ * The blue component of this color in the range [0-1].
+ */
+ readonly blue: number;
+
+ /**
+ * The alpha component of this color in the range [0-1].
+ */
+ readonly alpha: number;
+
+ /**
+ * Creates a new color instance.
+ *
+ * @param red The red component.
+ * @param green The green component.
+ * @param blue The blue component.
+ * @param alpha The alpha component.
+ */
+ constructor(red: number, green: number, blue: number, alpha: number);
+ }
+
+ /**
+ * Represents a color range from a document.
+ */
+ export class ColorInformation {
+
+ /**
+ * The range in the document where this color appears.
+ */
+ range: Range;
+
+ /**
+ * The actual color value for this color range.
+ */
+ color: Color;
+
+ /**
+ * Creates a new color range.
+ *
+ * @param range The range the color appears in. Must not be empty.
+ * @param color The value of the color.
+ * @param format The format in which this color is currently formatted.
+ */
+ constructor(range: Range, color: Color);
+ }
+
+ /**
+ * A color presentation object describes how a [`color`](#Color) should be represented as text and what
+ * edits are required to refer to it from source code.
+ *
+ * For some languages one color can have multiple presentations, e.g. css can represent the color red with
+ * the constant `Red`, the hex-value `#ff0000`, or in rgba and hsla forms. In csharp other representations
+ * apply, e.g. `System.Drawing.Color.Red`.
+ */
+ export class ColorPresentation {
+
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ label: string;
+
+ /**
+ * An [edit](#TextEdit) which is applied to a document when selecting
+ * this presentation for the color. When `falsy` the [label](#ColorPresentation.label)
+ * is used.
+ */
+ textEdit?: TextEdit;
+
+ /**
+ * An optional array of additional [text edits](#TextEdit) that are applied when
+ * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves.
+ */
+ additionalTextEdits?: TextEdit[];
+
+ /**
+ * Creates a new color presentation.
+ *
+ * @param label The label of this color presentation.
+ */
+ constructor(label: string);
+ }
+
+ /**
+ * The document color provider defines the contract between extensions and feature of
+ * picking and modifying colors in the editor.
+ */
+ export interface DocumentColorProvider {
+
+ /**
+ * Provide colors for the given document.
+ *
+ * @param document The document in which the command was invoked.
+ * @param token A cancellation token.
+ * @return An array of [color information](#ColorInformation) or a thenable that resolves to such. The lack of a result
+ * can be signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideDocumentColors(document: TextDocument, token: CancellationToken): ProviderResult;
+
+ /**
+ * Provide [representations](#ColorPresentation) for a color.
+ *
+ * @param color The color to show and insert.
+ * @param context A context object with additional information
+ * @param token A cancellation token.
+ * @return An array of color presentations or a thenable that resolves to such. The lack of a result
+ * can be signaled by returning `undefined`, `null`, or an empty array.
+ */
+ provideColorPresentations(color: Color, context: { document: TextDocument, range: Range }, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A line based folding range. To be valid, start and end line must be bigger than zero and smaller than the number of lines in the document.
+ * Invalid ranges will be ignored.
+ */
+ export class FoldingRange {
+
+ /**
+ * The zero-based start line of the range to fold. The folded area starts after the line's last character.
+ * To be valid, the end must be zero or larger and smaller than the number of lines in the document.
+ */
+ start: number;
+
+ /**
+ * The zero-based end line of the range to fold. The folded area ends with the line's last character.
+ * To be valid, the end must be zero or larger and smaller than the number of lines in the document.
+ */
+ end: number;
+
+ /**
+ * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or
+ * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands
+ * like 'Fold all comments'. See
+ * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of all kinds.
+ * If not set, the range is originated from a syntax element.
+ */
+ kind?: FoldingRangeKind;
+
+ /**
+ * Creates a new folding range.
+ *
+ * @param start The start line of the folded range.
+ * @param end The end line of the folded range.
+ * @param kind The kind of the folding range.
+ */
+ constructor(start: number, end: number, kind?: FoldingRangeKind);
+ }
+
+ /**
+ * An enumeration of specific folding range kinds. The kind is an optional field of a [FoldingRange](#FoldingRange)
+ * and is used to distinguish specific folding ranges such as ranges originated from comments. The kind is used by commands like
+ * `Fold all comments` or `Fold all regions`.
+ * If the kind is not set on the range, the range originated from a syntax element other than comments, imports or region markers.
+ */
+ export enum FoldingRangeKind {
+ /**
+ * Kind for folding range representing a comment.
+ */
+ Comment = 1,
+ /**
+ * Kind for folding range representing a import.
+ */
+ Imports = 2,
+ /**
+ * Kind for folding range representing regions originating from folding markers like `#region` and `#endregion`.
+ */
+ Region = 3
+ }
+
+ /**
+ * Folding context (for future use)
+ */
+ export interface FoldingContext {
+ }
+
+ /**
+ * The folding range provider interface defines the contract between extensions and
+ * [Folding](https://code.visualstudio.com/docs/editor/codebasics#_folding) in the editor.
+ */
+ export interface FoldingRangeProvider {
+ /**
+ * Returns a list of folding ranges or null and undefined if the provider
+ * does not want to participate or was cancelled.
+ * @param document The document in which the command was invoked.
+ * @param context Additional context information (for future use)
+ * @param token A cancellation token.
+ */
+ provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A selection range represents a part of a selection hierarchy. A selection range
+ * may have a parent selection range that contains it.
+ */
+ export class SelectionRange {
+
+ /**
+ * The [range](#Range) of this selection range.
+ */
+ range: Range;
+
+ /**
+ * The parent selection range containing this range.
+ */
+ parent?: SelectionRange;
+
+ /**
+ * Creates a new selection range.
+ *
+ * @param range The range of the selection range.
+ * @param parent The parent of the selection range.
+ */
+ constructor(range: Range, parent?: SelectionRange);
+ }
+
+ export interface SelectionRangeProvider {
+ /**
+ * Provide selection ranges for the given positions.
+ *
+ * Selection ranges should be computed individually and independend for each position. The editor will merge
+ * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range
+ * is [contained](#Range.contains) by its parent.
+ *
+ * @param document The document in which the command was invoked.
+ * @param positions The positions at which the command was invoked.
+ * @param token A cancellation token.
+ * @return Selection ranges or a thenable that resolves to such. The lack of a result can be
+ * signaled by returning `undefined` or `null`.
+ */
+ provideSelectionRanges(document: TextDocument, positions: Position[], token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A tuple of two characters, like a pair of
+ * opening and closing brackets.
+ */
+ export type CharacterPair = [string, string];
+
+ /**
+ * Describes how comments for a language work.
+ */
+ export interface CommentRule {
+
+ /**
+ * The line comment token, like `// this is a comment`
+ */
+ lineComment?: string;
+
+ /**
+ * The block comment character pair, like `/* block comment */`
+ */
+ blockComment?: CharacterPair;
+ }
+
+ /**
+ * Describes indentation rules for a language.
+ */
+ export interface IndentationRule {
+ /**
+ * If a line matches this pattern, then all the lines after it should be unindented once (until another rule matches).
+ */
+ decreaseIndentPattern: RegExp;
+ /**
+ * If a line matches this pattern, then all the lines after it should be indented once (until another rule matches).
+ */
+ increaseIndentPattern: RegExp;
+ /**
+ * If a line matches this pattern, then **only the next line** after it should be indented once.
+ */
+ indentNextLinePattern?: RegExp;
+ /**
+ * If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules.
+ */
+ unIndentedLinePattern?: RegExp;
+ }
+
+ /**
+ * Describes what to do with the indentation when pressing Enter.
+ */
+ export enum IndentAction {
+ /**
+ * Insert new line and copy the previous line's indentation.
+ */
+ None = 0,
+ /**
+ * Insert new line and indent once (relative to the previous line's indentation).
+ */
+ Indent = 1,
+ /**
+ * Insert two new lines:
+ * - the first one indented which will hold the cursor
+ * - the second one at the same indentation level
+ */
+ IndentOutdent = 2,
+ /**
+ * Insert new line and outdent once (relative to the previous line's indentation).
+ */
+ Outdent = 3
+ }
+
+ /**
+ * Describes what to do when pressing Enter.
+ */
+ export interface EnterAction {
+ /**
+ * Describe what to do with the indentation.
+ */
+ indentAction: IndentAction;
+ /**
+ * Describes text to be appended after the new line and after the indentation.
+ */
+ appendText?: string;
+ /**
+ * Describes the number of characters to remove from the new line's indentation.
+ */
+ removeText?: number;
+ }
+
+ /**
+ * Describes a rule to be evaluated when pressing Enter.
+ */
+ export interface OnEnterRule {
+ /**
+ * This rule will only execute if the text before the cursor matches this regular expression.
+ */
+ beforeText: RegExp;
+ /**
+ * This rule will only execute if the text after the cursor matches this regular expression.
+ */
+ afterText?: RegExp;
+ /**
+ * The action to execute.
+ */
+ action: EnterAction;
+ }
+
+ /**
+ * The language configuration interfaces defines the contract between extensions
+ * and various editor features, like automatic bracket insertion, automatic indentation etc.
+ */
+ export interface LanguageConfiguration {
+ /**
+ * The language's comment settings.
+ */
+ comments?: CommentRule;
+ /**
+ * The language's brackets.
+ * This configuration implicitly affects pressing Enter around these brackets.
+ */
+ brackets?: CharacterPair[];
+ /**
+ * The language's word definition.
+ * If the language supports Unicode identifiers (e.g. JavaScript), it is preferable
+ * to provide a word definition that uses exclusion of known separators.
+ * e.g.: A regex that matches anything except known separators (and dot is allowed to occur in a floating point number):
+ * /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g
+ */
+ wordPattern?: RegExp;
+ /**
+ * The language's indentation settings.
+ */
+ indentationRules?: IndentationRule;
+ /**
+ * The language's rules to be evaluated when pressing Enter.
+ */
+ onEnterRules?: OnEnterRule[];
+
+ /**
+ * **Deprecated** Do not use.
+ *
+ * @deprecated Will be replaced by a better API soon.
+ */
+ __electricCharacterSupport?: {
+ /**
+ * This property is deprecated and will be **ignored** from
+ * the editor.
+ * @deprecated
+ */
+ brackets?: any;
+ /**
+ * This property is deprecated and not fully supported anymore by
+ * the editor (scope and lineStart are ignored).
+ * Use the autoClosingPairs property in the language configuration file instead.
+ * @deprecated
+ */
+ docComment?: {
+ scope: string;
+ open: string;
+ lineStart: string;
+ close?: string;
+ };
+ };
+
+ /**
+ * **Deprecated** Do not use.
+ *
+ * @deprecated * Use the autoClosingPairs property in the language configuration file instead.
+ */
+ __characterPairSupport?: {
+ autoClosingPairs: {
+ open: string;
+ close: string;
+ notIn?: string[];
+ }[];
+ };
+ }
+
+ /**
+ * The configuration target
+ */
+ export enum ConfigurationTarget {
+ /**
+ * Global configuration
+ */
+ Global = 1,
+
+ /**
+ * Workspace configuration
+ */
+ Workspace = 2,
+
+ /**
+ * Workspace folder configuration
+ */
+ WorkspaceFolder = 3
+ }
+
+ /**
+ * Represents the configuration. It is a merged view of
+ *
+ * - Default configuration
+ * - Global configuration
+ * - Workspace configuration (if available)
+ * - Workspace folder configuration of the requested resource (if available)
+ *
+ * *Global configuration* comes from User Settings and shadows Defaults.
+ *
+ * *Workspace configuration* comes from Workspace Settings and shadows Global configuration.
+ *
+ * *Workspace Folder configuration* comes from `.vscode` folder under one of the [workspace folders](#workspace.workspaceFolders).
+ *
+ * *Note:* Workspace and Workspace Folder configurations contains `launch` and `tasks` settings. Their basename will be
+ * part of the section identifier. The following snippets shows how to retrieve all configurations
+ * from `launch.json`:
+ *
+ * ```ts
+ * // launch.json configuration
+ * const config = workspace.getConfiguration('launch', vscode.window.activeTextEditor.document.uri);
+ *
+ * // retrieve values
+ * const values = config.get('configurations');
+ * ```
+ *
+ * Refer to [Settings](https://code.visualstudio.com/docs/getstarted/settings) for more information.
+ */
+ export interface WorkspaceConfiguration {
+
+ /**
+ * Return a value from this configuration.
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @return The value `section` denotes or `undefined`.
+ */
+ get(section: string): T | undefined;
+
+ /**
+ * Return a value from this configuration.
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @param defaultValue A value should be returned when no value could be found, is `undefined`.
+ * @return The value `section` denotes or the default.
+ */
+ get(section: string, defaultValue: T): T;
+
+ /**
+ * Check if this configuration has a certain value.
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @return `true` if the section doesn't resolve to `undefined`.
+ */
+ has(section: string): boolean;
+
+ /**
+ * Retrieve all information about a configuration setting. A configuration value
+ * often consists of a *default* value, a global or installation-wide value,
+ * a workspace-specific value and a folder-specific value.
+ *
+ * The *effective* value (returned by [`get`](#WorkspaceConfiguration.get))
+ * is computed like this: `defaultValue` overwritten by `globalValue`,
+ * `globalValue` overwritten by `workspaceValue`. `workspaceValue` overwritten by `workspaceFolderValue`.
+ * Refer to [Settings Inheritance](https://code.visualstudio.com/docs/getstarted/settings)
+ * for more information.
+ *
+ * *Note:* The configuration name must denote a leaf in the configuration tree
+ * (`editor.fontSize` vs `editor`) otherwise no result is returned.
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @return Information about a configuration setting or `undefined`.
+ */
+ inspect(section: string): { key: string; defaultValue?: T; globalValue?: T; workspaceValue?: T, workspaceFolderValue?: T } | undefined;
+
+ /**
+ * Update a configuration value. The updated configuration values are persisted.
+ *
+ * A value can be changed in
+ *
+ * - [Global configuration](#ConfigurationTarget.Global): Changes the value for all instances of the editor.
+ * - [Workspace configuration](#ConfigurationTarget.Workspace): Changes the value for current workspace, if available.
+ * - [Workspace folder configuration](#ConfigurationTarget.WorkspaceFolder): Changes the value for the
+ * [Workspace folder](#workspace.workspaceFolders) to which the current [configuration](#WorkspaceConfiguration) is scoped to.
+ *
+ * *Note 1:* Setting a global value in the presence of a more specific workspace value
+ * has no observable effect in that workspace, but in others. Setting a workspace value
+ * in the presence of a more specific folder value has no observable effect for the resources
+ * under respective [folder](#workspace.workspaceFolders), but in others. Refer to
+ * [Settings Inheritance](https://code.visualstudio.com/docs/getstarted/settings) for more information.
+ *
+ * *Note 2:* To remove a configuration value use `undefined`, like so: `config.update('somekey', undefined)`
+ *
+ * Will throw error when
+ * - Writing a configuration which is not registered.
+ * - Writing a configuration to workspace or folder target when no workspace is opened
+ * - Writing a configuration to folder target when there is no folder settings
+ * - Writing to folder target without passing a resource when getting the configuration (`workspace.getConfiguration(section, resource)`)
+ * - Writing a window configuration to folder target
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @param value The new value.
+ * @param configurationTarget The [configuration target](#ConfigurationTarget) or a boolean value.
+ * - If `true` configuration target is `ConfigurationTarget.Global`.
+ * - If `false` configuration target is `ConfigurationTarget.Workspace`.
+ * - If `undefined` or `null` configuration target is
+ * `ConfigurationTarget.WorkspaceFolder` when configuration is resource specific
+ * `ConfigurationTarget.Workspace` otherwise.
+ */
+ update(section: string, value: any, configurationTarget?: ConfigurationTarget | boolean): Thenable;
+
+ /**
+ * Readable dictionary that backs this configuration.
+ */
+ readonly [key: string]: any;
+ }
+
+ /**
+ * Represents a location inside a resource, such as a line
+ * inside a text file.
+ */
+ export class Location {
+
+ /**
+ * The resource identifier of this location.
+ */
+ uri: Uri;
+
+ /**
+ * The document range of this location.
+ */
+ range: Range;
+
+ /**
+ * Creates a new location object.
+ *
+ * @param uri The resource identifier.
+ * @param rangeOrPosition The range or position. Positions will be converted to an empty range.
+ */
+ constructor(uri: Uri, rangeOrPosition: Range | Position);
+ }
+
+ /**
+ * Represents the connection of two locations. Provides additional metadata over normal [locations](#Location),
+ * including an origin range.
+ */
+ export interface LocationLink {
+ /**
+ * Span of the origin of this link.
+ *
+ * Used as the underlined span for mouse definition hover. Defaults to the word range at
+ * the definition position.
+ */
+ originSelectionRange?: Range;
+
+ /**
+ * The target resource identifier of this link.
+ */
+ targetUri: Uri;
+
+ /**
+ * The full target range of this link.
+ */
+ targetRange: Range;
+
+ /**
+ * The span of this link.
+ */
+ targetSelectionRange?: Range;
+ }
+
+ /**
+ * The event that is fired when diagnostics change.
+ */
+ export interface DiagnosticChangeEvent {
+
+ /**
+ * An array of resources for which diagnostics have changed.
+ */
+ readonly uris: ReadonlyArray;
+ }
+
+ /**
+ * Represents the severity of diagnostics.
+ */
+ export enum DiagnosticSeverity {
+
+ /**
+ * Something not allowed by the rules of a language or other means.
+ */
+ Error = 0,
+
+ /**
+ * Something suspicious but allowed.
+ */
+ Warning = 1,
+
+ /**
+ * Something to inform about but not a problem.
+ */
+ Information = 2,
+
+ /**
+ * Something to hint to a better way of doing it, like proposing
+ * a refactoring.
+ */
+ Hint = 3
+ }
+
+ /**
+ * Represents a related message and source code location for a diagnostic. This should be
+ * used to point to code locations that cause or related to a diagnostics, e.g. when duplicating
+ * a symbol in a scope.
+ */
+ export class DiagnosticRelatedInformation {
+
+ /**
+ * The location of this related diagnostic information.
+ */
+ location: Location;
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ message: string;
+
+ /**
+ * Creates a new related diagnostic information object.
+ *
+ * @param location The location.
+ * @param message The message.
+ */
+ constructor(location: Location, message: string);
+ }
+
+ /**
+ * Additional metadata about the type of a diagnostic.
+ */
+ export enum DiagnosticTag {
+ /**
+ * Unused or unnecessary code.
+ *
+ * Diagnostics with this tag are rendered faded out. The amount of fading
+ * is controlled by the `"editorUnnecessaryCode.opacity"` theme color. For
+ * example, `"editorUnnecessaryCode.opacity": "#000000c0"` will render the
+ * code with 75% opacity. For high contrast themes, use the
+ * `"editorUnnecessaryCode.border"` theme color to underline unnecessary code
+ * instead of fading it out.
+ */
+ Unnecessary = 1,
+ }
+
+ /**
+ * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects
+ * are only valid in the scope of a file.
+ */
+ export class Diagnostic {
+
+ /**
+ * The range to which this diagnostic applies.
+ */
+ range: Range;
+
+ /**
+ * The human-readable message.
+ */
+ message: string;
+
+ /**
+ * The severity, default is [error](#DiagnosticSeverity.Error).
+ */
+ severity: DiagnosticSeverity;
+
+ /**
+ * A human-readable string describing the source of this
+ * diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ source?: string;
+
+ /**
+ * A code or identifier for this diagnostic.
+ * Should be used for later processing, e.g. when providing [code actions](#CodeActionContext).
+ */
+ code?: string | number;
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within
+ * a scope collide all definitions can be marked via this property.
+ */
+ relatedInformation?: DiagnosticRelatedInformation[];
+
+ /**
+ * Additional metadata about the diagnostic.
+ */
+ tags?: DiagnosticTag[];
+
+ /**
+ * Creates a new diagnostic object.
+ *
+ * @param range The range to which this diagnostic applies.
+ * @param message The human-readable message.
+ * @param severity The severity, default is [error](#DiagnosticSeverity.Error).
+ */
+ constructor(range: Range, message: string, severity?: DiagnosticSeverity);
+ }
+
+ /**
+ * A diagnostics collection is a container that manages a set of
+ * [diagnostics](#Diagnostic). Diagnostics are always scopes to a
+ * diagnostics collection and a resource.
+ *
+ * To get an instance of a `DiagnosticCollection` use
+ * [createDiagnosticCollection](#languages.createDiagnosticCollection).
+ */
+ export interface DiagnosticCollection {
+
+ /**
+ * The name of this diagnostic collection, for instance `typescript`. Every diagnostic
+ * from this collection will be associated with this name. Also, the task framework uses this
+ * name when defining [problem matchers](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher).
+ */
+ readonly name: string;
+
+ /**
+ * Assign diagnostics for given resource. Will replace
+ * existing diagnostics for that resource.
+ *
+ * @param uri A resource identifier.
+ * @param diagnostics Array of diagnostics or `undefined`
+ */
+ set(uri: Uri, diagnostics: ReadonlyArray | undefined): void;
+
+ /**
+ * Replace all entries in this collection.
+ *
+ * Diagnostics of multiple tuples of the same uri will be merged, e.g
+ * `[[file1, [d1]], [file1, [d2]]]` is equivalent to `[[file1, [d1, d2]]]`.
+ * If a diagnostics item is `undefined` as in `[file1, undefined]`
+ * all previous but not subsequent diagnostics are removed.
+ *
+ * @param entries An array of tuples, like `[[file1, [d1, d2]], [file2, [d3, d4, d5]]]`, or `undefined`.
+ */
+ set(entries: ReadonlyArray<[Uri, ReadonlyArray | undefined]>): void;
+
+ /**
+ * Remove all diagnostics from this collection that belong
+ * to the provided `uri`. The same as `#set(uri, undefined)`.
+ *
+ * @param uri A resource identifier.
+ */
+ delete(uri: Uri): void;
+
+ /**
+ * Remove all diagnostics from this collection. The same
+ * as calling `#set(undefined)`;
+ */
+ clear(): void;
+
+ /**
+ * Iterate over each entry in this collection.
+ *
+ * @param callback Function to execute for each entry.
+ * @param thisArg The `this` context used when invoking the handler function.
+ */
+ forEach(callback: (uri: Uri, diagnostics: ReadonlyArray, collection: DiagnosticCollection) => any, thisArg?: any): void;
+
+ /**
+ * Get the diagnostics for a given resource. *Note* that you cannot
+ * modify the diagnostics-array returned from this call.
+ *
+ * @param uri A resource identifier.
+ * @returns An immutable array of [diagnostics](#Diagnostic) or `undefined`.
+ */
+ get(uri: Uri): ReadonlyArray | undefined;
+
+ /**
+ * Check if this collection contains diagnostics for a
+ * given resource.
+ *
+ * @param uri A resource identifier.
+ * @returns `true` if this collection has diagnostic for the given resource.
+ */
+ has(uri: Uri): boolean;
+
+ /**
+ * Dispose and free associated resources. Calls
+ * [clear](#DiagnosticCollection.clear).
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Denotes a location of an editor in the window. Editors can be arranged in a grid
+ * and each column represents one editor location in that grid by counting the editors
+ * in order of their appearance.
+ */
+ export enum ViewColumn {
+ /**
+ * A *symbolic* editor column representing the currently active column. This value
+ * can be used when opening editors, but the *resolved* [viewColumn](#TextEditor.viewColumn)-value
+ * of editors will always be `One`, `Two`, `Three`,... or `undefined` but never `Active`.
+ */
+ Active = -1,
+ /**
+ * A *symbolic* editor column representing the column to the side of the active one. This value
+ * can be used when opening editors, but the *resolved* [viewColumn](#TextEditor.viewColumn)-value
+ * of editors will always be `One`, `Two`, `Three`,... or `undefined` but never `Beside`.
+ */
+ Beside = -2,
+ /**
+ * The first editor column.
+ */
+ One = 1,
+ /**
+ * The second editor column.
+ */
+ Two = 2,
+ /**
+ * The third editor column.
+ */
+ Three = 3,
+ /**
+ * The fourth editor column.
+ */
+ Four = 4,
+ /**
+ * The fifth editor column.
+ */
+ Five = 5,
+ /**
+ * The sixth editor column.
+ */
+ Six = 6,
+ /**
+ * The seventh editor column.
+ */
+ Seven = 7,
+ /**
+ * The eighth editor column.
+ */
+ Eight = 8,
+ /**
+ * The ninth editor column.
+ */
+ Nine = 9
+ }
+
+ /**
+ * An output channel is a container for readonly textual information.
+ *
+ * To get an instance of an `OutputChannel` use
+ * [createOutputChannel](#window.createOutputChannel).
+ */
+ export interface OutputChannel {
+
+ /**
+ * The human-readable name of this output channel.
+ */
+ readonly name: string;
+
+ /**
+ * Append the given value to the channel.
+ *
+ * @param value A string, falsy values will not be printed.
+ */
+ append(value: string): void;
+
+ /**
+ * Append the given value and a line feed character
+ * to the channel.
+ *
+ * @param value A string, falsy values will be printed.
+ */
+ appendLine(value: string): void;
+
+ /**
+ * Removes all output from the channel.
+ */
+ clear(): void;
+
+ /**
+ * Reveal this channel in the UI.
+ *
+ * @param preserveFocus When `true` the channel will not take focus.
+ */
+ show(preserveFocus?: boolean): void;
+
+ /**
+ * ~~Reveal this channel in the UI.~~
+ *
+ * @deprecated Use the overload with just one parameter (`show(preserveFocus?: boolean): void`).
+ *
+ * @param column This argument is **deprecated** and will be ignored.
+ * @param preserveFocus When `true` the channel will not take focus.
+ */
+ show(column?: ViewColumn, preserveFocus?: boolean): void;
+
+ /**
+ * Hide this channel from the UI.
+ */
+ hide(): void;
+
+ /**
+ * Dispose and free associated resources.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Represents the alignment of status bar items.
+ */
+ export enum StatusBarAlignment {
+
+ /**
+ * Aligned to the left side.
+ */
+ Left = 1,
+
+ /**
+ * Aligned to the right side.
+ */
+ Right = 2
+ }
+
+ /**
+ * A status bar item is a status bar contribution that can
+ * show text and icons and run a command on click.
+ */
+ export interface StatusBarItem {
+
+ /**
+ * The alignment of this item.
+ */
+ readonly alignment: StatusBarAlignment;
+
+ /**
+ * The priority of this item. Higher value means the item should
+ * be shown more to the left.
+ */
+ readonly priority?: number;
+
+ /**
+ * The text to show for the entry. You can embed icons in the text by leveraging the syntax:
+ *
+ * `My text $(icon-name) contains icons like $(icon-name) this one.`
+ *
+ * Where the icon-name is taken from the [octicon](https://octicons.github.com) icon set, e.g.
+ * `light-bulb`, `thumbsup`, `zap` etc.
+ */
+ text: string;
+
+ /**
+ * The tooltip text when you hover over this entry.
+ */
+ tooltip: string | undefined;
+
+ /**
+ * The foreground color for this entry.
+ */
+ color: string | ThemeColor | undefined;
+
+ /**
+ * The identifier of a command to run on click. The command must be
+ * [known](#commands.getCommands).
+ */
+ command: string | undefined;
+
+ /**
+ * Shows the entry in the status bar.
+ */
+ show(): void;
+
+ /**
+ * Hide the entry in the status bar.
+ */
+ hide(): void;
+
+ /**
+ * Dispose and free associated resources. Call
+ * [hide](#StatusBarItem.hide).
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Defines a generalized way of reporting progress updates.
+ */
+ export interface Progress {
+
+ /**
+ * Report a progress update.
+ * @param value A progress item, like a message and/or an
+ * report on how much work finished
+ */
+ report(value: T): void;
+ }
+
+ /**
+ * An individual terminal instance within the integrated terminal.
+ */
+ export interface Terminal {
+
+ /**
+ * The name of the terminal.
+ */
+ readonly name: string;
+
+ /**
+ * The process ID of the shell process.
+ */
+ readonly processId: Thenable;
+
+ /**
+ * Send text to the terminal. The text is written to the stdin of the underlying pty process
+ * (shell) of the terminal.
+ *
+ * @param text The text to send.
+ * @param addNewLine Whether to add a new line to the text being sent, this is normally
+ * required to run a command in the terminal. The character(s) added are \n or \r\n
+ * depending on the platform. This defaults to `true`.
+ */
+ sendText(text: string, addNewLine?: boolean): void;
+
+ /**
+ * Show the terminal panel and reveal this terminal in the UI.
+ *
+ * @param preserveFocus When `true` the terminal will not take focus.
+ */
+ show(preserveFocus?: boolean): void;
+
+ /**
+ * Hide the terminal panel if this terminal is currently showing.
+ */
+ hide(): void;
+
+ /**
+ * Dispose and free associated resources.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * In a remote window the extension kind describes if an extension
+ * runs where the UI (window) runs or if an extension runs remotely.
+ */
+ export enum ExtensionKind {
+
+ /**
+ * Extension runs where the UI runs.
+ */
+ UI = 1,
+
+ /**
+ * Extension runs where the remote extension host runs.
+ */
+ Workspace = 2
+ }
+
+ /**
+ * Represents an extension.
+ *
+ * To get an instance of an `Extension` use [getExtension](#extensions.getExtension).
+ */
+ export interface Extension {
+
+ /**
+ * The canonical extension identifier in the form of: `publisher.name`.
+ */
+ readonly id: string;
+
+ /**
+ * The absolute file path of the directory containing this extension.
+ */
+ readonly extensionPath: string;
+
+ /**
+ * `true` if the extension has been activated.
+ */
+ readonly isActive: boolean;
+
+ /**
+ * The parsed contents of the extension's package.json.
+ */
+ readonly packageJSON: any;
+
+ /**
+ * The extension kind describes if an extension runs where the UI runs
+ * or if an extension runs where the remote extension host runs. The extension kind
+ * if defined in the `package.json` file of extensions but can also be refined
+ * via the the `remote.extensionKind`-setting. When no remote extension host exists,
+ * the value is [`ExtensionKind.UI`](#ExtensionKind.UI).
+ */
+ extensionKind: ExtensionKind;
+
+ /**
+ * The public API exported by this extension. It is an invalid action
+ * to access this field before this extension has been activated.
+ */
+ readonly exports: T;
+
+ /**
+ * Activates this extension and returns its public API.
+ *
+ * @return A promise that will resolve when this extension has been activated.
+ */
+ activate(): Thenable;
+ }
+
+ /**
+ * An extension context is a collection of utilities private to an
+ * extension.
+ *
+ * An instance of an `ExtensionContext` is provided as the first
+ * parameter to the `activate`-call of an extension.
+ */
+ export interface ExtensionContext {
+
+ /**
+ * An array to which disposables can be added. When this
+ * extension is deactivated the disposables will be disposed.
+ */
+ readonly subscriptions: { dispose(): any }[];
+
+ /**
+ * A memento object that stores state in the context
+ * of the currently opened [workspace](#workspace.workspaceFolders).
+ */
+ readonly workspaceState: Memento;
+
+ /**
+ * A memento object that stores state independent
+ * of the current opened [workspace](#workspace.workspaceFolders).
+ */
+ readonly globalState: Memento;
+
+ /**
+ * The absolute file path of the directory containing the extension.
+ */
+ readonly extensionPath: string;
+
+ /**
+ * Get the absolute path of a resource contained in the extension.
+ *
+ * @param relativePath A relative path to a resource contained in the extension.
+ * @return The absolute path of the resource.
+ */
+ asAbsolutePath(relativePath: string): string;
+
+ /**
+ * An absolute file path of a workspace specific directory in which the extension
+ * can store private state. The directory might not exist on disk and creation is
+ * up to the extension. However, the parent directory is guaranteed to be existent.
+ *
+ * Use [`workspaceState`](#ExtensionContext.workspaceState) or
+ * [`globalState`](#ExtensionContext.globalState) to store key value data.
+ */
+ readonly storagePath: string | undefined;
+
+ /**
+ * An absolute file path in which the extension can store global state.
+ * The directory might not exist on disk and creation is
+ * up to the extension. However, the parent directory is guaranteed to be existent.
+ *
+ * Use [`globalState`](#ExtensionContext.globalState) to store key value data.
+ */
+ readonly globalStoragePath: string;
+
+ /**
+ * An absolute file path of a directory in which the extension can create log files.
+ * The directory might not exist on disk and creation is up to the extension. However,
+ * the parent directory is guaranteed to be existent.
+ */
+ readonly logPath: string;
+ }
+
+ /**
+ * A memento represents a storage utility. It can store and retrieve
+ * values.
+ */
+ export interface Memento {
+
+ /**
+ * Return a value.
+ *
+ * @param key A string.
+ * @return The stored value or `undefined`.
+ */
+ get(key: string): T | undefined;
+
+ /**
+ * Return a value.
+ *
+ * @param key A string.
+ * @param defaultValue A value that should be returned when there is no
+ * value (`undefined`) with the given key.
+ * @return The stored value or the defaultValue.
+ */
+ get(key: string, defaultValue: T): T;
+
+ /**
+ * Store a value. The value must be JSON-stringifyable.
+ *
+ * @param key A string.
+ * @param value A value. MUST not contain cyclic references.
+ */
+ update(key: string, value: any): Thenable;
+ }
+
+ /**
+ * Controls the behaviour of the terminal's visibility.
+ */
+ export enum TaskRevealKind {
+ /**
+ * Always brings the terminal to front if the task is executed.
+ */
+ Always = 1,
+
+ /**
+ * Only brings the terminal to front if a problem is detected executing the task
+ * (e.g. the task couldn't be started because).
+ */
+ Silent = 2,
+
+ /**
+ * The terminal never comes to front when the task is executed.
+ */
+ Never = 3
+ }
+
+ /**
+ * Controls how the task channel is used between tasks
+ */
+ export enum TaskPanelKind {
+
+ /**
+ * Shares a panel with other tasks. This is the default.
+ */
+ Shared = 1,
+
+ /**
+ * Uses a dedicated panel for this tasks. The panel is not
+ * shared with other tasks.
+ */
+ Dedicated = 2,
+
+ /**
+ * Creates a new panel whenever this task is executed.
+ */
+ New = 3
+ }
+
+ /**
+ * Controls how the task is presented in the UI.
+ */
+ export interface TaskPresentationOptions {
+ /**
+ * Controls whether the task output is reveal in the user interface.
+ * Defaults to `RevealKind.Always`.
+ */
+ reveal?: TaskRevealKind;
+
+ /**
+ * Controls whether the command associated with the task is echoed
+ * in the user interface.
+ */
+ echo?: boolean;
+
+ /**
+ * Controls whether the panel showing the task output is taking focus.
+ */
+ focus?: boolean;
+
+ /**
+ * Controls if the task panel is used for this task only (dedicated),
+ * shared between tasks (shared) or if a new panel is created on
+ * every task execution (new). Defaults to `TaskInstanceKind.Shared`
+ */
+ panel?: TaskPanelKind;
+
+ /**
+ * Controls whether to show the "Terminal will be reused by tasks, press any key to close it" message.
+ */
+ showReuseMessage?: boolean;
+
+ /**
+ * Controls whether the terminal is cleared before executing the task.
+ */
+ clear?: boolean;
+ }
+
+ /**
+ * A grouping for tasks. The editor by default supports the
+ * 'Clean', 'Build', 'RebuildAll' and 'Test' group.
+ */
+ export class TaskGroup {
+
+ /**
+ * The clean task group;
+ */
+ static Clean: TaskGroup;
+
+ /**
+ * The build task group;
+ */
+ static Build: TaskGroup;
+
+ /**
+ * The rebuild all task group;
+ */
+ static Rebuild: TaskGroup;
+
+ /**
+ * The test all task group;
+ */
+ static Test: TaskGroup;
+
+ private constructor(id: string, label: string);
+ }
+
+
+ /**
+ * A structure that defines a task kind in the system.
+ * The value must be JSON-stringifyable.
+ */
+ export interface TaskDefinition {
+ /**
+ * The task definition describing the task provided by an extension.
+ * Usually a task provider defines more properties to identify
+ * a task. They need to be defined in the package.json of the
+ * extension under the 'taskDefinitions' extension point. The npm
+ * task definition for example looks like this
+ * ```typescript
+ * interface NpmTaskDefinition extends TaskDefinition {
+ * script: string;
+ * }
+ * ```
+ *
+ * Note that type identifier starting with a '$' are reserved for internal
+ * usages and shouldn't be used by extensions.
+ */
+ readonly type: string;
+
+ /**
+ * Additional attributes of a concrete task definition.
+ */
+ [name: string]: any;
+ }
+
+ /**
+ * Options for a process execution
+ */
+ export interface ProcessExecutionOptions {
+ /**
+ * The current working directory of the executed program or shell.
+ * If omitted the tools current workspace root is used.
+ */
+ cwd?: string;
+
+ /**
+ * The additional environment of the executed program or shell. If omitted
+ * the parent process' environment is used. If provided it is merged with
+ * the parent process' environment.
+ */
+ env?: { [key: string]: string };
+ }
+
+ /**
+ * The execution of a task happens as an external process
+ * without shell interaction.
+ */
+ export class ProcessExecution {
+
+ /**
+ * Creates a process execution.
+ *
+ * @param process The process to start.
+ * @param options Optional options for the started process.
+ */
+ constructor(process: string, options?: ProcessExecutionOptions);
+
+ /**
+ * Creates a process execution.
+ *
+ * @param process The process to start.
+ * @param args Arguments to be passed to the process.
+ * @param options Optional options for the started process.
+ */
+ constructor(process: string, args: string[], options?: ProcessExecutionOptions);
+
+ /**
+ * The process to be executed.
+ */
+ process: string;
+
+ /**
+ * The arguments passed to the process. Defaults to an empty array.
+ */
+ args: string[];
+
+ /**
+ * The process options used when the process is executed.
+ * Defaults to undefined.
+ */
+ options?: ProcessExecutionOptions;
+ }
+
+ /**
+ * The shell quoting options.
+ */
+ export interface ShellQuotingOptions {
+
+ /**
+ * The character used to do character escaping. If a string is provided only spaces
+ * are escaped. If a `{ escapeChar, charsToEscape }` literal is provide all characters
+ * in `charsToEscape` are escaped using the `escapeChar`.
+ */
+ escape?: string | {
+ /**
+ * The escape character.
+ */
+ escapeChar: string;
+ /**
+ * The characters to escape.
+ */
+ charsToEscape: string;
+ };
+
+ /**
+ * The character used for strong quoting. The string's length must be 1.
+ */
+ strong?: string;
+
+ /**
+ * The character used for weak quoting. The string's length must be 1.
+ */
+ weak?: string;
+ }
+
+ /**
+ * Options for a shell execution
+ */
+ export interface ShellExecutionOptions {
+ /**
+ * The shell executable.
+ */
+ executable?: string;
+
+ /**
+ * The arguments to be passed to the shell executable used to run the task. Most shells
+ * require special arguments to execute a command. For example `bash` requires the `-c`
+ * argument to execute a command, `PowerShell` requires `-Command` and `cmd` requires both
+ * `/d` and `/c`.
+ */
+ shellArgs?: string[];
+
+ /**
+ * The shell quotes supported by this shell.
+ */
+ shellQuoting?: ShellQuotingOptions;
+
+ /**
+ * The current working directory of the executed shell.
+ * If omitted the tools current workspace root is used.
+ */
+ cwd?: string;
+
+ /**
+ * The additional environment of the executed shell. If omitted
+ * the parent process' environment is used. If provided it is merged with
+ * the parent process' environment.
+ */
+ env?: { [key: string]: string };
+ }
+
+ /**
+ * Defines how an argument should be quoted if it contains
+ * spaces or unsupported characters.
+ */
+ export enum ShellQuoting {
+
+ /**
+ * Character escaping should be used. This for example
+ * uses \ on bash and ` on PowerShell.
+ */
+ Escape = 1,
+
+ /**
+ * Strong string quoting should be used. This for example
+ * uses " for Windows cmd and ' for bash and PowerShell.
+ * Strong quoting treats arguments as literal strings.
+ * Under PowerShell echo 'The value is $(2 * 3)' will
+ * print `The value is $(2 * 3)`
+ */
+ Strong = 2,
+
+ /**
+ * Weak string quoting should be used. This for example
+ * uses " for Windows cmd, bash and PowerShell. Weak quoting
+ * still performs some kind of evaluation inside the quoted
+ * string. Under PowerShell echo "The value is $(2 * 3)"
+ * will print `The value is 6`
+ */
+ Weak = 3
+ }
+
+ /**
+ * A string that will be quoted depending on the used shell.
+ */
+ export interface ShellQuotedString {
+ /**
+ * The actual string value.
+ */
+ value: string;
+
+ /**
+ * The quoting style to use.
+ */
+ quoting: ShellQuoting;
+ }
+
+ export class ShellExecution {
+ /**
+ * Creates a shell execution with a full command line.
+ *
+ * @param commandLine The command line to execute.
+ * @param options Optional options for the started the shell.
+ */
+ constructor(commandLine: string, options?: ShellExecutionOptions);
+
+ /**
+ * Creates a shell execution with a command and arguments. For the real execution VS Code will
+ * construct a command line from the command and the arguments. This is subject to interpretation
+ * especially when it comes to quoting. If full control over the command line is needed please
+ * use the constructor that creates a `ShellExecution` with the full command line.
+ *
+ * @param command The command to execute.
+ * @param args The command arguments.
+ * @param options Optional options for the started the shell.
+ */
+ constructor(command: string | ShellQuotedString, args: (string | ShellQuotedString)[], options?: ShellExecutionOptions);
+
+ /**
+ * The shell command line. Is `undefined` if created with a command and arguments.
+ */
+ commandLine: string;
+
+ /**
+ * The shell command. Is `undefined` if created with a full command line.
+ */
+ command: string | ShellQuotedString;
+
+ /**
+ * The shell args. Is `undefined` if created with a full command line.
+ */
+ args: (string | ShellQuotedString)[];
+
+ /**
+ * The shell options used when the command line is executed in a shell.
+ * Defaults to undefined.
+ */
+ options?: ShellExecutionOptions;
+ }
+
+ /**
+ * The scope of a task.
+ */
+ export enum TaskScope {
+ /**
+ * The task is a global task
+ */
+ Global = 1,
+
+ /**
+ * The task is a workspace task
+ */
+ Workspace = 2
+ }
+
+ /**
+ * Run options for a task.
+ */
+ export interface RunOptions {
+ /**
+ * Controls whether task variables are re-evaluated on rerun.
+ */
+ reevaluateOnRerun?: boolean;
+ }
+
+ /**
+ * A task to execute
+ */
+ export class Task {
+
+ /**
+ * Creates a new task.
+ *
+ * @param definition The task definition as defined in the taskDefinitions extension point.
+ * @param scope Specifies the task's scope. It is either a global or a workspace task or a task for a specific workspace folder.
+ * @param name The task's name. Is presented in the user interface.
+ * @param source The task's source (e.g. 'gulp', 'npm', ...). Is presented in the user interface.
+ * @param execution The process or shell execution.
+ * @param problemMatchers the names of problem matchers to use, like '$tsc'
+ * or '$eslint'. Problem matchers can be contributed by an extension using
+ * the `problemMatchers` extension point.
+ */
+ constructor(taskDefinition: TaskDefinition, scope: WorkspaceFolder | TaskScope.Global | TaskScope.Workspace, name: string, source: string, execution?: ProcessExecution | ShellExecution, problemMatchers?: string | string[]);
+
+ /**
+ * ~~Creates a new task.~~
+ *
+ * @deprecated Use the new constructors that allow specifying a scope for the task.
+ *
+ * @param definition The task definition as defined in the taskDefinitions extension point.
+ * @param name The task's name. Is presented in the user interface.
+ * @param source The task's source (e.g. 'gulp', 'npm', ...). Is presented in the user interface.
+ * @param execution The process or shell execution.
+ * @param problemMatchers the names of problem matchers to use, like '$tsc'
+ * or '$eslint'. Problem matchers can be contributed by an extension using
+ * the `problemMatchers` extension point.
+ */
+ constructor(taskDefinition: TaskDefinition, name: string, source: string, execution?: ProcessExecution | ShellExecution, problemMatchers?: string | string[]);
+
+ /**
+ * The task's definition.
+ */
+ definition: TaskDefinition;
+
+ /**
+ * The task's scope.
+ */
+ readonly scope?: TaskScope.Global | TaskScope.Workspace | WorkspaceFolder;
+
+ /**
+ * The task's name
+ */
+ name: string;
+
+ /**
+ * The task's execution engine
+ */
+ execution?: ProcessExecution | ShellExecution;
+
+ /**
+ * Whether the task is a background task or not.
+ */
+ isBackground: boolean;
+
+ /**
+ * A human-readable string describing the source of this
+ * shell task, e.g. 'gulp' or 'npm'.
+ */
+ source: string;
+
+ /**
+ * The task group this tasks belongs to. See TaskGroup
+ * for a predefined set of available groups.
+ * Defaults to undefined meaning that the task doesn't
+ * belong to any special group.
+ */
+ group?: TaskGroup;
+
+ /**
+ * The presentation options. Defaults to an empty literal.
+ */
+ presentationOptions: TaskPresentationOptions;
+
+ /**
+ * The problem matchers attached to the task. Defaults to an empty
+ * array.
+ */
+ problemMatchers: string[];
+
+ /**
+ * Run options for the task
+ */
+ runOptions: RunOptions;
+ }
+
+ /**
+ * A task provider allows to add tasks to the task service.
+ * A task provider is registered via #tasks.registerTaskProvider.
+ */
+ export interface TaskProvider {
+ /**
+ * Provides tasks.
+ * @param token A cancellation token.
+ * @return an array of tasks
+ */
+ provideTasks(token?: CancellationToken): ProviderResult;
+
+ /**
+ * Resolves a task that has no [`execution`](#Task.execution) set. Tasks are
+ * often created from information found in the `tasks.json`-file. Such tasks miss
+ * the information on how to execute them and a task provider must fill in
+ * the missing information in the `resolveTask`-method. This method will not be
+ * called for tasks returned from the above `provideTasks` method since those
+ * tasks are always fully resolved. A valid default implementation for the
+ * `resolveTask` method is to return `undefined`.
+ *
+ * @param task The task to resolve.
+ * @param token A cancellation token.
+ * @return The resolved task
+ */
+ resolveTask(task: Task, token?: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * An object representing an executed Task. It can be used
+ * to terminate a task.
+ *
+ * This interface is not intended to be implemented.
+ */
+ export interface TaskExecution {
+ /**
+ * The task that got started.
+ */
+ task: Task;
+
+ /**
+ * Terminates the task execution.
+ */
+ terminate(): void;
+ }
+
+ /**
+ * An event signaling the start of a task execution.
+ *
+ * This interface is not intended to be implemented.
+ */
+ interface TaskStartEvent {
+ /**
+ * The task item representing the task that got started.
+ */
+ readonly execution: TaskExecution;
+ }
+
+ /**
+ * An event signaling the end of an executed task.
+ *
+ * This interface is not intended to be implemented.
+ */
+ interface TaskEndEvent {
+ /**
+ * The task item representing the task that finished.
+ */
+ readonly execution: TaskExecution;
+ }
+
+ /**
+ * An event signaling the start of a process execution
+ * triggered through a task
+ */
+ export interface TaskProcessStartEvent {
+
+ /**
+ * The task execution for which the process got started.
+ */
+ readonly execution: TaskExecution;
+
+ /**
+ * The underlying process id.
+ */
+ readonly processId: number;
+ }
+
+ /**
+ * An event signaling the end of a process execution
+ * triggered through a task
+ */
+ export interface TaskProcessEndEvent {
+
+ /**
+ * The task execution for which the process got started.
+ */
+ readonly execution: TaskExecution;
+
+ /**
+ * The process's exit code.
+ */
+ readonly exitCode: number;
+ }
+
+ export interface TaskFilter {
+ /**
+ * The task version as used in the tasks.json file.
+ * The string support the package.json semver notation.
+ */
+ version?: string;
+
+ /**
+ * The task type to return;
+ */
+ type?: string;
+ }
+
+ /**
+ * Namespace for tasks functionality.
+ */
+ export namespace tasks {
+
+ /**
+ * Register a task provider.
+ *
+ * @param type The task kind type this provider is registered for.
+ * @param provider A task provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerTaskProvider(type: string, provider: TaskProvider): Disposable;
+
+ /**
+ * Fetches all tasks available in the systems. This includes tasks
+ * from `tasks.json` files as well as tasks from task providers
+ * contributed through extensions.
+ *
+ * @param filter a filter to filter the return tasks.
+ */
+ export function fetchTasks(filter?: TaskFilter): Thenable;
+
+ /**
+ * Executes a task that is managed by VS Code. The returned
+ * task execution can be used to terminate the task.
+ *
+ * @param task the task to execute
+ */
+ export function executeTask(task: Task): Thenable;
+
+ /**
+ * The currently active task executions or an empty array.
+ */
+ export const taskExecutions: ReadonlyArray;
+
+ /**
+ * Fires when a task starts.
+ */
+ export const onDidStartTask: Event;
+
+ /**
+ * Fires when a task ends.
+ */
+ export const onDidEndTask: Event;
+
+ /**
+ * Fires when the underlying process has been started.
+ * This event will not fire for tasks that don't
+ * execute an underlying process.
+ */
+ export const onDidStartTaskProcess: Event;
+
+ /**
+ * Fires when the underlying process has ended.
+ * This event will not fire for tasks that don't
+ * execute an underlying process.
+ */
+ export const onDidEndTaskProcess: Event;
+ }
+
+ /**
+ * Enumeration of file types. The types `File` and `Directory` can also be
+ * a symbolic links, in that use `FileType.File | FileType.SymbolicLink` and
+ * `FileType.Directory | FileType.SymbolicLink`.
+ */
+ export enum FileType {
+ /**
+ * The file type is unknown.
+ */
+ Unknown = 0,
+ /**
+ * A regular file.
+ */
+ File = 1,
+ /**
+ * A directory.
+ */
+ Directory = 2,
+ /**
+ * A symbolic link to a file.
+ */
+ SymbolicLink = 64
+ }
+
+ /**
+ * The `FileStat`-type represents metadata about a file
+ */
+ export interface FileStat {
+ /**
+ * The type of the file, e.g. is a regular file, a directory, or symbolic link
+ * to a file.
+ */
+ type: FileType;
+ /**
+ * The creation timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC.
+ */
+ ctime: number;
+ /**
+ * The modification timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC.
+ */
+ mtime: number;
+ /**
+ * The size in bytes.
+ */
+ size: number;
+ }
+
+ /**
+ * A type that filesystem providers should use to signal errors.
+ *
+ * This class has factory methods for common error-cases, like `FileNotFound` when
+ * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.FileNotFound(someUri);`
+ */
+ export class FileSystemError extends Error {
+
+ /**
+ * Create an error to signal that a file or folder wasn't found.
+ * @param messageOrUri Message or uri.
+ */
+ static FileNotFound(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Create an error to signal that a file or folder already exists, e.g. when
+ * creating but not overwriting a file.
+ * @param messageOrUri Message or uri.
+ */
+ static FileExists(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Create an error to signal that a file is not a folder.
+ * @param messageOrUri Message or uri.
+ */
+ static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Create an error to signal that a file is a folder.
+ * @param messageOrUri Message or uri.
+ */
+ static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Create an error to signal that an operation lacks required permissions.
+ * @param messageOrUri Message or uri.
+ */
+ static NoPermissions(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Create an error to signal that the file system is unavailable or too busy to
+ * complete a request.
+ * @param messageOrUri Message or uri.
+ */
+ static Unavailable(messageOrUri?: string | Uri): FileSystemError;
+
+ /**
+ * Creates a new filesystem error.
+ *
+ * @param messageOrUri Message or uri.
+ */
+ constructor(messageOrUri?: string | Uri);
+ }
+
+ /**
+ * Enumeration of file change types.
+ */
+ export enum FileChangeType {
+
+ /**
+ * The contents or metadata of a file have changed.
+ */
+ Changed = 1,
+
+ /**
+ * A file has been created.
+ */
+ Created = 2,
+
+ /**
+ * A file has been deleted.
+ */
+ Deleted = 3,
+ }
+
+ /**
+ * The event filesystem providers must use to signal a file change.
+ */
+ export interface FileChangeEvent {
+
+ /**
+ * The type of change.
+ */
+ readonly type: FileChangeType;
+
+ /**
+ * The uri of the file that has changed.
+ */
+ readonly uri: Uri;
+ }
+
+ /**
+ * The filesystem provider defines what the editor needs to read, write, discover,
+ * and to manage files and folders. It allows extensions to serve files from remote places,
+ * like ftp-servers, and to seamlessly integrate those into the editor.
+ *
+ * * *Note 1:* The filesystem provider API works with [uris](#Uri) and assumes hierarchical
+ * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`.
+ * * *Note 2:* There is an activation event `onFileSystem:` that fires when a file
+ * or folder is being accessed.
+ * * *Note 3:* The word 'file' is often used to denote all [kinds](#FileType) of files, e.g.
+ * folders, symbolic links, and regular files.
+ */
+ export interface FileSystemProvider {
+
+ /**
+ * An event to signal that a resource has been created, changed, or deleted. This
+ * event should fire for resources that are being [watched](#FileSystemProvider.watch)
+ * by clients of this provider.
+ */
+ readonly onDidChangeFile: Event;
+
+ /**
+ * Subscribe to events in the file or folder denoted by `uri`.
+ *
+ * The editor will call this function for files and folders. In the latter case, the
+ * options differ from defaults, e.g. what files/folders to exclude from watching
+ * and if subfolders, sub-subfolder, etc. should be watched (`recursive`).
+ *
+ * @param uri The uri of the file to be watched.
+ * @param options Configures the watch.
+ * @returns A disposable that tells the provider to stop watching the `uri`.
+ */
+ watch(uri: Uri, options: { recursive: boolean; excludes: string[] }): Disposable;
+
+ /**
+ * Retrieve metadata about a file.
+ *
+ * Note that the metadata for symbolic links should be the metadata of the file they refer to.
+ * Still, the [SymbolicLink](#FileType.SymbolicLink)-type must be used in addition to the actual type, e.g.
+ * `FileType.SymbolicLink | FileType.Directory`.
+ *
+ * @param uri The uri of the file to retrieve metadata about.
+ * @return The file metadata about the file.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist.
+ */
+ stat(uri: Uri): FileStat | Thenable;
+
+ /**
+ * Retrieve all entries of a [directory](#FileType.Directory).
+ *
+ * @param uri The uri of the folder.
+ * @return An array of name/type-tuples or a thenable that resolves to such.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist.
+ */
+ readDirectory(uri: Uri): [string, FileType][] | Thenable<[string, FileType][]>;
+
+ /**
+ * Create a new directory (Note, that new files are created via `write`-calls).
+ *
+ * @param uri The uri of the new folder.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist, e.g. no mkdirp-logic required.
+ * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists.
+ * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient.
+ */
+ createDirectory(uri: Uri): void | Thenable;
+
+ /**
+ * Read the entire contents of a file.
+ *
+ * @param uri The uri of the file.
+ * @return An array of bytes or a thenable that resolves to such.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist.
+ */
+ readFile(uri: Uri): Uint8Array | Thenable;
+
+ /**
+ * Write data to a file, replacing its entire contents.
+ *
+ * @param uri The uri of the file.
+ * @param content The new content of the file.
+ * @param options Defines if missing files should or must be created.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set, e.g. no mkdirp-logic required.
+ * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists, `create` is set but `overwrite` is not set.
+ * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient.
+ */
+ writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void | Thenable;
+
+ /**
+ * Delete a file.
+ *
+ * @param uri The resource that is to be deleted.
+ * @param options Defines if deletion of folders is recursive.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist.
+ * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient.
+ */
+ delete(uri: Uri, options: { recursive: boolean }): void | Thenable;
+
+ /**
+ * Rename a file or folder.
+ *
+ * @param oldUri The existing file.
+ * @param newUri The new location.
+ * @param options Defines if existing files should be overwritten.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist, e.g. no mkdirp-logic required.
+ * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`.
+ * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient.
+ */
+ rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void | Thenable;
+
+ /**
+ * Copy files or folders. Implementing this function is optional but it will speedup
+ * the copy operation.
+ *
+ * @param source The existing file.
+ * @param destination The destination location.
+ * @param options Defines if existing files should be overwritten.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist.
+ * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist, e.g. no mkdirp-logic required.
+ * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`.
+ * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient.
+ */
+ copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): void | Thenable;
+ }
+
+ /**
+ * The file system interface exposes the editor's built-in and contributed
+ * [file system providers](#FileSystemProvider). It allows extensions to work
+ * with files from the local disk as well as files from remote places, like the
+ * remote extension host or ftp-servers.
+ *
+ * *Note* that an instance of this interface is avaiable as [`workspace.fs`](#workspace.fs).
+ */
+ export interface FileSystem {
+
+ /**
+ * Retrieve metadata about a file.
+ *
+ * @param uri The uri of the file to retrieve metadata about.
+ * @return The file metadata about the file.
+ */
+ stat(uri: Uri): Thenable;
+
+ /**
+ * Retrieve all entries of a [directory](#FileType.Directory).
+ *
+ * @param uri The uri of the folder.
+ * @return An array of name/type-tuples or a thenable that resolves to such.
+ */
+ readDirectory(uri: Uri): Thenable<[string, FileType][]>;
+
+ /**
+ * Create a new directory (Note, that new files are created via `write`-calls).
+ *
+ * @param uri The uri of the new folder.
+ */
+ createDirectory(uri: Uri): Thenable;
+
+ /**
+ * Read the entire contents of a file.
+ *
+ * @param uri The uri of the file.
+ * @return An array of bytes or a thenable that resolves to such.
+ */
+ readFile(uri: Uri): Thenable;
+
+ /**
+ * Write data to a file, replacing its entire contents.
+ *
+ * @param uri The uri of the file.
+ * @param content The new content of the file.
+ */
+ writeFile(uri: Uri, content: Uint8Array): Thenable;
+
+ /**
+ * Delete a file.
+ *
+ * @param uri The resource that is to be deleted.
+ * @param options Defines if trash can should be used and if deletion of folders is recursive
+ */
+ delete(uri: Uri, options?: { recursive?: boolean, useTrash?: boolean }): Thenable;
+
+ /**
+ * Rename a file or folder.
+ *
+ * @param oldUri The existing file.
+ * @param newUri The new location.
+ * @param options Defines if existing files should be overwritten.
+ */
+ rename(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable;
+
+ /**
+ * Copy files or folders.
+ *
+ * @param source The existing file.
+ * @param destination The destination location.
+ * @param options Defines if existing files should be overwritten.
+ */
+ copy(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable;
+ }
+
+ /**
+ * Defines a port mapping used for localhost inside the webview.
+ */
+ export interface WebviewPortMapping {
+ /**
+ * Localhost port to remap inside the webview.
+ */
+ readonly webviewPort: number;
+
+ /**
+ * Destination port. The `webviewPort` is resolved to this port.
+ */
+ readonly extensionHostPort: number;
+ }
+
+ /**
+ * Content settings for a webview.
+ */
+ export interface WebviewOptions {
+ /**
+ * Controls whether scripts are enabled in the webview content or not.
+ *
+ * Defaults to false (scripts-disabled).
+ */
+ readonly enableScripts?: boolean;
+
+ /**
+ * Controls whether command uris are enabled in webview content or not.
+ *
+ * Defaults to false.
+ */
+ readonly enableCommandUris?: boolean;
+
+ /**
+ * Root paths from which the webview can load local (filesystem) resources using the `vscode-resource:` scheme.
+ *
+ * Default to the root folders of the current workspace plus the extension's install directory.
+ *
+ * Pass in an empty array to disallow access to any local resources.
+ */
+ readonly localResourceRoots?: ReadonlyArray;
+
+ /**
+ * Mappings of localhost ports used inside the webview.
+ *
+ * Port mapping allow webviews to transparently define how localhost ports are resolved. This can be used
+ * to allow using a static localhost port inside the webview that is resolved to random port that a service is
+ * running on.
+ *
+ * If a webview accesses localhost content, we recommend that you specify port mappings even if
+ * the `webviewPort` and `extensionHostPort` ports are the same.
+ *
+ * *Note* that port mappings only work for `http` or `https` urls. Websocket urls (e.g. `ws://localhost:3000`)
+ * cannot be mapped to another port.
+ */
+ readonly portMapping?: ReadonlyArray;
+ }
+
+ /**
+ * A webview displays html content, like an iframe.
+ */
+ export interface Webview {
+ /**
+ * Content settings for the webview.
+ */
+ options: WebviewOptions;
+
+ /**
+ * Contents of the webview.
+ *
+ * Should be a complete html document.
+ */
+ html: string;
+
+ /**
+ * Fired when the webview content posts a message.
+ */
+ readonly onDidReceiveMessage: Event;
+
+ /**
+ * Post a message to the webview content.
+ *
+ * Messages are only delivered if the webview is visible.
+ *
+ * @param message Body of the message.
+ */
+ postMessage(message: any): Thenable;
+ }
+
+ /**
+ * Content settings for a webview panel.
+ */
+ export interface WebviewPanelOptions {
+ /**
+ * Controls if the find widget is enabled in the panel.
+ *
+ * Defaults to false.
+ */
+ readonly enableFindWidget?: boolean;
+
+ /**
+ * Controls if the webview panel's content (iframe) is kept around even when the panel
+ * is no longer visible.
+ *
+ * Normally the webview panel's html context is created when the panel becomes visible
+ * and destroyed when it is hidden. Extensions that have complex state
+ * or UI can set the `retainContextWhenHidden` to make VS Code keep the webview
+ * context around, even when the webview moves to a background tab. When a webview using
+ * `retainContextWhenHidden` becomes hidden, its scripts and other dynamic content are suspended.
+ * When the panel becomes visible again, the context is automatically restored
+ * in the exact same state it was in originally. You cannot send messages to a
+ * hidden webview, even with `retainContextWhenHidden` enabled.
+ *
+ * `retainContextWhenHidden` has a high memory overhead and should only be used if
+ * your panel's context cannot be quickly saved and restored.
+ */
+ readonly retainContextWhenHidden?: boolean;
+ }
+
+ /**
+ * A panel that contains a webview.
+ */
+ interface WebviewPanel {
+ /**
+ * Identifies the type of the webview panel, such as `'markdown.preview'`.
+ */
+ readonly viewType: string;
+
+ /**
+ * Title of the panel shown in UI.
+ */
+ title: string;
+
+ /**
+ * Icon for the panel shown in UI.
+ */
+ iconPath?: Uri | { light: Uri; dark: Uri };
+
+ /**
+ * Webview belonging to the panel.
+ */
+ readonly webview: Webview;
+
+ /**
+ * Content settings for the webview panel.
+ */
+ readonly options: WebviewPanelOptions;
+
+ /**
+ * Editor position of the panel. This property is only set if the webview is in
+ * one of the editor view columns.
+ */
+ readonly viewColumn?: ViewColumn;
+
+ /**
+ * Whether the panel is active (focused by the user).
+ */
+ readonly active: boolean;
+
+ /**
+ * Whether the panel is visible.
+ */
+ readonly visible: boolean;
+
+ /**
+ * Fired when the panel's view state changes.
+ */
+ readonly onDidChangeViewState: Event;
+
+ /**
+ * Fired when the panel is disposed.
+ *
+ * This may be because the user closed the panel or because `.dispose()` was
+ * called on it.
+ *
+ * Trying to use the panel after it has been disposed throws an exception.
+ */
+ readonly onDidDispose: Event;
+
+ /**
+ * Show the webview panel in a given column.
+ *
+ * A webview panel may only show in a single column at a time. If it is already showing, this
+ * method moves it to a new column.
+ *
+ * @param viewColumn View column to show the panel in. Shows in the current `viewColumn` if undefined.
+ * @param preserveFocus When `true`, the webview will not take focus.
+ */
+ reveal(viewColumn?: ViewColumn, preserveFocus?: boolean): void;
+
+ /**
+ * Dispose of the webview panel.
+ *
+ * This closes the panel if it showing and disposes of the resources owned by the webview.
+ * Webview panels are also disposed when the user closes the webview panel. Both cases
+ * fire the `onDispose` event.
+ */
+ dispose(): any;
+ }
+
+ /**
+ * Event fired when a webview panel's view state changes.
+ */
+ export interface WebviewPanelOnDidChangeViewStateEvent {
+ /**
+ * Webview panel whose view state changed.
+ */
+ readonly webviewPanel: WebviewPanel;
+ }
+
+ /**
+ * Restore webview panels that have been persisted when vscode shuts down.
+ *
+ * There are two types of webview persistence:
+ *
+ * - Persistence within a session.
+ * - Persistence across sessions (across restarts of VS Code).
+ *
+ * A `WebviewPanelSerializer` is only required for the second case: persisting a webview across sessions.
+ *
+ * Persistence within a session allows a webview to save its state when it becomes hidden
+ * and restore its content from this state when it becomes visible again. It is powered entirely
+ * by the webview content itself. To save off a persisted state, call `acquireVsCodeApi().setState()` with
+ * any json serializable object. To restore the state again, call `getState()`
+ *
+ * ```js
+ * // Within the webview
+ * const vscode = acquireVsCodeApi();
+ *
+ * // Get existing state
+ * const oldState = vscode.getState() || { value: 0 };
+ *
+ * // Update state
+ * setState({ value: oldState.value + 1 })
+ * ```
+ *
+ * A `WebviewPanelSerializer` extends this persistence across restarts of VS Code. When the editor is shutdown,
+ * VS Code will save off the state from `setState` of all webviews that have a serializer. When the
+ * webview first becomes visible after the restart, this state is passed to `deserializeWebviewPanel`.
+ * The extension can then restore the old `WebviewPanel` from this state.
+ */
+ interface WebviewPanelSerializer {
+ /**
+ * Restore a webview panel from its serialized `state`.
+ *
+ * Called when a serialized webview first becomes visible.
+ *
+ * @param webviewPanel Webview panel to restore. The serializer should take ownership of this panel. The
+ * serializer must restore the webview's `.html` and hook up all webview events.
+ * @param state Persisted state from the webview content.
+ *
+ * @return Thenable indicating that the webview has been fully restored.
+ */
+ deserializeWebviewPanel(webviewPanel: WebviewPanel, state: any): Thenable;
+ }
+
+ /**
+ * The clipboard provides read and write access to the system's clipboard.
+ */
+ export interface Clipboard {
+
+ /**
+ * Read the current clipboard contents as text.
+ * @returns A thenable that resolves to a string.
+ */
+ readText(): Thenable;
+
+ /**
+ * Writes text into the clipboard.
+ * @returns A thenable that resolves when writing happened.
+ */
+ writeText(value: string): Thenable;
+ }
+
+ /**
+ * Namespace describing the environment the editor runs in.
+ */
+ export namespace env {
+
+ /**
+ * The application name of the editor, like 'VS Code'.
+ */
+ export const appName: string;
+
+ /**
+ * The application root folder from which the editor is running.
+ */
+ export const appRoot: string;
+
+ /**
+ * The custom uri scheme the editor registers to in the operating system.
+ */
+ export const uriScheme: string;
+
+ /**
+ * Represents the preferred user-language, like `de-CH`, `fr`, or `en-US`.
+ */
+ export const language: string;
+
+ /**
+ * The system clipboard.
+ */
+ export const clipboard: Clipboard;
+
+ /**
+ * A unique identifier for the computer.
+ */
+ export const machineId: string;
+
+ /**
+ * A unique identifier for the current session.
+ * Changes each time the editor is started.
+ */
+ export const sessionId: string;
+
+ /**
+ * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows
+ * Subsystem for Linux or `ssh-remote` for remotes using a secure shell.
+ *
+ * *Note* that the value is `undefined` when there is no remote extension host but that the
+ * value is defined in all extension hosts (local and remote) in case a remote extension host
+ * exists. Use [`Extension#extensionKind`](#Extension.extensionKind) to know if
+ * a specific extension runs remote or not.
+ */
+ export const remoteName: string | undefined;
+
+ /**
+ * The detected default shell for the extension host, this is overridden by the
+ * `terminal.integrated.shell` setting for the extension host's platform.
+ */
+ export const shell: string;
+
+ /**
+ * Opens an *external* item, e.g. a http(s) or mailto-link, using the
+ * default application.
+ *
+ * *Note* that [`showTextDocument`](#window.showTextDocument) is the right
+ * way to open a text document inside the editor, not this function.
+ *
+ * @param target The uri that should be opened.
+ * @returns A promise indicating if open was successful.
+ */
+ export function openExternal(target: Uri): Thenable;
+ }
+
+ /**
+ * Namespace for dealing with commands. In short, a command is a function with a
+ * unique identifier. The function is sometimes also called _command handler_.
+ *
+ * Commands can be added to the editor using the [registerCommand](#commands.registerCommand)
+ * and [registerTextEditorCommand](#commands.registerTextEditorCommand) functions. Commands
+ * can be executed [manually](#commands.executeCommand) or from a UI gesture. Those are:
+ *
+ * * palette - Use the `commands`-section in `package.json` to make a command show in
+ * the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette).
+ * * keybinding - Use the `keybindings`-section in `package.json` to enable
+ * [keybindings](https://code.visualstudio.com/docs/getstarted/keybindings#_customizing-shortcuts)
+ * for your extension.
+ *
+ * Commands from other extensions and from the editor itself are accessible to an extension. However,
+ * when invoking an editor command not all argument types are supported.
+ *
+ * This is a sample that registers a command handler and adds an entry for that command to the palette. First
+ * register a command handler with the identifier `extension.sayHello`.
+ * ```javascript
+ * commands.registerCommand('extension.sayHello', () => {
+ * window.showInformationMessage('Hello World!');
+ * });
+ * ```
+ * Second, bind the command identifier to a title under which it will show in the palette (`package.json`).
+ * ```json
+ * {
+ * "contributes": {
+ * "commands": [{
+ * "command": "extension.sayHello",
+ * "title": "Hello World"
+ * }]
+ * }
+ * }
+ * ```
+ */
+ export namespace commands {
+
+ /**
+ * Registers a command that can be invoked via a keyboard shortcut,
+ * a menu item, an action, or directly.
+ *
+ * Registering a command with an existing command identifier twice
+ * will cause an error.
+ *
+ * @param command A unique identifier for the command.
+ * @param callback A command handler function.
+ * @param thisArg The `this` context used when invoking the handler function.
+ * @return Disposable which unregisters this command on disposal.
+ */
+ export function registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): Disposable;
+
+ /**
+ * Registers a text editor command that can be invoked via a keyboard shortcut,
+ * a menu item, an action, or directly.
+ *
+ * Text editor commands are different from ordinary [commands](#commands.registerCommand) as
+ * they only execute when there is an active editor when the command is called. Also, the
+ * command handler of an editor command has access to the active editor and to an
+ * [edit](#TextEditorEdit)-builder.
+ *
+ * @param command A unique identifier for the command.
+ * @param callback A command handler function with access to an [editor](#TextEditor) and an [edit](#TextEditorEdit).
+ * @param thisArg The `this` context used when invoking the handler function.
+ * @return Disposable which unregisters this command on disposal.
+ */
+ export function registerTextEditorCommand(command: string, callback: (textEditor: TextEditor, edit: TextEditorEdit, ...args: any[]) => void, thisArg?: any): Disposable;
+
+ /**
+ * Executes the command denoted by the given command identifier.
+ *
+ * * *Note 1:* When executing an editor command not all types are allowed to
+ * be passed as arguments. Allowed are the primitive types `string`, `boolean`,
+ * `number`, `undefined`, and `null`, as well as [`Position`](#Position), [`Range`](#Range), [`Uri`](#Uri) and [`Location`](#Location).
+ * * *Note 2:* There are no restrictions when executing commands that have been contributed
+ * by extensions.
+ *
+ * @param command Identifier of the command to execute.
+ * @param rest Parameters passed to the command function.
+ * @return A thenable that resolves to the returned value of the given command. `undefined` when
+ * the command handler function doesn't return anything.
+ */
+ export function executeCommand(command: string, ...rest: any[]): Thenable;
+
+ /**
+ * Retrieve the list of all available commands. Commands starting an underscore are
+ * treated as internal commands.
+ *
+ * @param filterInternal Set `true` to not see internal commands (starting with an underscore)
+ * @return Thenable that resolves to a list of command ids.
+ */
+ export function getCommands(filterInternal?: boolean): Thenable;
+ }
+
+ /**
+ * Represents the state of a window.
+ */
+ export interface WindowState {
+
+ /**
+ * Whether the current window is focused.
+ */
+ readonly focused: boolean;
+ }
+
+ /**
+ * A uri handler is responsible for handling system-wide [uris](#Uri).
+ *
+ * @see [window.registerUriHandler](#window.registerUriHandler).
+ */
+ export interface UriHandler {
+
+ /**
+ * Handle the provided system-wide [uri](#Uri).
+ *
+ * @see [window.registerUriHandler](#window.registerUriHandler).
+ */
+ handleUri(uri: Uri): ProviderResult;
+ }
+
+ /**
+ * Namespace for dealing with the current window of the editor. That is visible
+ * and active editors, as well as, UI elements to show messages, selections, and
+ * asking for user input.
+ */
+ export namespace window {
+
+ /**
+ * The currently active editor or `undefined`. The active editor is the one
+ * that currently has focus or, when none has focus, the one that has changed
+ * input most recently.
+ */
+ export let activeTextEditor: TextEditor | undefined;
+
+ /**
+ * The currently visible editors or an empty array.
+ */
+ export let visibleTextEditors: TextEditor[];
+
+ /**
+ * An [event](#Event) which fires when the [active editor](#window.activeTextEditor)
+ * has changed. *Note* that the event also fires when the active editor changes
+ * to `undefined`.
+ */
+ export const onDidChangeActiveTextEditor: Event;
+
+ /**
+ * An [event](#Event) which fires when the array of [visible editors](#window.visibleTextEditors)
+ * has changed.
+ */
+ export const onDidChangeVisibleTextEditors: Event;
+
+ /**
+ * An [event](#Event) which fires when the selection in an editor has changed.
+ */
+ export const onDidChangeTextEditorSelection: Event;
+
+ /**
+ * An [event](#Event) which fires when the visible ranges of an editor has changed.
+ */
+ export const onDidChangeTextEditorVisibleRanges: Event;
+
+ /**
+ * An [event](#Event) which fires when the options of an editor have changed.
+ */
+ export const onDidChangeTextEditorOptions: Event;
+
+ /**
+ * An [event](#Event) which fires when the view column of an editor has changed.
+ */
+ export const onDidChangeTextEditorViewColumn: Event;
+
+ /**
+ * The currently opened terminals or an empty array.
+ */
+ export const terminals: ReadonlyArray;
+
+ /**
+ * The currently active terminal or `undefined`. The active terminal is the one that
+ * currently has focus or most recently had focus.
+ */
+ export const activeTerminal: Terminal | undefined;
+
+ /**
+ * An [event](#Event) which fires when the [active terminal](#window.activeTerminal)
+ * has changed. *Note* that the event also fires when the active terminal changes
+ * to `undefined`.
+ */
+ export const onDidChangeActiveTerminal: Event;
+
+ /**
+ * An [event](#Event) which fires when a terminal has been created, either through the
+ * [createTerminal](#window.createTerminal) API or commands.
+ */
+ export const onDidOpenTerminal: Event;
+
+ /**
+ * An [event](#Event) which fires when a terminal is disposed.
+ */
+ export const onDidCloseTerminal: Event;
+
+ /**
+ * Represents the current window's state.
+ */
+ export const state: WindowState;
+
+ /**
+ * An [event](#Event) which fires when the focus state of the current window
+ * changes. The value of the event represents whether the window is focused.
+ */
+ export const onDidChangeWindowState: Event;
+
+ /**
+ * Show the given document in a text editor. A [column](#ViewColumn) can be provided
+ * to control where the editor is being shown. Might change the [active editor](#window.activeTextEditor).
+ *
+ * @param document A text document to be shown.
+ * @param column A view column in which the [editor](#TextEditor) should be shown. The default is the [active](#ViewColumn.Active), other values
+ * are adjusted to be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is not adjusted. Use [`ViewColumn.Beside`](#ViewColumn.Beside)
+ * to open the editor to the side of the currently active one.
+ * @param preserveFocus When `true` the editor will not take focus.
+ * @return A promise that resolves to an [editor](#TextEditor).
+ */
+ export function showTextDocument(document: TextDocument, column?: ViewColumn, preserveFocus?: boolean): Thenable;
+
+ /**
+ * Show the given document in a text editor. [Options](#TextDocumentShowOptions) can be provided
+ * to control options of the editor is being shown. Might change the [active editor](#window.activeTextEditor).
+ *
+ * @param document A text document to be shown.
+ * @param options [Editor options](#TextDocumentShowOptions) to configure the behavior of showing the [editor](#TextEditor).
+ * @return A promise that resolves to an [editor](#TextEditor).
+ */
+ export function showTextDocument(document: TextDocument, options?: TextDocumentShowOptions): Thenable;
+
+ /**
+ * A short-hand for `openTextDocument(uri).then(document => showTextDocument(document, options))`.
+ *
+ * @see [openTextDocument](#openTextDocument)
+ *
+ * @param uri A resource identifier.
+ * @param options [Editor options](#TextDocumentShowOptions) to configure the behavior of showing the [editor](#TextEditor).
+ * @return A promise that resolves to an [editor](#TextEditor).
+ */
+ export function showTextDocument(uri: Uri, options?: TextDocumentShowOptions): Thenable;
+
+ /**
+ * Create a TextEditorDecorationType that can be used to add decorations to text editors.
+ *
+ * @param options Rendering options for the decoration type.
+ * @return A new decoration type instance.
+ */
+ export function createTextEditorDecorationType(options: DecorationRenderOptions): TextEditorDecorationType;
+
+ /**
+ * Show an information message to users. Optionally provide an array of items which will be presented as
+ * clickable buttons.
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showInformationMessage(message: string, ...items: string[]): Thenable;
+
+ /**
+ * Show an information message to users. Optionally provide an array of items which will be presented as
+ * clickable buttons.
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showInformationMessage(message: string, options: MessageOptions, ...items: string[]): Thenable;
+
+ /**
+ * Show an information message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showInformationMessage(message: string, ...items: T[]): Thenable;
+
+ /**
+ * Show an information message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showInformationMessage(message: string, options: MessageOptions, ...items: T[]): Thenable;
+
+ /**
+ * Show a warning message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showWarningMessage(message: string, ...items: string[]): Thenable;
+
+ /**
+ * Show a warning message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showWarningMessage(message: string, options: MessageOptions, ...items: string[]): Thenable;
+
+ /**
+ * Show a warning message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showWarningMessage(message: string, ...items: T[]): Thenable;
+
+ /**
+ * Show a warning message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showWarningMessage(message: string, options: MessageOptions, ...items: T[]): Thenable;
+
+ /**
+ * Show an error message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showErrorMessage(message: string, ...items: string[]): Thenable;
+
+ /**
+ * Show an error message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showErrorMessage(message: string, options: MessageOptions, ...items: string[]): Thenable;
+
+ /**
+ * Show an error message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showErrorMessage(message: string, ...items: T[]): Thenable;
+
+ /**
+ * Show an error message.
+ *
+ * @see [showInformationMessage](#window.showInformationMessage)
+ *
+ * @param message The message to show.
+ * @param options Configures the behaviour of the message.
+ * @param items A set of items that will be rendered as actions in the message.
+ * @return A thenable that resolves to the selected item or `undefined` when being dismissed.
+ */
+ export function showErrorMessage(message: string, options: MessageOptions, ...items: T[]): Thenable;
+
+ /**
+ * Shows a selection list allowing multiple selections.
+ *
+ * @param items An array of strings, or a promise that resolves to an array of strings.
+ * @param options Configures the behavior of the selection list.
+ * @param token A token that can be used to signal cancellation.
+ * @return A promise that resolves to the selected items or `undefined`.
+ */
+ export function showQuickPick(items: string[] | Thenable, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Thenable;
+
+ /**
+ * Shows a selection list.
+ *
+ * @param items An array of strings, or a promise that resolves to an array of strings.
+ * @param options Configures the behavior of the selection list.
+ * @param token A token that can be used to signal cancellation.
+ * @return A promise that resolves to the selection or `undefined`.
+ */
+ export function showQuickPick(items: string[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable;
+
+ /**
+ * Shows a selection list allowing multiple selections.
+ *
+ * @param items An array of items, or a promise that resolves to an array of items.
+ * @param options Configures the behavior of the selection list.
+ * @param token A token that can be used to signal cancellation.
+ * @return A promise that resolves to the selected items or `undefined`.
+ */
+ export function showQuickPick(items: T[] | Thenable, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Thenable;
+
+ /**
+ * Shows a selection list.
+ *
+ * @param items An array of items, or a promise that resolves to an array of items.
+ * @param options Configures the behavior of the selection list.
+ * @param token A token that can be used to signal cancellation.
+ * @return A promise that resolves to the selected item or `undefined`.
+ */
+ export function showQuickPick(items: T[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable;
+
+ /**
+ * Shows a selection list of [workspace folders](#workspace.workspaceFolders) to pick from.
+ * Returns `undefined` if no folder is open.
+ *
+ * @param options Configures the behavior of the workspace folder list.
+ * @return A promise that resolves to the workspace folder or `undefined`.
+ */
+ export function showWorkspaceFolderPick(options?: WorkspaceFolderPickOptions): Thenable;
+
+ /**
+ * Shows a file open dialog to the user which allows to select a file
+ * for opening-purposes.
+ *
+ * @param options Options that control the dialog.
+ * @returns A promise that resolves to the selected resources or `undefined`.
+ */
+ export function showOpenDialog(options: OpenDialogOptions): Thenable;
+
+ /**
+ * Shows a file save dialog to the user which allows to select a file
+ * for saving-purposes.
+ *
+ * @param options Options that control the dialog.
+ * @returns A promise that resolves to the selected resource or `undefined`.
+ */
+ export function showSaveDialog(options: SaveDialogOptions): Thenable;
+
+ /**
+ * Opens an input box to ask the user for input.
+ *
+ * The returned value will be `undefined` if the input box was canceled (e.g. pressing ESC). Otherwise the
+ * returned value will be the string typed by the user or an empty string if the user did not type
+ * anything but dismissed the input box with OK.
+ *
+ * @param options Configures the behavior of the input box.
+ * @param token A token that can be used to signal cancellation.
+ * @return A promise that resolves to a string the user provided or to `undefined` in case of dismissal.
+ */
+ export function showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable;
+
+ /**
+ * Creates a [QuickPick](#QuickPick) to let the user pick an item from a list
+ * of items of type T.
+ *
+ * Note that in many cases the more convenient [window.showQuickPick](#window.showQuickPick)
+ * is easier to use. [window.createQuickPick](#window.createQuickPick) should be used
+ * when [window.showQuickPick](#window.showQuickPick) does not offer the required flexibility.
+ *
+ * @return A new [QuickPick](#QuickPick).
+ */
+ export function createQuickPick(): QuickPick;
+
+ /**
+ * Creates a [InputBox](#InputBox) to let the user enter some text input.
+ *
+ * Note that in many cases the more convenient [window.showInputBox](#window.showInputBox)
+ * is easier to use. [window.createInputBox](#window.createInputBox) should be used
+ * when [window.showInputBox](#window.showInputBox) does not offer the required flexibility.
+ *
+ * @return A new [InputBox](#InputBox).
+ */
+ export function createInputBox(): InputBox;
+
+ /**
+ * Creates a new [output channel](#OutputChannel) with the given name.
+ *
+ * @param name Human-readable string which will be used to represent the channel in the UI.
+ */
+ export function createOutputChannel(name: string): OutputChannel;
+
+ /**
+ * Create and show a new webview panel.
+ *
+ * @param viewType Identifies the type of the webview panel.
+ * @param title Title of the panel.
+ * @param showOptions Where to show the webview in the editor. If preserveFocus is set, the new webview will not take focus.
+ * @param options Settings for the new panel.
+ *
+ * @return New webview panel.
+ */
+ export function createWebviewPanel(viewType: string, title: string, showOptions: ViewColumn | { viewColumn: ViewColumn, preserveFocus?: boolean }, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel;
+
+ /**
+ * Set a message to the status bar. This is a short hand for the more powerful
+ * status bar [items](#window.createStatusBarItem).
+ *
+ * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text).
+ * @param hideAfterTimeout Timeout in milliseconds after which the message will be disposed.
+ * @return A disposable which hides the status bar message.
+ */
+ export function setStatusBarMessage(text: string, hideAfterTimeout: number): Disposable;
+
+ /**
+ * Set a message to the status bar. This is a short hand for the more powerful
+ * status bar [items](#window.createStatusBarItem).
+ *
+ * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text).
+ * @param hideWhenDone Thenable on which completion (resolve or reject) the message will be disposed.
+ * @return A disposable which hides the status bar message.
+ */
+ export function setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable;
+
+ /**
+ * Set a message to the status bar. This is a short hand for the more powerful
+ * status bar [items](#window.createStatusBarItem).
+ *
+ * *Note* that status bar messages stack and that they must be disposed when no
+ * longer used.
+ *
+ * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text).
+ * @return A disposable which hides the status bar message.
+ */
+ export function setStatusBarMessage(text: string): Disposable;
+
+ /**
+ * ~~Show progress in the Source Control viewlet while running the given callback and while
+ * its returned promise isn't resolve or rejected.~~
+ *
+ * @deprecated Use `withProgress` instead.
+ *
+ * @param task A callback returning a promise. Progress increments can be reported with
+ * the provided [progress](#Progress)-object.
+ * @return The thenable the task did return.
+ */
+ export function withScmProgress(task: (progress: Progress) => Thenable): Thenable;
+
+ /**
+ * Show progress in the editor. Progress is shown while running the given callback
+ * and while the promise it returned isn't resolved nor rejected. The location at which
+ * progress should show (and other details) is defined via the passed [`ProgressOptions`](#ProgressOptions).
+ *
+ * @param task A callback returning a promise. Progress state can be reported with
+ * the provided [progress](#Progress)-object.
+ *
+ * To report discrete progress, use `increment` to indicate how much work has been completed. Each call with
+ * a `increment` value will be summed up and reflected as overall progress until 100% is reached (a value of
+ * e.g. `10` accounts for `10%` of work done).
+ * Note that currently only `ProgressLocation.Notification` is capable of showing discrete progress.
+ *
+ * To monitor if the operation has been cancelled by the user, use the provided [`CancellationToken`](#CancellationToken).
+ * Note that currently only `ProgressLocation.Notification` is supporting to show a cancel button to cancel the
+ * long running operation.
+ *
+ * @return The thenable the task-callback returned.
+ */
+ export function withProgress(options: ProgressOptions, task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable): Thenable;
+
+ /**
+ * Creates a status bar [item](#StatusBarItem).
+ *
+ * @param alignment The alignment of the item.
+ * @param priority The priority of the item. Higher values mean the item should be shown more to the left.
+ * @return A new status bar item.
+ */
+ export function createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem;
+
+ /**
+ * Creates a [Terminal](#Terminal). The cwd of the terminal will be the workspace directory
+ * if it exists, regardless of whether an explicit customStartPath setting exists.
+ *
+ * @param name Optional human-readable string which will be used to represent the terminal in the UI.
+ * @param shellPath Optional path to a custom shell executable to be used in the terminal.
+ * @param shellArgs Optional args for the custom shell executable. A string can be used on Windows only which
+ * allows specifying shell args in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6).
+ * @return A new Terminal.
+ */
+ export function createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): Terminal;
+
+ /**
+ * Creates a [Terminal](#Terminal). The cwd of the terminal will be the workspace directory
+ * if it exists, regardless of whether an explicit customStartPath setting exists.
+ *
+ * @param options A TerminalOptions object describing the characteristics of the new terminal.
+ * @return A new Terminal.
+ */
+ export function createTerminal(options: TerminalOptions): Terminal;
+
+ /**
+ * Register a [TreeDataProvider](#TreeDataProvider) for the view contributed using the extension point `views`.
+ * This will allow you to contribute data to the [TreeView](#TreeView) and update if the data changes.
+ *
+ * **Note:** To get access to the [TreeView](#TreeView) and perform operations on it, use [createTreeView](#window.createTreeView).
+ *
+ * @param viewId Id of the view contributed using the extension point `views`.
+ * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view
+ */
+ export function registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): Disposable;
+
+ /**
+ * Create a [TreeView](#TreeView) for the view contributed using the extension point `views`.
+ * @param viewId Id of the view contributed using the extension point `views`.
+ * @param options Options for creating the [TreeView](#TreeView)
+ * @returns a [TreeView](#TreeView).
+ */
+ export function createTreeView(viewId: string, options: TreeViewOptions): TreeView;
+
+ /**
+ * Registers a [uri handler](#UriHandler) capable of handling system-wide [uris](#Uri).
+ * In case there are multiple windows open, the topmost window will handle the uri.
+ * A uri handler is scoped to the extension it is contributed from; it will only
+ * be able to handle uris which are directed to the extension itself. A uri must respect
+ * the following rules:
+ *
+ * - The uri-scheme must be `vscode.env.uriScheme`;
+ * - The uri-authority must be the extension id (e.g. `my.extension`);
+ * - The uri-path, -query and -fragment parts are arbitrary.
+ *
+ * For example, if the `my.extension` extension registers a uri handler, it will only
+ * be allowed to handle uris with the prefix `product-name://my.extension`.
+ *
+ * An extension can only register a single uri handler in its entire activation lifetime.
+ *
+ * * *Note:* There is an activation event `onUri` that fires when a uri directed for
+ * the current extension is about to be handled.
+ *
+ * @param handler The uri handler to register for this extension.
+ */
+ export function registerUriHandler(handler: UriHandler): Disposable;
+
+ /**
+ * Registers a webview panel serializer.
+ *
+ * Extensions that support reviving should have an `"onWebviewPanel:viewType"` activation event and
+ * make sure that [registerWebviewPanelSerializer](#registerWebviewPanelSerializer) is called during activation.
+ *
+ * Only a single serializer may be registered at a time for a given `viewType`.
+ *
+ * @param viewType Type of the webview panel that can be serialized.
+ * @param serializer Webview serializer.
+ */
+ export function registerWebviewPanelSerializer(viewType: string, serializer: WebviewPanelSerializer): Disposable;
+ }
+
+ /**
+ * Options for creating a [TreeView](#TreeView)
+ */
+ export interface TreeViewOptions {
+
+ /**
+ * A data provider that provides tree data.
+ */
+ treeDataProvider: TreeDataProvider;
+
+ /**
+ * Whether to show collapse all action or not.
+ */
+ showCollapseAll?: boolean;
+ }
+
+ /**
+ * The event that is fired when an element in the [TreeView](#TreeView) is expanded or collapsed
+ */
+ export interface TreeViewExpansionEvent {
+
+ /**
+ * Element that is expanded or collapsed.
+ */
+ readonly element: T;
+
+ }
+
+ /**
+ * The event that is fired when there is a change in [tree view's selection](#TreeView.selection)
+ */
+ export interface TreeViewSelectionChangeEvent {
+
+ /**
+ * Selected elements.
+ */
+ readonly selection: T[];
+
+ }
+
+ /**
+ * The event that is fired when there is a change in [tree view's visibility](#TreeView.visible)
+ */
+ export interface TreeViewVisibilityChangeEvent {
+
+ /**
+ * `true` if the [tree view](#TreeView) is visible otherwise `false`.
+ */
+ readonly visible: boolean;
+
+ }
+
+ /**
+ * Represents a Tree view
+ */
+ export interface TreeView extends Disposable {
+
+ /**
+ * Event that is fired when an element is expanded
+ */
+ readonly onDidExpandElement: Event>;
+
+ /**
+ * Event that is fired when an element is collapsed
+ */
+ readonly onDidCollapseElement: Event>;
+
+ /**
+ * Currently selected elements.
+ */
+ readonly selection: T[];
+
+ /**
+ * Event that is fired when the [selection](#TreeView.selection) has changed
+ */
+ readonly onDidChangeSelection: Event>;
+
+ /**
+ * `true` if the [tree view](#TreeView) is visible otherwise `false`.
+ */
+ readonly visible: boolean;
+
+ /**
+ * Event that is fired when [visibility](#TreeView.visible) has changed
+ */
+ readonly onDidChangeVisibility: Event;
+
+ /**
+ * Reveals the given element in the tree view.
+ * If the tree view is not visible then the tree view is shown and element is revealed.
+ *
+ * By default revealed element is selected.
+ * In order to not to select, set the option `select` to `false`.
+ * In order to focus, set the option `focus` to `true`.
+ * In order to expand the revealed element, set the option `expand` to `true`. To expand recursively set `expand` to the number of levels to expand.
+ * **NOTE:** You can expand only to 3 levels maximum.
+ *
+ * **NOTE:** [TreeDataProvider](#TreeDataProvider) is required to implement [getParent](#TreeDataProvider.getParent) method to access this API.
+ */
+ reveal(element: T, options?: { select?: boolean, focus?: boolean, expand?: boolean | number }): Thenable;
+ }
+
+ /**
+ * A data provider that provides tree data
+ */
+ export interface TreeDataProvider {
+ /**
+ * An optional event to signal that an element or root has changed.
+ * This will trigger the view to update the changed element/root and its children recursively (if shown).
+ * To signal that root has changed, do not pass any argument or pass `undefined` or `null`.
+ */
+ onDidChangeTreeData?: Event;
+
+ /**
+ * Get [TreeItem](#TreeItem) representation of the `element`
+ *
+ * @param element The element for which [TreeItem](#TreeItem) representation is asked for.
+ * @return [TreeItem](#TreeItem) representation of the element
+ */
+ getTreeItem(element: T): TreeItem | Thenable;
+
+ /**
+ * Get the children of `element` or root if no element is passed.
+ *
+ * @param element The element from which the provider gets children. Can be `undefined`.
+ * @return Children of `element` or root if no element is passed.
+ */
+ getChildren(element?: T): ProviderResult;
+
+ /**
+ * Optional method to return the parent of `element`.
+ * Return `null` or `undefined` if `element` is a child of root.
+ *
+ * **NOTE:** This method should be implemented in order to access [reveal](#TreeView.reveal) API.
+ *
+ * @param element The element for which the parent has to be returned.
+ * @return Parent of `element`.
+ */
+ getParent?(element: T): ProviderResult;
+ }
+
+ export class TreeItem {
+ /**
+ * A human-readable string describing this item. When `falsy`, it is derived from [resourceUri](#TreeItem.resourceUri).
+ */
+ label?: string;
+
+ /**
+ * Optional id for the tree item that has to be unique across tree. The id is used to preserve the selection and expansion state of the tree item.
+ *
+ * If not provided, an id is generated using the tree item's label. **Note** that when labels change, ids will change and that selection and expansion state cannot be kept stable anymore.
+ */
+ id?: string;
+
+ /**
+ * The icon path or [ThemeIcon](#ThemeIcon) for the tree item.
+ * When `falsy`, [Folder Theme Icon](#ThemeIcon.Folder) is assigned, if item is collapsible otherwise [File Theme Icon](#ThemeIcon.File).
+ * When a [ThemeIcon](#ThemeIcon) is specified, icon is derived from the current file icon theme for the specified theme icon using [resourceUri](#TreeItem.resourceUri) (if provided).
+ */
+ iconPath?: string | Uri | { light: string | Uri; dark: string | Uri } | ThemeIcon;
+
+ /**
+ * A human readable string which is rendered less prominent.
+ * When `true`, it is derived from [resourceUri](#TreeItem.resourceUri) and when `falsy`, it is not shown.
+ */
+ description?: string | boolean;
+
+ /**
+ * The [uri](#Uri) of the resource representing this item.
+ *
+ * Will be used to derive the [label](#TreeItem.label), when it is not provided.
+ * Will be used to derive the icon from current icon theme, when [iconPath](#TreeItem.iconPath) has [ThemeIcon](#ThemeIcon) value.
+ */
+ resourceUri?: Uri;
+
+ /**
+ * The tooltip text when you hover over this item.
+ */
+ tooltip?: string | undefined;
+
+ /**
+ * The [command](#Command) that should be executed when the tree item is selected.
+ */
+ command?: Command;
+
+ /**
+ * [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item.
+ */
+ collapsibleState?: TreeItemCollapsibleState;
+
+ /**
+ * Context value of the tree item. This can be used to contribute item specific actions in the tree.
+ * For example, a tree item is given a context value as `folder`. When contributing actions to `view/item/context`
+ * using `menus` extension point, you can specify context value for key `viewItem` in `when` expression like `viewItem == folder`.
+ * ```
+ * "contributes": {
+ * "menus": {
+ * "view/item/context": [
+ * {
+ * "command": "extension.deleteFolder",
+ * "when": "viewItem == folder"
+ * }
+ * ]
+ * }
+ * }
+ * ```
+ * This will show action `extension.deleteFolder` only for items with `contextValue` is `folder`.
+ */
+ contextValue?: string;
+
+ /**
+ * @param label A human-readable string describing this item
+ * @param collapsibleState [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None)
+ */
+ constructor(label: string, collapsibleState?: TreeItemCollapsibleState);
+
+ /**
+ * @param resourceUri The [uri](#Uri) of the resource representing this item.
+ * @param collapsibleState [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None)
+ */
+ constructor(resourceUri: Uri, collapsibleState?: TreeItemCollapsibleState);
+ }
+
+ /**
+ * Collapsible state of the tree item
+ */
+ export enum TreeItemCollapsibleState {
+ /**
+ * Determines an item can be neither collapsed nor expanded. Implies it has no children.
+ */
+ None = 0,
+ /**
+ * Determines an item is collapsed
+ */
+ Collapsed = 1,
+ /**
+ * Determines an item is expanded
+ */
+ Expanded = 2
+ }
+
+ /**
+ * Value-object describing what options a terminal should use.
+ */
+ export interface TerminalOptions {
+ /**
+ * A human-readable string which will be used to represent the terminal in the UI.
+ */
+ name?: string;
+
+ /**
+ * A path to a custom shell executable to be used in the terminal.
+ */
+ shellPath?: string;
+
+ /**
+ * Args for the custom shell executable. A string can be used on Windows only which allows
+ * specifying shell args in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6).
+ */
+ shellArgs?: string[] | string;
+
+ /**
+ * A path or Uri for the current working directory to be used for the terminal.
+ */
+ cwd?: string | Uri;
+
+ /**
+ * Object with environment variables that will be added to the VS Code process.
+ */
+ env?: { [key: string]: string | null };
+
+ /**
+ * Whether the terminal process environment should be exactly as provided in
+ * `TerminalOptions.env`. When this is false (default), the environment will be based on the
+ * window's environment and also apply configured platform settings like
+ * `terminal.integrated.windows.env` on top. When this is true, the complete environment
+ * must be provided as nothing will be inherited from the process or any configuration.
+ */
+ strictEnv?: boolean;
+
+ /**
+ * When enabled the terminal will run the process as normal but not be surfaced to the user
+ * until `Terminal.show` is called. The typical usage for this is when you need to run
+ * something that may need interactivity but only want to tell the user about it when
+ * interaction is needed. Note that the terminals will still be exposed to all extensions
+ * as normal.
+ */
+ hideFromUser?: boolean;
+ }
+
+ /**
+ * A location in the editor at which progress information can be shown. It depends on the
+ * location how progress is visually represented.
+ */
+ export enum ProgressLocation {
+
+ /**
+ * Show progress for the source control viewlet, as overlay for the icon and as progress bar
+ * inside the viewlet (when visible). Neither supports cancellation nor discrete progress.
+ */
+ SourceControl = 1,
+
+ /**
+ * Show progress in the status bar of the editor. Neither supports cancellation nor discrete progress.
+ */
+ Window = 10,
+
+ /**
+ * Show progress as notification with an optional cancel button. Supports to show infinite and discrete progress.
+ */
+ Notification = 15
+ }
+
+ /**
+ * Value-object describing where and how progress should show.
+ */
+ export interface ProgressOptions {
+
+ /**
+ * The location at which progress should show.
+ */
+ location: ProgressLocation;
+
+ /**
+ * A human-readable string which will be used to describe the
+ * operation.
+ */
+ title?: string;
+
+ /**
+ * Controls if a cancel button should show to allow the user to
+ * cancel the long running operation. Note that currently only
+ * `ProgressLocation.Notification` is supporting to show a cancel
+ * button.
+ */
+ cancellable?: boolean;
+ }
+
+ /**
+ * A light-weight user input UI that is initially not visible. After
+ * configuring it through its properties the extension can make it
+ * visible by calling [QuickInput.show](#QuickInput.show).
+ *
+ * There are several reasons why this UI might have to be hidden and
+ * the extension will be notified through [QuickInput.onDidHide](#QuickInput.onDidHide).
+ * (Examples include: an explicit call to [QuickInput.hide](#QuickInput.hide),
+ * the user pressing Esc, some other input UI opening, etc.)
+ *
+ * A user pressing Enter or some other gesture implying acceptance
+ * of the current state does not automatically hide this UI component.
+ * It is up to the extension to decide whether to accept the user's input
+ * and if the UI should indeed be hidden through a call to [QuickInput.hide](#QuickInput.hide).
+ *
+ * When the extension no longer needs this input UI, it should
+ * [QuickInput.dispose](#QuickInput.dispose) it to allow for freeing up
+ * any resources associated with it.
+ *
+ * See [QuickPick](#QuickPick) and [InputBox](#InputBox) for concrete UIs.
+ */
+ export interface QuickInput {
+
+ /**
+ * An optional title.
+ */
+ title: string | undefined;
+
+ /**
+ * An optional current step count.
+ */
+ step: number | undefined;
+
+ /**
+ * An optional total step count.
+ */
+ totalSteps: number | undefined;
+
+ /**
+ * If the UI should allow for user input. Defaults to true.
+ *
+ * Change this to false, e.g., while validating user input or
+ * loading data for the next step in user input.
+ */
+ enabled: boolean;
+
+ /**
+ * If the UI should show a progress indicator. Defaults to false.
+ *
+ * Change this to true, e.g., while loading more data or validating
+ * user input.
+ */
+ busy: boolean;
+
+ /**
+ * If the UI should stay open even when loosing UI focus. Defaults to false.
+ */
+ ignoreFocusOut: boolean;
+
+ /**
+ * Makes the input UI visible in its current configuration. Any other input
+ * UI will first fire an [QuickInput.onDidHide](#QuickInput.onDidHide) event.
+ */
+ show(): void;
+
+ /**
+ * Hides this input UI. This will also fire an [QuickInput.onDidHide](#QuickInput.onDidHide)
+ * event.
+ */
+ hide(): void;
+
+ /**
+ * An event signaling when this input UI is hidden.
+ *
+ * There are several reasons why this UI might have to be hidden and
+ * the extension will be notified through [QuickInput.onDidHide](#QuickInput.onDidHide).
+ * (Examples include: an explicit call to [QuickInput.hide](#QuickInput.hide),
+ * the user pressing Esc, some other input UI opening, etc.)
+ */
+ onDidHide: Event;
+
+ /**
+ * Dispose of this input UI and any associated resources. If it is still
+ * visible, it is first hidden. After this call the input UI is no longer
+ * functional and no additional methods or properties on it should be
+ * accessed. Instead a new input UI should be created.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * A concrete [QuickInput](#QuickInput) to let the user pick an item from a
+ * list of items of type T. The items can be filtered through a filter text field and
+ * there is an option [canSelectMany](#QuickPick.canSelectMany) to allow for
+ * selecting multiple items.
+ *
+ * Note that in many cases the more convenient [window.showQuickPick](#window.showQuickPick)
+ * is easier to use. [window.createQuickPick](#window.createQuickPick) should be used
+ * when [window.showQuickPick](#window.showQuickPick) does not offer the required flexibility.
+ */
+ export interface QuickPick extends QuickInput {
+
+ /**
+ * Current value of the filter text.
+ */
+ value: string;
+
+ /**
+ * Optional placeholder in the filter text.
+ */
+ placeholder: string | undefined;
+
+ /**
+ * An event signaling when the value of the filter text has changed.
+ */
+ readonly onDidChangeValue: Event;
+
+ /**
+ * An event signaling when the user indicated acceptance of the selected item(s).
+ */
+ readonly onDidAccept: Event;
+
+ /**
+ * Buttons for actions in the UI.
+ */
+ buttons: ReadonlyArray;
+
+ /**
+ * An event signaling when a button was triggered.
+ */
+ readonly onDidTriggerButton: Event;
+
+ /**
+ * Items to pick from.
+ */
+ items: ReadonlyArray;
+
+ /**
+ * If multiple items can be selected at the same time. Defaults to false.
+ */
+ canSelectMany: boolean;
+
+ /**
+ * If the filter text should also be matched against the description of the items. Defaults to false.
+ */
+ matchOnDescription: boolean;
+
+ /**
+ * If the filter text should also be matched against the detail of the items. Defaults to false.
+ */
+ matchOnDetail: boolean;
+
+ /**
+ * Active items. This can be read and updated by the extension.
+ */
+ activeItems: ReadonlyArray;
+
+ /**
+ * An event signaling when the active items have changed.
+ */
+ readonly onDidChangeActive: Event;
+
+ /**
+ * Selected items. This can be read and updated by the extension.
+ */
+ selectedItems: ReadonlyArray;
+
+ /**
+ * An event signaling when the selected items have changed.
+ */
+ readonly onDidChangeSelection: Event;
+ }
+
+ /**
+ * A concrete [QuickInput](#QuickInput) to let the user input a text value.
+ *
+ * Note that in many cases the more convenient [window.showInputBox](#window.showInputBox)
+ * is easier to use. [window.createInputBox](#window.createInputBox) should be used
+ * when [window.showInputBox](#window.showInputBox) does not offer the required flexibility.
+ */
+ export interface InputBox extends QuickInput {
+
+ /**
+ * Current input value.
+ */
+ value: string;
+
+ /**
+ * Optional placeholder in the filter text.
+ */
+ placeholder: string | undefined;
+
+ /**
+ * If the input value should be hidden. Defaults to false.
+ */
+ password: boolean;
+
+ /**
+ * An event signaling when the value has changed.
+ */
+ readonly onDidChangeValue: Event;
+
+ /**
+ * An event signaling when the user indicated acceptance of the input value.
+ */
+ readonly onDidAccept: Event;
+
+ /**
+ * Buttons for actions in the UI.
+ */
+ buttons: ReadonlyArray;
+
+ /**
+ * An event signaling when a button was triggered.
+ */
+ readonly onDidTriggerButton: Event;
+
+ /**
+ * An optional prompt text providing some ask or explanation to the user.
+ */
+ prompt: string | undefined;
+
+ /**
+ * An optional validation message indicating a problem with the current input value.
+ */
+ validationMessage: string | undefined;
+ }
+
+ /**
+ * Button for an action in a [QuickPick](#QuickPick) or [InputBox](#InputBox).
+ */
+ export interface QuickInputButton {
+
+ /**
+ * Icon for the button.
+ */
+ readonly iconPath: Uri | { light: Uri; dark: Uri } | ThemeIcon;
+
+ /**
+ * An optional tooltip.
+ */
+ readonly tooltip?: string | undefined;
+ }
+
+ /**
+ * Predefined buttons for [QuickPick](#QuickPick) and [InputBox](#InputBox).
+ */
+ export class QuickInputButtons {
+
+ /**
+ * A back button for [QuickPick](#QuickPick) and [InputBox](#InputBox).
+ *
+ * When a navigation 'back' button is needed this one should be used for consistency.
+ * It comes with a predefined icon, tooltip and location.
+ */
+ static readonly Back: QuickInputButton;
+
+ /**
+ * @hidden
+ */
+ private constructor();
+ }
+
+ /**
+ * An event describing an individual change in the text of a [document](#TextDocument).
+ */
+ export interface TextDocumentContentChangeEvent {
+ /**
+ * The range that got replaced.
+ */
+ range: Range;
+ /**
+ * The offset of the range that got replaced.
+ */
+ rangeOffset: number;
+ /**
+ * The length of the range that got replaced.
+ */
+ rangeLength: number;
+ /**
+ * The new text for the range.
+ */
+ text: string;
+ }
+
+ /**
+ * An event describing a transactional [document](#TextDocument) change.
+ */
+ export interface TextDocumentChangeEvent {
+
+ /**
+ * The affected document.
+ */
+ readonly document: TextDocument;
+
+ /**
+ * An array of content changes.
+ */
+ readonly contentChanges: ReadonlyArray;
+ }
+
+ /**
+ * Represents reasons why a text document is saved.
+ */
+ export enum TextDocumentSaveReason {
+
+ /**
+ * Manually triggered, e.g. by the user pressing save, by starting debugging,
+ * or by an API call.
+ */
+ Manual = 1,
+
+ /**
+ * Automatic after a delay.
+ */
+ AfterDelay = 2,
+
+ /**
+ * When the editor lost focus.
+ */
+ FocusOut = 3
+ }
+
+ /**
+ * An event that is fired when a [document](#TextDocument) will be saved.
+ *
+ * To make modifications to the document before it is being saved, call the
+ * [`waitUntil`](#TextDocumentWillSaveEvent.waitUntil)-function with a thenable
+ * that resolves to an array of [text edits](#TextEdit).
+ */
+ export interface TextDocumentWillSaveEvent {
+
+ /**
+ * The document that will be saved.
+ */
+ readonly document: TextDocument;
+
+ /**
+ * The reason why save was triggered.
+ */
+ readonly reason: TextDocumentSaveReason;
+
+ /**
+ * Allows to pause the event loop and to apply [pre-save-edits](#TextEdit).
+ * Edits of subsequent calls to this function will be applied in order. The
+ * edits will be *ignored* if concurrent modifications of the document happened.
+ *
+ * *Note:* This function can only be called during event dispatch and not
+ * in an asynchronous manner:
+ *
+ * ```ts
+ * workspace.onWillSaveTextDocument(event => {
+ * // async, will *throw* an error
+ * setTimeout(() => event.waitUntil(promise));
+ *
+ * // sync, OK
+ * event.waitUntil(promise);
+ * })
+ * ```
+ *
+ * @param thenable A thenable that resolves to [pre-save-edits](#TextEdit).
+ */
+ waitUntil(thenable: Thenable): void;
+
+ /**
+ * Allows to pause the event loop until the provided thenable resolved.
+ *
+ * *Note:* This function can only be called during event dispatch.
+ *
+ * @param thenable A thenable that delays saving.
+ */
+ waitUntil(thenable: Thenable): void;
+ }
+
+ /**
+ * An event describing a change to the set of [workspace folders](#workspace.workspaceFolders).
+ */
+ export interface WorkspaceFoldersChangeEvent {
+ /**
+ * Added workspace folders.
+ */
+ readonly added: ReadonlyArray;
+
+ /**
+ * Removed workspace folders.
+ */
+ readonly removed: ReadonlyArray;
+ }
+
+ /**
+ * A workspace folder is one of potentially many roots opened by the editor. All workspace folders
+ * are equal which means there is no notion of an active or master workspace folder.
+ */
+ export interface WorkspaceFolder {
+
+ /**
+ * The associated uri for this workspace folder.
+ *
+ * *Note:* The [Uri](#Uri)-type was intentionally chosen such that future releases of the editor can support
+ * workspace folders that are not stored on the local disk, e.g. `ftp://server/workspaces/foo`.
+ */
+ readonly uri: Uri;
+
+ /**
+ * The name of this workspace folder. Defaults to
+ * the basename of its [uri-path](#Uri.path)
+ */
+ readonly name: string;
+
+ /**
+ * The ordinal number of this workspace folder.
+ */
+ readonly index: number;
+ }
+
+ /**
+ * Namespace for dealing with the current workspace. A workspace is the representation
+ * of the folder that has been opened. There is no workspace when just a file but not a
+ * folder has been opened.
+ *
+ * The workspace offers support for [listening](#workspace.createFileSystemWatcher) to fs
+ * events and for [finding](#workspace.findFiles) files. Both perform well and run _outside_
+ * the editor-process so that they should be always used instead of nodejs-equivalents.
+ */
+ export namespace workspace {
+
+ /**
+ * A [file system](#FileSystem) instance that allows to interact with local and remote
+ * files, e.g. `vscode.workspace.fs.readDirectory(someUri)` allows to retrieve all entries
+ * of a directory or `vscode.workspace.fs.stat(anotherUri)` returns the meta data for a
+ * file.
+ */
+ export const fs: FileSystem;
+
+ /**
+ * ~~The folder that is open in the editor. `undefined` when no folder
+ * has been opened.~~
+ *
+ * @deprecated Use [`workspaceFolders`](#workspace.workspaceFolders) instead.
+ */
+ export const rootPath: string | undefined;
+
+ /**
+ * List of workspace folders or `undefined` when no folder is open.
+ * *Note* that the first entry corresponds to the value of `rootPath`.
+ */
+ export const workspaceFolders: WorkspaceFolder[] | undefined;
+
+ /**
+ * The name of the workspace. `undefined` when no folder
+ * has been opened.
+ */
+ export const name: string | undefined;
+
+ /**
+ * The location of the workspace file, for example:
+ *
+ * `file:///Users/name/Development/myProject.code-workspace`
+ *
+ * or
+ *
+ * `untitled:1555503116870`
+ *
+ * for a workspace that is untitled and not yet saved.
+ *
+ * Depending on the workspace that is opened, the value will be:
+ * * `undefined` when no workspace or a single folder is opened
+ * * the path of the workspace file as `Uri` otherwise. if the workspace
+ * is untitled, the returned URI will use the `untitled:` scheme
+ *
+ * The location can e.g. be used with the `vscode.openFolder` command to
+ * open the workspace again after it has been closed.
+ *
+ * **Example:**
+ * ```typescript
+ * vscode.commands.executeCommand('vscode.openFolder', uriOfWorkspace);
+ * ```
+ *
+ * **Note:** it is not advised to use `workspace.workspaceFile` to write
+ * configuration data into the file. You can use `workspace.getConfiguration().update()`
+ * for that purpose which will work both when a single folder is opened as
+ * well as an untitled or saved workspace.
+ */
+ export const workspaceFile: Uri | undefined;
+
+ /**
+ * An event that is emitted when a workspace folder is added or removed.
+ */
+ export const onDidChangeWorkspaceFolders: Event;
+
+ /**
+ * Returns the [workspace folder](#WorkspaceFolder) that contains a given uri.
+ * * returns `undefined` when the given uri doesn't match any workspace folder
+ * * returns the *input* when the given uri is a workspace folder itself
+ *
+ * @param uri An uri.
+ * @return A workspace folder or `undefined`
+ */
+ export function getWorkspaceFolder(uri: Uri): WorkspaceFolder | undefined;
+
+ /**
+ * Returns a path that is relative to the workspace folder or folders.
+ *
+ * When there are no [workspace folders](#workspace.workspaceFolders) or when the path
+ * is not contained in them, the input is returned.
+ *
+ * @param pathOrUri A path or uri. When a uri is given its [fsPath](#Uri.fsPath) is used.
+ * @param includeWorkspaceFolder When `true` and when the given path is contained inside a
+ * workspace folder the name of the workspace is prepended. Defaults to `true` when there are
+ * multiple workspace folders and `false` otherwise.
+ * @return A path relative to the root or the input.
+ */
+ export function asRelativePath(pathOrUri: string | Uri, includeWorkspaceFolder?: boolean): string;
+
+ /**
+ * This method replaces `deleteCount` [workspace folders](#workspace.workspaceFolders) starting at index `start`
+ * by an optional set of `workspaceFoldersToAdd` on the `vscode.workspace.workspaceFolders` array. This "splice"
+ * behavior can be used to add, remove and change workspace folders in a single operation.
+ *
+ * If the first workspace folder is added, removed or changed, the currently executing extensions (including the
+ * one that called this method) will be terminated and restarted so that the (deprecated) `rootPath` property is
+ * updated to point to the first workspace folder.
+ *
+ * Use the [`onDidChangeWorkspaceFolders()`](#onDidChangeWorkspaceFolders) event to get notified when the
+ * workspace folders have been updated.
+ *
+ * **Example:** adding a new workspace folder at the end of workspace folders
+ * ```typescript
+ * workspace.updateWorkspaceFolders(workspace.workspaceFolders ? workspace.workspaceFolders.length : 0, null, { uri: ...});
+ * ```
+ *
+ * **Example:** removing the first workspace folder
+ * ```typescript
+ * workspace.updateWorkspaceFolders(0, 1);
+ * ```
+ *
+ * **Example:** replacing an existing workspace folder with a new one
+ * ```typescript
+ * workspace.updateWorkspaceFolders(0, 1, { uri: ...});
+ * ```
+ *
+ * It is valid to remove an existing workspace folder and add it again with a different name
+ * to rename that folder.
+ *
+ * **Note:** it is not valid to call [updateWorkspaceFolders()](#updateWorkspaceFolders) multiple times
+ * without waiting for the [`onDidChangeWorkspaceFolders()`](#onDidChangeWorkspaceFolders) to fire.
+ *
+ * @param start the zero-based location in the list of currently opened [workspace folders](#WorkspaceFolder)
+ * from which to start deleting workspace folders.
+ * @param deleteCount the optional number of workspace folders to remove.
+ * @param workspaceFoldersToAdd the optional variable set of workspace folders to add in place of the deleted ones.
+ * Each workspace is identified with a mandatory URI and an optional name.
+ * @return true if the operation was successfully started and false otherwise if arguments were used that would result
+ * in invalid workspace folder state (e.g. 2 folders with the same URI).
+ */
+ export function updateWorkspaceFolders(start: number, deleteCount: number | undefined | null, ...workspaceFoldersToAdd: { uri: Uri, name?: string }[]): boolean;
+
+ /**
+ * Creates a file system watcher.
+ *
+ * A glob pattern that filters the file events on their absolute path must be provided. Optionally,
+ * flags to ignore certain kinds of events can be provided. To stop listening to events the watcher must be disposed.
+ *
+ * *Note* that only files within the current [workspace folders](#workspace.workspaceFolders) can be watched.
+ *
+ * @param globPattern A [glob pattern](#GlobPattern) that is applied to the absolute paths of created, changed,
+ * and deleted files. Use a [relative pattern](#RelativePattern) to limit events to a certain [workspace folder](#WorkspaceFolder).
+ * @param ignoreCreateEvents Ignore when files have been created.
+ * @param ignoreChangeEvents Ignore when files have been changed.
+ * @param ignoreDeleteEvents Ignore when files have been deleted.
+ * @return A new file system watcher instance.
+ */
+ export function createFileSystemWatcher(globPattern: GlobPattern, ignoreCreateEvents?: boolean, ignoreChangeEvents?: boolean, ignoreDeleteEvents?: boolean): FileSystemWatcher;
+
+ /**
+ * Find files across all [workspace folders](#workspace.workspaceFolders) in the workspace.
+ *
+ * @sample `findFiles('**/*.js', '**/node_modules/**', 10)`
+ * @param include A [glob pattern](#GlobPattern) that defines the files to search for. The glob pattern
+ * will be matched against the file paths of resulting matches relative to their workspace. Use a [relative pattern](#RelativePattern)
+ * to restrict the search results to a [workspace folder](#WorkspaceFolder).
+ * @param exclude A [glob pattern](#GlobPattern) that defines files and folders to exclude. The glob pattern
+ * will be matched against the file paths of resulting matches relative to their workspace. When `undefined` only default excludes will
+ * apply, when `null` no excludes will apply.
+ * @param maxResults An upper-bound for the result.
+ * @param token A token that can be used to signal cancellation to the underlying search engine.
+ * @return A thenable that resolves to an array of resource identifiers. Will return no results if no
+ * [workspace folders](#workspace.workspaceFolders) are opened.
+ */
+ export function findFiles(include: GlobPattern, exclude?: GlobPattern | null, maxResults?: number, token?: CancellationToken): Thenable;
+
+ /**
+ * Save all dirty files.
+ *
+ * @param includeUntitled Also save files that have been created during this session.
+ * @return A thenable that resolves when the files have been saved.
+ */
+ export function saveAll(includeUntitled?: boolean): Thenable;
+
+ /**
+ * Make changes to one or many resources or create, delete, and rename resources as defined by the given
+ * [workspace edit](#WorkspaceEdit).
+ *
+ * All changes of a workspace edit are applied in the same order in which they have been added. If
+ * multiple textual inserts are made at the same position, these strings appear in the resulting text
+ * in the order the 'inserts' were made. Invalid sequences like 'delete file a' -> 'insert text in file a'
+ * cause failure of the operation.
+ *
+ * When applying a workspace edit that consists only of text edits an 'all-or-nothing'-strategy is used.
+ * A workspace edit with resource creations or deletions aborts the operation, e.g. consecutive edits will
+ * not be attempted, when a single edit fails.
+ *
+ * @param edit A workspace edit.
+ * @return A thenable that resolves when the edit could be applied.
+ */
+ export function applyEdit(edit: WorkspaceEdit): Thenable;
+
+ /**
+ * All text documents currently known to the system.
+ */
+ export const textDocuments: TextDocument[];
+
+ /**
+ * Opens a document. Will return early if this document is already open. Otherwise
+ * the document is loaded and the [didOpen](#workspace.onDidOpenTextDocument)-event fires.
+ *
+ * The document is denoted by an [uri](#Uri). Depending on the [scheme](#Uri.scheme) the
+ * following rules apply:
+ * * `file`-scheme: Open a file on disk, will be rejected if the file does not exist or cannot be loaded.
+ * * `untitled`-scheme: A new file that should be saved on disk, e.g. `untitled:c:\frodo\new.js`. The language
+ * will be derived from the file name.
+ * * For all other schemes the registered text document content [providers](#TextDocumentContentProvider) are consulted.
+ *
+ * *Note* that the lifecycle of the returned document is owned by the editor and not by the extension. That means an
+ * [`onDidClose`](#workspace.onDidCloseTextDocument)-event can occur at any time after opening it.
+ *
+ * @param uri Identifies the resource to open.
+ * @return A promise that resolves to a [document](#TextDocument).
+ */
+ export function openTextDocument(uri: Uri): Thenable;
+
+ /**
+ * A short-hand for `openTextDocument(Uri.file(fileName))`.
+ *
+ * @see [openTextDocument](#openTextDocument)
+ * @param fileName A name of a file on disk.
+ * @return A promise that resolves to a [document](#TextDocument).
+ */
+ export function openTextDocument(fileName: string): Thenable;
+
+ /**
+ * Opens an untitled text document. The editor will prompt the user for a file
+ * path when the document is to be saved. The `options` parameter allows to
+ * specify the *language* and/or the *content* of the document.
+ *
+ * @param options Options to control how the document will be created.
+ * @return A promise that resolves to a [document](#TextDocument).
+ */
+ export function openTextDocument(options?: { language?: string; content?: string; }): Thenable;
+
+ /**
+ * Register a text document content provider.
+ *
+ * Only one provider can be registered per scheme.
+ *
+ * @param scheme The uri-scheme to register for.
+ * @param provider A content provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable;
+
+ /**
+ * An event that is emitted when a [text document](#TextDocument) is opened or when the language id
+ * of a text document [has been changed](#languages.setTextDocumentLanguage).
+ *
+ * To add an event listener when a visible text document is opened, use the [TextEditor](#TextEditor) events in the
+ * [window](#window) namespace. Note that:
+ *
+ * - The event is emitted before the [document](#TextDocument) is updated in the
+ * [active text editor](#window.activeTextEditor)
+ * - When a [text document](#TextDocument) is already open (e.g.: open in another [visible text editor](#window.visibleTextEditors)) this event is not emitted
+ *
+ */
+ export const onDidOpenTextDocument: Event;
+
+ /**
+ * An event that is emitted when a [text document](#TextDocument) is disposed or when the language id
+ * of a text document [has been changed](#languages.setTextDocumentLanguage).
+ *
+ * To add an event listener when a visible text document is closed, use the [TextEditor](#TextEditor) events in the
+ * [window](#window) namespace. Note that this event is not emitted when a [TextEditor](#TextEditor) is closed
+ * but the document remains open in another [visible text editor](#window.visibleTextEditors).
+ */
+ export const onDidCloseTextDocument: Event;
+
+ /**
+ * An event that is emitted when a [text document](#TextDocument) is changed. This usually happens
+ * when the [contents](#TextDocument.getText) changes but also when other things like the
+ * [dirty](#TextDocument.isDirty)-state changes.
+ */
+ export const onDidChangeTextDocument: Event;
+
+ /**
+ * An event that is emitted when a [text document](#TextDocument) will be saved to disk.
+ *
+ * *Note 1:* Subscribers can delay saving by registering asynchronous work. For the sake of data integrity the editor
+ * might save without firing this event. For instance when shutting down with dirty files.
+ *
+ * *Note 2:* Subscribers are called sequentially and they can [delay](#TextDocumentWillSaveEvent.waitUntil) saving
+ * by registering asynchronous work. Protection against misbehaving listeners is implemented as such:
+ * * there is an overall time budget that all listeners share and if that is exhausted no further listener is called
+ * * listeners that take a long time or produce errors frequently will not be called anymore
+ *
+ * The current thresholds are 1.5 seconds as overall time budget and a listener can misbehave 3 times before being ignored.
+ */
+ export const onWillSaveTextDocument: Event;
+
+ /**
+ * An event that is emitted when a [text document](#TextDocument) is saved to disk.
+ */
+ export const onDidSaveTextDocument: Event;
+
+ /**
+ * Get a workspace configuration object.
+ *
+ * When a section-identifier is provided only that part of the configuration
+ * is returned. Dots in the section-identifier are interpreted as child-access,
+ * like `{ myExt: { setting: { doIt: true }}}` and `getConfiguration('myExt.setting').get('doIt') === true`.
+ *
+ * When a resource is provided, configuration scoped to that resource is returned.
+ *
+ * @param section A dot-separated identifier.
+ * @param resource A resource for which the configuration is asked for
+ * @return The full configuration or a subset.
+ */
+ export function getConfiguration(section?: string, resource?: Uri | null): WorkspaceConfiguration;
+
+ /**
+ * An event that is emitted when the [configuration](#WorkspaceConfiguration) changed.
+ */
+ export const onDidChangeConfiguration: Event;
+
+ /**
+ * ~~Register a task provider.~~
+ *
+ * @deprecated Use the corresponding function on the `tasks` namespace instead
+ *
+ * @param type The task kind type this provider is registered for.
+ * @param provider A task provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerTaskProvider(type: string, provider: TaskProvider): Disposable;
+
+ /**
+ * Register a filesystem provider for a given scheme, e.g. `ftp`.
+ *
+ * There can only be one provider per scheme and an error is being thrown when a scheme
+ * has been claimed by another provider or when it is reserved.
+ *
+ * @param scheme The uri-[scheme](#Uri.scheme) the provider registers for.
+ * @param provider The filesystem provider.
+ * @param options Immutable metadata about the provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { isCaseSensitive?: boolean, isReadonly?: boolean }): Disposable;
+ }
+
+ /**
+ * An event describing the change in Configuration
+ */
+ export interface ConfigurationChangeEvent {
+
+ /**
+ * Returns `true` if the given section for the given resource (if provided) is affected.
+ *
+ * @param section Configuration name, supports _dotted_ names.
+ * @param resource A resource Uri.
+ * @return `true` if the given section for the given resource (if provided) is affected.
+ */
+ affectsConfiguration(section: string, resource?: Uri): boolean;
+ }
+
+ /**
+ * Namespace for participating in language-specific editor [features](https://code.visualstudio.com/docs/editor/editingevolved),
+ * like IntelliSense, code actions, diagnostics etc.
+ *
+ * Many programming languages exist and there is huge variety in syntaxes, semantics, and paradigms. Despite that, features
+ * like automatic word-completion, code navigation, or code checking have become popular across different tools for different
+ * programming languages.
+ *
+ * The editor provides an API that makes it simple to provide such common features by having all UI and actions already in place and
+ * by allowing you to participate by providing data only. For instance, to contribute a hover all you have to do is provide a function
+ * that can be called with a [TextDocument](#TextDocument) and a [Position](#Position) returning hover info. The rest, like tracking the
+ * mouse, positioning the hover, keeping the hover stable etc. is taken care of by the editor.
+ *
+ * ```javascript
+ * languages.registerHoverProvider('javascript', {
+ * provideHover(document, position, token) {
+ * return new Hover('I am a hover!');
+ * }
+ * });
+ * ```
+ *
+ * Registration is done using a [document selector](#DocumentSelector) which is either a language id, like `javascript` or
+ * a more complex [filter](#DocumentFilter) like `{ language: 'typescript', scheme: 'file' }`. Matching a document against such
+ * a selector will result in a [score](#languages.match) that is used to determine if and how a provider shall be used. When
+ * scores are equal the provider that came last wins. For features that allow full arity, like [hover](#languages.registerHoverProvider),
+ * the score is only checked to be `>0`, for other features, like [IntelliSense](#languages.registerCompletionItemProvider) the
+ * score is used for determining the order in which providers are asked to participate.
+ */
+ export namespace languages {
+
+ /**
+ * Return the identifiers of all known languages.
+ * @return Promise resolving to an array of identifier strings.
+ */
+ export function getLanguages(): Thenable;
+
+ /**
+ * Set (and change) the [language](#TextDocument.languageId) that is associated
+ * with the given document.
+ *
+ * *Note* that calling this function will trigger the [`onDidCloseTextDocument`](#workspace.onDidCloseTextDocument) event
+ * followed by the [`onDidOpenTextDocument`](#workspace.onDidOpenTextDocument) event.
+ *
+ * @param document The document which language is to be changed
+ * @param languageId The new language identifier.
+ * @returns A thenable that resolves with the updated document.
+ */
+ export function setTextDocumentLanguage(document: TextDocument, languageId: string): Thenable;
+
+ /**
+ * Compute the match between a document [selector](#DocumentSelector) and a document. Values
+ * greater than zero mean the selector matches the document.
+ *
+ * A match is computed according to these rules:
+ * 1. When [`DocumentSelector`](#DocumentSelector) is an array, compute the match for each contained `DocumentFilter` or language identifier and take the maximum value.
+ * 2. A string will be desugared to become the `language`-part of a [`DocumentFilter`](#DocumentFilter), so `"fooLang"` is like `{ language: "fooLang" }`.
+ * 3. A [`DocumentFilter`](#DocumentFilter) will be matched against the document by comparing its parts with the document. The following rules apply:
+ * 1. When the `DocumentFilter` is empty (`{}`) the result is `0`
+ * 2. When `scheme`, `language`, or `pattern` are defined but one doesn’t match, the result is `0`
+ * 3. Matching against `*` gives a score of `5`, matching via equality or via a glob-pattern gives a score of `10`
+ * 4. The result is the maximum value of each match
+ *
+ * Samples:
+ * ```js
+ * // default document from disk (file-scheme)
+ * doc.uri; //'file:///my/file.js'
+ * doc.languageId; // 'javascript'
+ * match('javascript', doc); // 10;
+ * match({language: 'javascript'}, doc); // 10;
+ * match({language: 'javascript', scheme: 'file'}, doc); // 10;
+ * match('*', doc); // 5
+ * match('fooLang', doc); // 0
+ * match(['fooLang', '*'], doc); // 5
+ *
+ * // virtual document, e.g. from git-index
+ * doc.uri; // 'git:/my/file.js'
+ * doc.languageId; // 'javascript'
+ * match('javascript', doc); // 10;
+ * match({language: 'javascript', scheme: 'git'}, doc); // 10;
+ * match('*', doc); // 5
+ * ```
+ *
+ * @param selector A document selector.
+ * @param document A text document.
+ * @return A number `>0` when the selector matches and `0` when the selector does not match.
+ */
+ export function match(selector: DocumentSelector, document: TextDocument): number;
+
+ /**
+ * An [event](#Event) which fires when the global set of diagnostics changes. This is
+ * newly added and removed diagnostics.
+ */
+ export const onDidChangeDiagnostics: Event;
+
+ /**
+ * Get all diagnostics for a given resource. *Note* that this includes diagnostics from
+ * all extensions but *not yet* from the task framework.
+ *
+ * @param resource A resource
+ * @returns An array of [diagnostics](#Diagnostic) objects or an empty array.
+ */
+ export function getDiagnostics(resource: Uri): Diagnostic[];
+
+ /**
+ * Get all diagnostics. *Note* that this includes diagnostics from
+ * all extensions but *not yet* from the task framework.
+ *
+ * @returns An array of uri-diagnostics tuples or an empty array.
+ */
+ export function getDiagnostics(): [Uri, Diagnostic[]][];
+
+ /**
+ * Create a diagnostics collection.
+ *
+ * @param name The [name](#DiagnosticCollection.name) of the collection.
+ * @return A new diagnostic collection.
+ */
+ export function createDiagnosticCollection(name?: string): DiagnosticCollection;
+
+ /**
+ * Register a completion provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and groups of equal score are sequentially asked for
+ * completion items. The process stops when one or many providers of a group return a
+ * result. A failing provider (rejected promise or exception) will not fail the whole
+ * operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A completion provider.
+ * @param triggerCharacters Trigger completion when the user types one of the characters, like `.` or `:`.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerCompletionItemProvider(selector: DocumentSelector, provider: CompletionItemProvider, ...triggerCharacters: string[]): Disposable;
+
+ /**
+ * Register a code action provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A code action provider.
+ * @param metadata Metadata about the kind of code actions the provider providers.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerCodeActionsProvider(selector: DocumentSelector, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): Disposable;
+
+ /**
+ * Register a code lens provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A code lens provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerCodeLensProvider(selector: DocumentSelector, provider: CodeLensProvider): Disposable;
+
+ /**
+ * Register a definition provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A definition provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDefinitionProvider(selector: DocumentSelector, provider: DefinitionProvider): Disposable;
+
+ /**
+ * Register an implementation provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider An implementation provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerImplementationProvider(selector: DocumentSelector, provider: ImplementationProvider): Disposable;
+
+ /**
+ * Register a type definition provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A type definition provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerTypeDefinitionProvider(selector: DocumentSelector, provider: TypeDefinitionProvider): Disposable;
+
+ /**
+ * Register a declaration provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A declaration provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDeclarationProvider(selector: DocumentSelector, provider: DeclarationProvider): Disposable;
+
+ /**
+ * Register a hover provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A hover provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable;
+
+ /**
+ * Register a document highlight provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and groups sequentially asked for document highlights.
+ * The process stops when a provider returns a `non-falsy` or `non-failure` result.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A document highlight provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDocumentHighlightProvider(selector: DocumentSelector, provider: DocumentHighlightProvider): Disposable;
+
+ /**
+ * Register a document symbol provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A document symbol provider.
+ * @param metaData metadata about the provider
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDocumentSymbolProvider(selector: DocumentSelector, provider: DocumentSymbolProvider, metaData?: DocumentSymbolProviderMetadata): Disposable;
+
+ /**
+ * Register a workspace symbol provider.
+ *
+ * Multiple providers can be registered. In that case providers are asked in parallel and
+ * the results are merged. A failing provider (rejected promise or exception) will not cause
+ * a failure of the whole operation.
+ *
+ * @param provider A workspace symbol provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerWorkspaceSymbolProvider(provider: WorkspaceSymbolProvider): Disposable;
+
+ /**
+ * Register a reference provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A reference provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerReferenceProvider(selector: DocumentSelector, provider: ReferenceProvider): Disposable;
+
+ /**
+ * Register a rename provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and the best-matching provider is used. Failure
+ * of the selected provider will cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A rename provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerRenameProvider(selector: DocumentSelector, provider: RenameProvider): Disposable;
+
+ /**
+ * Register a formatting provider for a document.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and the best-matching provider is used. Failure
+ * of the selected provider will cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A document formatting edit provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDocumentFormattingEditProvider(selector: DocumentSelector, provider: DocumentFormattingEditProvider): Disposable;
+
+ /**
+ * Register a formatting provider for a document range.
+ *
+ * *Note:* A document range provider is also a [document formatter](#DocumentFormattingEditProvider)
+ * which means there is no need to [register](#languages.registerDocumentFormattingEditProvider) a document
+ * formatter when also registering a range provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and the best-matching provider is used. Failure
+ * of the selected provider will cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A document range formatting edit provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDocumentRangeFormattingEditProvider(selector: DocumentSelector, provider: DocumentRangeFormattingEditProvider): Disposable;
+
+ /**
+ * Register a formatting provider that works on type. The provider is active when the user enables the setting `editor.formatOnType`.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and the best-matching provider is used. Failure
+ * of the selected provider will cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider An on type formatting edit provider.
+ * @param firstTriggerCharacter A character on which formatting should be triggered, like `}`.
+ * @param moreTriggerCharacter More trigger characters.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerOnTypeFormattingEditProvider(selector: DocumentSelector, provider: OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacter: string[]): Disposable;
+
+ /**
+ * Register a signature help provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are sorted
+ * by their [score](#languages.match) and called sequentially until a provider returns a
+ * valid result.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A signature help provider.
+ * @param triggerCharacters Trigger signature help when the user types one of the characters, like `,` or `(`.
+ * @param metadata Information about the provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, ...triggerCharacters: string[]): Disposable;
+ export function registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, metadata: SignatureHelpProviderMetadata): Disposable;
+
+ /**
+ * Register a document link provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A document link provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDocumentLinkProvider(selector: DocumentSelector, provider: DocumentLinkProvider): Disposable;
+
+ /**
+ * Register a color provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A color provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerColorProvider(selector: DocumentSelector, provider: DocumentColorProvider): Disposable;
+
+ /**
+ * Register a folding range provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged.
+ * If multiple folding ranges start at the same position, only the range of the first registered provider is used.
+ * If a folding range overlaps with an other range that has a smaller position, it is also ignored.
+ *
+ * A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A folding range provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable;
+
+ /**
+ * Register a selection range provider.
+ *
+ * Multiple providers can be registered for a language. In that case providers are asked in
+ * parallel and the results are merged. A failing provider (rejected promise or exception) will
+ * not cause a failure of the whole operation.
+ *
+ * @param selector A selector that defines the documents this provider is applicable to.
+ * @param provider A selection range provider.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable;
+
+ /**
+ * Set a [language configuration](#LanguageConfiguration) for a language.
+ *
+ * @param language A language identifier like `typescript`.
+ * @param configuration Language configuration.
+ * @return A [disposable](#Disposable) that unsets this configuration.
+ */
+ export function setLanguageConfiguration(language: string, configuration: LanguageConfiguration): Disposable;
+ }
+
+ /**
+ * Represents the input box in the Source Control viewlet.
+ */
+ export interface SourceControlInputBox {
+
+ /**
+ * Setter and getter for the contents of the input box.
+ */
+ value: string;
+
+ /**
+ * A string to show as place holder in the input box to guide the user.
+ */
+ placeholder: string;
+ }
+
+ interface QuickDiffProvider {
+
+ /**
+ * Provide a [uri](#Uri) to the original resource of any given resource uri.
+ *
+ * @param uri The uri of the resource open in a text editor.
+ * @param token A cancellation token.
+ * @return A thenable that resolves to uri of the matching original resource.
+ */
+ provideOriginalResource?(uri: Uri, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The theme-aware decorations for a
+ * [source control resource state](#SourceControlResourceState).
+ */
+ export interface SourceControlResourceThemableDecorations {
+
+ /**
+ * The icon path for a specific
+ * [source control resource state](#SourceControlResourceState).
+ */
+ readonly iconPath?: string | Uri;
+ }
+
+ /**
+ * The decorations for a [source control resource state](#SourceControlResourceState).
+ * Can be independently specified for light and dark themes.
+ */
+ export interface SourceControlResourceDecorations extends SourceControlResourceThemableDecorations {
+
+ /**
+ * Whether the [source control resource state](#SourceControlResourceState) should
+ * be striked-through in the UI.
+ */
+ readonly strikeThrough?: boolean;
+
+ /**
+ * Whether the [source control resource state](#SourceControlResourceState) should
+ * be faded in the UI.
+ */
+ readonly faded?: boolean;
+
+ /**
+ * The title for a specific
+ * [source control resource state](#SourceControlResourceState).
+ */
+ readonly tooltip?: string;
+
+ /**
+ * The light theme decorations.
+ */
+ readonly light?: SourceControlResourceThemableDecorations;
+
+ /**
+ * The dark theme decorations.
+ */
+ readonly dark?: SourceControlResourceThemableDecorations;
+ }
+
+ /**
+ * An source control resource state represents the state of an underlying workspace
+ * resource within a certain [source control group](#SourceControlResourceGroup).
+ */
+ export interface SourceControlResourceState {
+
+ /**
+ * The [uri](#Uri) of the underlying resource inside the workspace.
+ */
+ readonly resourceUri: Uri;
+
+ /**
+ * The [command](#Command) which should be run when the resource
+ * state is open in the Source Control viewlet.
+ */
+ readonly command?: Command;
+
+ /**
+ * The [decorations](#SourceControlResourceDecorations) for this source control
+ * resource state.
+ */
+ readonly decorations?: SourceControlResourceDecorations;
+ }
+
+ /**
+ * A source control resource group is a collection of
+ * [source control resource states](#SourceControlResourceState).
+ */
+ export interface SourceControlResourceGroup {
+
+ /**
+ * The id of this source control resource group.
+ */
+ readonly id: string;
+
+ /**
+ * The label of this source control resource group.
+ */
+ label: string;
+
+ /**
+ * Whether this source control resource group is hidden when it contains
+ * no [source control resource states](#SourceControlResourceState).
+ */
+ hideWhenEmpty?: boolean;
+
+ /**
+ * This group's collection of
+ * [source control resource states](#SourceControlResourceState).
+ */
+ resourceStates: SourceControlResourceState[];
+
+ /**
+ * Dispose this source control resource group.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * An source control is able to provide [resource states](#SourceControlResourceState)
+ * to the editor and interact with the editor in several source control related ways.
+ */
+ export interface SourceControl {
+
+ /**
+ * The id of this source control.
+ */
+ readonly id: string;
+
+ /**
+ * The human-readable label of this source control.
+ */
+ readonly label: string;
+
+ /**
+ * The (optional) Uri of the root of this source control.
+ */
+ readonly rootUri: Uri | undefined;
+
+ /**
+ * The [input box](#SourceControlInputBox) for this source control.
+ */
+ readonly inputBox: SourceControlInputBox;
+
+ /**
+ * The UI-visible count of [resource states](#SourceControlResourceState) of
+ * this source control.
+ *
+ * Equals to the total number of [resource state](#SourceControlResourceState)
+ * of this source control, if undefined.
+ */
+ count?: number;
+
+ /**
+ * An optional [quick diff provider](#QuickDiffProvider).
+ */
+ quickDiffProvider?: QuickDiffProvider;
+
+ /**
+ * Optional commit template string.
+ *
+ * The Source Control viewlet will populate the Source Control
+ * input with this value when appropriate.
+ */
+ commitTemplate?: string;
+
+ /**
+ * Optional accept input command.
+ *
+ * This command will be invoked when the user accepts the value
+ * in the Source Control input.
+ */
+ acceptInputCommand?: Command;
+
+ /**
+ * Optional status bar commands.
+ *
+ * These commands will be displayed in the editor's status bar.
+ */
+ statusBarCommands?: Command[];
+
+ /**
+ * Create a new [resource group](#SourceControlResourceGroup).
+ */
+ createResourceGroup(id: string, label: string): SourceControlResourceGroup;
+
+ /**
+ * Dispose this source control.
+ */
+ dispose(): void;
+ }
+
+ export namespace scm {
+
+ /**
+ * ~~The [input box](#SourceControlInputBox) for the last source control
+ * created by the extension.~~
+ *
+ * @deprecated Use SourceControl.inputBox instead
+ */
+ export const inputBox: SourceControlInputBox;
+
+ /**
+ * Creates a new [source control](#SourceControl) instance.
+ *
+ * @param id An `id` for the source control. Something short, e.g.: `git`.
+ * @param label A human-readable string for the source control. E.g.: `Git`.
+ * @param rootUri An optional Uri of the root of the source control. E.g.: `Uri.parse(workspaceRoot)`.
+ * @return An instance of [source control](#SourceControl).
+ */
+ export function createSourceControl(id: string, label: string, rootUri?: Uri): SourceControl;
+ }
+
+ /**
+ * Configuration for a debug session.
+ */
+ export interface DebugConfiguration {
+ /**
+ * The type of the debug session.
+ */
+ type: string;
+
+ /**
+ * The name of the debug session.
+ */
+ name: string;
+
+ /**
+ * The request type of the debug session.
+ */
+ request: string;
+
+ /**
+ * Additional debug type specific properties.
+ */
+ [key: string]: any;
+ }
+
+ /**
+ * A debug session.
+ */
+ export interface DebugSession {
+
+ /**
+ * The unique ID of this debug session.
+ */
+ readonly id: string;
+
+ /**
+ * The debug session's type from the [debug configuration](#DebugConfiguration).
+ */
+ readonly type: string;
+
+ /**
+ * The debug session's name from the [debug configuration](#DebugConfiguration).
+ */
+ readonly name: string;
+
+ /**
+ * The workspace folder of this session or `undefined` for a folderless setup.
+ */
+ readonly workspaceFolder: WorkspaceFolder | undefined;
+
+ /**
+ * The "resolved" [debug configuration](#DebugConfiguration) of this session.
+ * "Resolved" means that
+ * - all variables have been substituted and
+ * - platform specific attribute sections have been "flattened" for the matching platform and removed for non-matching platforms.
+ */
+ readonly configuration: DebugConfiguration;
+
+ /**
+ * Send a custom request to the debug adapter.
+ */
+ customRequest(command: string, args?: any): Thenable;
+ }
+
+ /**
+ * A custom Debug Adapter Protocol event received from a [debug session](#DebugSession).
+ */
+ export interface DebugSessionCustomEvent {
+ /**
+ * The [debug session](#DebugSession) for which the custom event was received.
+ */
+ readonly session: DebugSession;
+
+ /**
+ * Type of event.
+ */
+ readonly event: string;
+
+ /**
+ * Event specific information.
+ */
+ readonly body?: any;
+ }
+
+ /**
+ * A debug configuration provider allows to add the initial debug configurations to a newly created launch.json
+ * and to resolve a launch configuration before it is used to start a new debug session.
+ * A debug configuration provider is registered via #debug.registerDebugConfigurationProvider.
+ */
+ export interface DebugConfigurationProvider {
+ /**
+ * Provides initial [debug configuration](#DebugConfiguration). If more than one debug configuration provider is
+ * registered for the same type, debug configurations are concatenated in arbitrary order.
+ *
+ * @param folder The workspace folder for which the configurations are used or `undefined` for a folderless setup.
+ * @param token A cancellation token.
+ * @return An array of [debug configurations](#DebugConfiguration).
+ */
+ provideDebugConfigurations?(folder: WorkspaceFolder | undefined, token?: CancellationToken): ProviderResult;
+
+ /**
+ * Resolves a [debug configuration](#DebugConfiguration) by filling in missing values or by adding/changing/removing attributes.
+ * If more than one debug configuration provider is registered for the same type, the resolveDebugConfiguration calls are chained
+ * in arbitrary order and the initial debug configuration is piped through the chain.
+ * Returning the value 'undefined' prevents the debug session from starting.
+ * Returning the value 'null' prevents the debug session from starting and opens the underlying debug configuration instead.
+ *
+ * @param folder The workspace folder from which the configuration originates from or `undefined` for a folderless setup.
+ * @param debugConfiguration The [debug configuration](#DebugConfiguration) to resolve.
+ * @param token A cancellation token.
+ * @return The resolved debug configuration or undefined or null.
+ */
+ resolveDebugConfiguration?(folder: WorkspaceFolder | undefined, debugConfiguration: DebugConfiguration, token?: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents a debug adapter executable and optional arguments and runtime options passed to it.
+ */
+ export class DebugAdapterExecutable {
+
+ /**
+ * Creates a description for a debug adapter based on an executable program.
+ *
+ * @param command The command or executable path that implements the debug adapter.
+ * @param args Optional arguments to be passed to the command or executable.
+ * @param options Optional options to be used when starting the command or executable.
+ */
+ constructor(command: string, args?: string[], options?: DebugAdapterExecutableOptions);
+
+ /**
+ * The command or path of the debug adapter executable.
+ * A command must be either an absolute path of an executable or the name of an command to be looked up via the PATH environment variable.
+ * The special value 'node' will be mapped to VS Code's built-in Node.js runtime.
+ */
+ readonly command: string;
+
+ /**
+ * The arguments passed to the debug adapter executable. Defaults to an empty array.
+ */
+ readonly args: string[];
+
+ /**
+ * Optional options to be used when the debug adapter is started.
+ * Defaults to undefined.
+ */
+ readonly options?: DebugAdapterExecutableOptions;
+ }
+
+ /**
+ * Options for a debug adapter executable.
+ */
+ export interface DebugAdapterExecutableOptions {
+
+ /**
+ * The additional environment of the executed program or shell. If omitted
+ * the parent process' environment is used. If provided it is merged with
+ * the parent process' environment.
+ */
+ env?: { [key: string]: string };
+
+ /**
+ * The current working directory for the executed debug adapter.
+ */
+ cwd?: string;
+ }
+
+ /**
+ * Represents a debug adapter running as a socket based server.
+ */
+ export class DebugAdapterServer {
+
+ /**
+ * The port.
+ */
+ readonly port: number;
+
+ /**
+ * The host.
+ */
+ readonly host?: string;
+
+ /**
+ * Create a description for a debug adapter running as a socket based server.
+ */
+ constructor(port: number, host?: string);
+ }
+
+ export type DebugAdapterDescriptor = DebugAdapterExecutable | DebugAdapterServer;
+
+ export interface DebugAdapterDescriptorFactory {
+ /**
+ * 'createDebugAdapterDescriptor' is called at the start of a debug session to provide details about the debug adapter to use.
+ * These details must be returned as objects of type [DebugAdapterDescriptor](#DebugAdapterDescriptor).
+ * Currently two types of debug adapters are supported:
+ * - a debug adapter executable is specified as a command path and arguments (see [DebugAdapterExecutable](#DebugAdapterExecutable)),
+ * - a debug adapter server reachable via a communication port (see [DebugAdapterServer](#DebugAdapterServer)).
+ * If the method is not implemented the default behavior is this:
+ * createDebugAdapter(session: DebugSession, executable: DebugAdapterExecutable) {
+ * if (typeof session.configuration.debugServer === 'number') {
+ * return new DebugAdapterServer(session.configuration.debugServer);
+ * }
+ * return executable;
+ * }
+ * @param session The [debug session](#DebugSession) for which the debug adapter will be used.
+ * @param executable The debug adapter's executable information as specified in the package.json (or undefined if no such information exists).
+ * @return a [debug adapter descriptor](#DebugAdapterDescriptor) or undefined.
+ */
+ createDebugAdapterDescriptor(session: DebugSession, executable: DebugAdapterExecutable | undefined): ProviderResult;
+ }
+
+ /**
+ * A Debug Adapter Tracker is a means to track the communication between VS Code and a Debug Adapter.
+ */
+ export interface DebugAdapterTracker {
+ /**
+ * A session with the debug adapter is about to be started.
+ */
+ onWillStartSession?(): void;
+ /**
+ * The debug adapter is about to receive a Debug Adapter Protocol message from VS Code.
+ */
+ onWillReceiveMessage?(message: any): void;
+ /**
+ * The debug adapter has sent a Debug Adapter Protocol message to VS Code.
+ */
+ onDidSendMessage?(message: any): void;
+ /**
+ * The debug adapter session is about to be stopped.
+ */
+ onWillStopSession?(): void;
+ /**
+ * An error with the debug adapter has occurred.
+ */
+ onError?(error: Error): void;
+ /**
+ * The debug adapter has exited with the given exit code or signal.
+ */
+ onExit?(code: number | undefined, signal: string | undefined): void;
+ }
+
+ export interface DebugAdapterTrackerFactory {
+ /**
+ * The method 'createDebugAdapterTracker' is called at the start of a debug session in order
+ * to return a "tracker" object that provides read-access to the communication between VS Code and a debug adapter.
+ *
+ * @param session The [debug session](#DebugSession) for which the debug adapter tracker will be used.
+ * @return A [debug adapter tracker](#DebugAdapterTracker) or undefined.
+ */
+ createDebugAdapterTracker(session: DebugSession): ProviderResult;
+ }
+
+ /**
+ * Represents the debug console.
+ */
+ export interface DebugConsole {
+ /**
+ * Append the given value to the debug console.
+ *
+ * @param value A string, falsy values will not be printed.
+ */
+ append(value: string): void;
+
+ /**
+ * Append the given value and a line feed character
+ * to the debug console.
+ *
+ * @param value A string, falsy values will be printed.
+ */
+ appendLine(value: string): void;
+ }
+
+ /**
+ * An event describing the changes to the set of [breakpoints](#Breakpoint).
+ */
+ export interface BreakpointsChangeEvent {
+ /**
+ * Added breakpoints.
+ */
+ readonly added: ReadonlyArray;
+
+ /**
+ * Removed breakpoints.
+ */
+ readonly removed: ReadonlyArray;
+
+ /**
+ * Changed breakpoints.
+ */
+ readonly changed: ReadonlyArray;
+ }
+
+ /**
+ * The base class of all breakpoint types.
+ */
+ export class Breakpoint {
+ /**
+ * The unique ID of the breakpoint.
+ */
+ readonly id: string;
+ /**
+ * Is breakpoint enabled.
+ */
+ readonly enabled: boolean;
+ /**
+ * An optional expression for conditional breakpoints.
+ */
+ readonly condition?: string;
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ */
+ readonly hitCondition?: string;
+ /**
+ * An optional message that gets logged when this breakpoint is hit. Embedded expressions within {} are interpolated by the debug adapter.
+ */
+ readonly logMessage?: string;
+
+ protected constructor(enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string);
+ }
+
+ /**
+ * A breakpoint specified by a source location.
+ */
+ export class SourceBreakpoint extends Breakpoint {
+ /**
+ * The source and line position of this breakpoint.
+ */
+ readonly location: Location;
+
+ /**
+ * Create a new breakpoint for a source location.
+ */
+ constructor(location: Location, enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string);
+ }
+
+ /**
+ * A breakpoint specified by a function name.
+ */
+ export class FunctionBreakpoint extends Breakpoint {
+ /**
+ * The name of the function to which this breakpoint is attached.
+ */
+ readonly functionName: string;
+
+ /**
+ * Create a new function breakpoint.
+ */
+ constructor(functionName: string, enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string);
+ }
+
+ /**
+ * Namespace for debug functionality.
+ */
+ export namespace debug {
+
+ /**
+ * The currently active [debug session](#DebugSession) or `undefined`. The active debug session is the one
+ * represented by the debug action floating window or the one currently shown in the drop down menu of the debug action floating window.
+ * If no debug session is active, the value is `undefined`.
+ */
+ export let activeDebugSession: DebugSession | undefined;
+
+ /**
+ * The currently active [debug console](#DebugConsole).
+ * If no debug session is active, output sent to the debug console is not shown.
+ */
+ export let activeDebugConsole: DebugConsole;
+
+ /**
+ * List of breakpoints.
+ */
+ export let breakpoints: Breakpoint[];
+
+
+ /**
+ * An [event](#Event) which fires when the [active debug session](#debug.activeDebugSession)
+ * has changed. *Note* that the event also fires when the active debug session changes
+ * to `undefined`.
+ */
+ export const onDidChangeActiveDebugSession: Event;
+
+ /**
+ * An [event](#Event) which fires when a new [debug session](#DebugSession) has been started.
+ */
+ export const onDidStartDebugSession: Event;
+
+ /**
+ * An [event](#Event) which fires when a custom DAP event is received from the [debug session](#DebugSession).
+ */
+ export const onDidReceiveDebugSessionCustomEvent: Event;
+
+ /**
+ * An [event](#Event) which fires when a [debug session](#DebugSession) has terminated.
+ */
+ export const onDidTerminateDebugSession: Event;
+
+ /**
+ * An [event](#Event) that is emitted when the set of breakpoints is added, removed, or changed.
+ */
+ export const onDidChangeBreakpoints: Event;
+
+
+ /**
+ * Register a [debug configuration provider](#DebugConfigurationProvider) for a specific debug type.
+ * More than one provider can be registered for the same type.
+ *
+ * @param type The debug type for which the provider is registered.
+ * @param provider The [debug configuration provider](#DebugConfigurationProvider) to register.
+ * @return A [disposable](#Disposable) that unregisters this provider when being disposed.
+ */
+ export function registerDebugConfigurationProvider(debugType: string, provider: DebugConfigurationProvider): Disposable;
+
+ /**
+ * Register a [debug adapter descriptor factory](#DebugAdapterDescriptorFactory) for a specific debug type.
+ * An extension is only allowed to register a DebugAdapterDescriptorFactory for the debug type(s) defined by the extension. Otherwise an error is thrown.
+ * Registering more than one DebugAdapterDescriptorFactory for a debug type results in an error.
+ *
+ * @param debugType The debug type for which the factory is registered.
+ * @param factory The [debug adapter descriptor factory](#DebugAdapterDescriptorFactory) to register.
+ * @return A [disposable](#Disposable) that unregisters this factory when being disposed.
+ */
+ export function registerDebugAdapterDescriptorFactory(debugType: string, factory: DebugAdapterDescriptorFactory): Disposable;
+
+ /**
+ * Register a debug adapter tracker factory for the given debug type.
+ *
+ * @param debugType The debug type for which the factory is registered or '*' for matching all debug types.
+ * @param factory The [debug adapter tracker factory](#DebugAdapterTrackerFactory) to register.
+ * @return A [disposable](#Disposable) that unregisters this factory when being disposed.
+ */
+ export function registerDebugAdapterTrackerFactory(debugType: string, factory: DebugAdapterTrackerFactory): Disposable;
+
+ /**
+ * Start debugging by using either a named launch or named compound configuration,
+ * or by directly passing a [DebugConfiguration](#DebugConfiguration).
+ * The named configurations are looked up in '.vscode/launch.json' found in the given folder.
+ * Before debugging starts, all unsaved files are saved and the launch configurations are brought up-to-date.
+ * Folder specific variables used in the configuration (e.g. '${workspaceFolder}') are resolved against the given folder.
+ * @param folder The [workspace folder](#WorkspaceFolder) for looking up named configurations and resolving variables or `undefined` for a non-folder setup.
+ * @param nameOrConfiguration Either the name of a debug or compound configuration or a [DebugConfiguration](#DebugConfiguration) object.
+ * @param parent If specified the newly created debug session is registered as a "child" session of a "parent" debug session.
+ * @return A thenable that resolves when debugging could be successfully started.
+ */
+ export function startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, parentSession?: DebugSession): Thenable;
+
+ /**
+ * Add breakpoints.
+ * @param breakpoints The breakpoints to add.
+ */
+ export function addBreakpoints(breakpoints: Breakpoint[]): void;
+
+ /**
+ * Remove breakpoints.
+ * @param breakpoints The breakpoints to remove.
+ */
+ export function removeBreakpoints(breakpoints: Breakpoint[]): void;
+ }
+
+ /**
+ * Namespace for dealing with installed extensions. Extensions are represented
+ * by an [extension](#Extension)-interface which enables reflection on them.
+ *
+ * Extension writers can provide APIs to other extensions by returning their API public
+ * surface from the `activate`-call.
+ *
+ * ```javascript
+ * export function activate(context: vscode.ExtensionContext) {
+ * let api = {
+ * sum(a, b) {
+ * return a + b;
+ * },
+ * mul(a, b) {
+ * return a * b;
+ * }
+ * };
+ * // 'export' public api-surface
+ * return api;
+ * }
+ * ```
+ * When depending on the API of another extension add an `extensionDependency`-entry
+ * to `package.json`, and use the [getExtension](#extensions.getExtension)-function
+ * and the [exports](#Extension.exports)-property, like below:
+ *
+ * ```javascript
+ * let mathExt = extensions.getExtension('genius.math');
+ * let importedApi = mathExt.exports;
+ *
+ * console.log(importedApi.mul(42, 1));
+ * ```
+ */
+ export namespace extensions {
+
+ /**
+ * Get an extension by its full identifier in the form of: `publisher.name`.
+ *
+ * @param extensionId An extension identifier.
+ * @return An extension or `undefined`.
+ */
+ export function getExtension(extensionId: string): Extension | undefined;
+
+ /**
+ * Get an extension its full identifier in the form of: `publisher.name`.
+ *
+ * @param extensionId An extension identifier.
+ * @return An extension or `undefined`.
+ */
+ export function getExtension(extensionId: string): Extension | undefined;
+
+ /**
+ * All extensions currently known to the system.
+ */
+ export const all: ReadonlyArray>;
+
+ /**
+ * An event which fires when `extensions.all` changes. This can happen when extensions are
+ * installed, uninstalled, enabled or disabled.
+ */
+ export const onDidChange: Event;
+ }
+
+ //#region Comments
+
+ /**
+ * Collapsible state of a [comment thread](#CommentThread)
+ */
+ export enum CommentThreadCollapsibleState {
+ /**
+ * Determines an item is collapsed
+ */
+ Collapsed = 0,
+
+ /**
+ * Determines an item is expanded
+ */
+ Expanded = 1
+ }
+
+ /**
+ * Comment mode of a [comment](#Comment)
+ */
+ export enum CommentMode {
+ /**
+ * Displays the comment editor
+ */
+ Editing = 0,
+
+ /**
+ * Displays the preview of the comment
+ */
+ Preview = 1
+ }
+
+ /**
+ * A collection of [comments](#Comment) representing a conversation at a particular range in a document.
+ */
+ export interface CommentThread {
+ /**
+ * The uri of the document the thread has been created on.
+ */
+ readonly uri: Uri;
+
+ /**
+ * The range the comment thread is located within the document. The thread icon will be shown
+ * at the first line of the range.
+ */
+ range: Range;
+
+ /**
+ * The ordered comments of the thread.
+ */
+ comments: ReadonlyArray;
+
+ /**
+ * Whether the thread should be collapsed or expanded when opening the document.
+ * Defaults to Collapsed.
+ */
+ collapsibleState: CommentThreadCollapsibleState;
+
+ /**
+ * Context value of the comment thread. This can be used to contribute thread specific actions.
+ * For example, a comment thread is given a context value as `editable`. When contributing actions to `comments/commentThread/title`
+ * using `menus` extension point, you can specify context value for key `commentThread` in `when` expression like `commentThread == editable`.
+ * ```
+ * "contributes": {
+ * "menus": {
+ * "comments/commentThread/title": [
+ * {
+ * "command": "extension.deleteCommentThread",
+ * "when": "commentThread == editable"
+ * }
+ * ]
+ * }
+ * }
+ * ```
+ * This will show action `extension.deleteCommentThread` only for comment threads with `contextValue` is `editable`.
+ */
+ contextValue?: string;
+
+ /**
+ * The optional human-readable label describing the [Comment Thread](#CommentThread)
+ */
+ label?: string;
+
+ /**
+ * Dispose this comment thread.
+ *
+ * Once disposed, this comment thread will be removed from visible editors and Comment Panel when approriate.
+ */
+ dispose(): void;
+ }
+
+ /**
+ * Author information of a [comment](#Comment)
+ */
+ export interface CommentAuthorInformation {
+ /**
+ * The display name of the author of the comment
+ */
+ name: string;
+
+ /**
+ * The optional icon path for the author
+ */
+ iconPath?: Uri;
+ }
+
+ /**
+ * Reactions of a [comment](#Comment)
+ */
+ export interface CommentReaction {
+ /**
+ * The human-readable label for the reaction
+ */
+ readonly label: string;
+
+ /**
+ * Icon for the reaction shown in UI.
+ */
+ readonly iconPath: string | Uri;
+
+ /**
+ * The number of users who have reacted to this reaction
+ */
+ readonly count: number;
+
+ /**
+ * Whether the [author](CommentAuthorInformation) of the comment has reacted to this reaction
+ */
+ readonly authorHasReacted: boolean;
+ }
+
+ /**
+ * A comment is displayed within the editor or the Comments Panel, depending on how it is provided.
+ */
+ export interface Comment {
+ /**
+ * The human-readable comment body
+ */
+ body: string | MarkdownString;
+
+ /**
+ * [Comment mode](#CommentMode) of the comment
+ */
+ mode: CommentMode;
+
+ /**
+ * The [author information](#CommentAuthorInformation) of the comment
+ */
+ author: CommentAuthorInformation;
+
+ /**
+ * Context value of the comment. This can be used to contribute comment specific actions.
+ * For example, a comment is given a context value as `editable`. When contributing actions to `comments/comment/title`
+ * using `menus` extension point, you can specify context value for key `comment` in `when` expression like `comment == editable`.
+ * ```json
+ * "contributes": {
+ * "menus": {
+ * "comments/comment/title": [
+ * {
+ * "command": "extension.deleteComment",
+ * "when": "comment == editable"
+ * }
+ * ]
+ * }
+ * }
+ * ```
+ * This will show action `extension.deleteComment` only for comments with `contextValue` is `editable`.
+ */
+ contextValue?: string;
+
+ /**
+ * Optional reactions of the [comment](#Comment)
+ */
+ reactions?: CommentReaction[];
+
+ /**
+ * Optional label describing the [Comment](#Comment)
+ * Label will be rendered next to authorName if exists.
+ */
+ label?: string;
+ }
+
+ /**
+ * Command argument for actions registered in `comments/commentThread/context`.
+ */
+ export interface CommentReply {
+ /**
+ * The active [comment thread](#CommentThread)
+ */
+ thread: CommentThread;
+
+ /**
+ * The value in the comment editor
+ */
+ text: string;
+ }
+
+ /**
+ * Commenting range provider for a [comment controller](#CommentController).
+ */
+ export interface CommentingRangeProvider {
+ /**
+ * Provide a list of ranges which allow new comment threads creation or null for a given document
+ */
+ provideCommentingRanges(document: TextDocument, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A comment controller is able to provide [comments](#CommentThread) support to the editor and
+ * provide users various ways to interact with comments.
+ */
+ export interface CommentController {
+ /**
+ * The id of this comment controller.
+ */
+ readonly id: string;
+
+ /**
+ * The human-readable label of this comment controller.
+ */
+ readonly label: string;
+
+ /**
+ * Optional commenting range provider. Provide a list [ranges](#Range) which support commenting to any given resource uri.
+ *
+ * If not provided, users can leave comments in any document opened in the editor.
+ */
+ commentingRangeProvider?: CommentingRangeProvider;
+
+ /**
+ * Create a [comment thread](#CommentThread). The comment thread will be displayed in visible text editors (if the resource matches)
+ * and Comments Panel once created.
+ *
+ * @param uri The uri of the document the thread has been created on.
+ * @param range The range the comment thread is located within the document.
+ * @param comments The ordered comments of the thread.
+ */
+ createCommentThread(uri: Uri, range: Range, comments: Comment[]): CommentThread;
+
+ /**
+ * Optional reaction handler for creating and deleting reactions on a [comment](#Comment).
+ */
+ reactionHandler?: (comment: Comment, reaction: CommentReaction) => Promise;
+
+ /**
+ * Dispose this comment controller.
+ *
+ * Once disposed, all [comment threads](#CommentThread) created by this comment controller will also be removed from the editor
+ * and Comments Panel.
+ */
+ dispose(): void;
+ }
+
+ namespace comments {
+ /**
+ * Creates a new [comment controller](#CommentController) instance.
+ *
+ * @param id An `id` for the comment controller.
+ * @param label A human-readable string for the comment controller.
+ * @return An instance of [comment controller](#CommentController).
+ */
+ export function createCommentController(id: string, label: string): CommentController;
+ }
+
+ //#endregion
+}
+
+/**
+ * Thenable is a common denominator between ES6 promises, Q, jquery.Deferred, WinJS.Promise,
+ * and others. This API makes no assumption about what promise library is being used which
+ * enables reusing existing code without migrating to a specific promise implementation. Still,
+ * we recommend the use of native promises which are available in this editor.
+ */
+interface Thenable {
+ /**
+ * Attaches callbacks for the resolution and/or rejection of the Promise.
+ * @param onfulfilled The callback to execute when the Promise is resolved.
+ * @param onrejected The callback to execute when the Promise is rejected.
+ * @returns A Promise for the completion of which ever callback is executed.
+ */
+ then(onfulfilled?: (value: T) => TResult | Thenable