From d049d17432f200546153008dbd1363ffd93eee37 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 6 May 2021 22:45:38 -0700 Subject: [PATCH] Initial comment --- .eslintrc.json | 24 + .gitignore | 5 + .vscode/extensions.json | 8 + .vscode/launch.json | 35 + .vscode/settings.json | 13 + .vscode/tasks.json | 33 + .vscodeignore | 12 + .yarnrc | 1 + CHANGELOG.md | 9 + README.md | 7 + images/cellStatusbarDemo.gif | Bin 0 -> 153185 bytes images/statusbarDemo.gif | Bin 0 -> 229224 bytes package.json | 73 + src/extension.ts | 205 + src/test/runTest.ts | 23 + src/test/suite/extension.test.ts | 15 + src/test/suite/index.ts | 38 + tsconfig.json | 21 + vscode.d.ts | 12747 +++++++++++++++++++++++++++++ vscode.proposed.d.ts | 3128 +++++++ webpack.config.js | 42 + yarn.lock | 2292 ++++++ 22 files changed, 18731 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 .yarnrc create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 images/cellStatusbarDemo.gif create mode 100644 images/statusbarDemo.gif create mode 100644 package.json create mode 100644 src/extension.ts create mode 100644 src/test/runTest.ts create mode 100644 src/test/suite/extension.test.ts create mode 100644 src/test/suite/index.ts create mode 100644 tsconfig.json create mode 100644 vscode.d.ts create mode 100644 vscode.proposed.d.ts create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..f9b22b7 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/semi": "warn", + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "semi": "off" + }, + "ignorePatterns": [ + "out", + "dist", + "**/*.d.ts" + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b60dfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +out +dist +node_modules +.vscode-test/ +*.vsix diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3d11ddc --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint", + "eamodio.tsl-problem-matcher" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..64afa42 --- /dev/null +++ b/.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", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--enable-proposed-api" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "npm: test-watch" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5c5ac48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..136cbbc --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +// 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": [ + "$ts-webpack-watch", + "$tslint-webpack-watch" + ], + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "test-watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": "build" + } + ] +} \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..69da5fb --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,12 @@ +.vscode/** +.vscode-test/** +out/** +node_modules/** +src/** +.gitignore +.yarnrc +vsc-extension-quickstart.md +**/tsconfig.json +**/.eslintrc.json +**/*.map +**/*.ts diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..f757a6a --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +--ignore-engines true \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f2ff9d2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "vscode-notebook-cell-linenumber" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b4b871c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyterpowertools) that provides ability to view cursor position in cell or window statusbar. + +## Cursor position in Cell Statusbar + + +## Cursor position in VS Code Statusbar + diff --git a/images/cellStatusbarDemo.gif b/images/cellStatusbarDemo.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b0b38afbaabda8391c418ea6034e4ca879fb16a GIT binary patch literal 153185 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

*I@PVpOVtYr6E*ru#`8hIW_x~K#;Vnhb+v`9O* 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̷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 literal 0 HcmV?d00001 diff --git a/images/statusbarDemo.gif b/images/statusbarDemo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fabdc4703e0c83adb894cca42f99442591f80683 GIT binary patch literal 229224 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

$iUt=rWFd%w6tzP91e7`eN-I5D#2)Dm%qQQUrX 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

U12!0JnAsHg}9OW)@c9mSfV_)#ujsWL0yKHV>Ay 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

;KJneGOx(J)ouNK@Nehuj6MRjf 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..2024ca6 --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "vscode-notebook-cell-linenumber", + "displayName": "vscode-notebook-cell-linenumber", + "description": "", + "version": "0.0.1", + "enableProposedApi": true, + "engines": { + "vscode": "1.57.0-insider" + }, + "categories": [ + "Other" + ], + "activationEvents": [ + "*", + "onNotebook:jupyter-notebook", + "onCommand:vscode-notebook-cell-linenumber.helloWorld" + ], + "main": "./dist/extension.js", + "contributes": { + "configuration": { + "type": "object", + "properties": { + "notebook.cursorPositionLocation": { + "type": "string", + "default": "statusbar", + "enum": [ + "statusbar", + "cellstatusbar" + ], + "description": "Displays cell line and column number in cell or window statusbar.", + "scope": "machine" + } + } + }, + "commands": [ + { + "command": "vscode-notebook-cell-linenumber.helloWorld", + "title": "Hello World" + } + ] + }, + "scripts": { + "vscode:prepublish": "yarn run package", + "compile": "webpack", + "watch": "webpack --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "test-compile": "tsc -p ./", + "test-watch": "tsc -watch -p ./", + "pretest": "yarn run test-compile && yarn run lint", + "lint": "eslint src --ext ts", + "test": "node ./out/test/runTest.js", + "download-api": "vscode-dts dev", + "postdownload-api": "vscode-dts main", + "postinstall": "npm run download-api" + }, + "devDependencies": { + "@types/glob": "^7.1.3", + "@types/mocha": "^8.0.4", + "@types/node": "^12.11.7", + "@types/vscode": "^1.56.0", + "@typescript-eslint/eslint-plugin": "^4.14.1", + "@typescript-eslint/parser": "^4.14.1", + "eslint": "^7.19.0", + "glob": "^7.1.6", + "mocha": "^8.2.1", + "ts-loader": "^8.0.14", + "typescript": "^4.1.3", + "vscode-dts": "^0.3.1", + "vscode-test": "^1.5.0", + "webpack": "^5.19.0", + "webpack-cli": "^4.4.0" + } +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..1a71219 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,205 @@ +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import { + EventEmitter, + commands, + ConfigurationChangeEvent, + ExtensionContext, + notebook, + NotebookCellStatusBarItemProvider, + NotebookCell, + CancellationToken, + NotebookCellStatusBarItem, + window, + TextEditorSelectionChangeEvent, + TextDocument, + Position, + Disposable, + NotebookCellStatusBarAlignment, + NotebookEditorSelectionChangeEvent, + CodeActionProvider, + Range, + Selection, + CodeActionContext, + languages, + DocumentHighlightProvider, + workspace, + StatusBarItem, + StatusBarAlignment, +} 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: 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 "vscode-notebook-cell-linenumber" 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 = commands.registerCommand( + "vscode-notebook-cell-linenumber.helloWorld", + () => { + // The code you place here will be executed every time your command is executed + + // Display a message box to the user + window.showInformationMessage( + "Hello World from vscode-notebook-cell-linenumber!" + ); + } + ); + + context.subscriptions.push(disposable); + const provider = new StatusbarProvider(context); + context.subscriptions.push(provider); +} + +class StatusbarProvider implements NotebookCellStatusBarItemProvider { + public get onDidChangeCellStatusBarItems() { + return this._onDidChangeCellStatusBarItems.event; + } + private readonly disposables: Disposable[] = []; + private _lineLocation?: "cellstatusbar" | "statusbar"; + private readonly _onDidChangeCellStatusBarItems = new EventEmitter(); + private cellStatusbarProvider?: Disposable; + private statusbar?: StatusBarItem; + private readonly textDocumentPositions = new WeakMap< + TextDocument, + Position + >(); + private get lineLocation(): "cellstatusbar" | "statusbar" { + if (!this._lineLocation) { + this._lineLocation = workspace + .getConfiguration("notebook") + .get<"cellstatusbar" | "statusbar">( + "cursorPositionLocation", + "statusbar" + ); + } + return this._lineLocation; + } + + /** + * The provider will be called when the cell scrolls into view, when its content, outputs, language, or metadata change, and when it changes execution state. + */ + constructor(private readonly context: ExtensionContext) { + this.registerProviders(); + workspace.onDidChangeConfiguration( + this.onDidChangeConfiguration, + this, + this.disposables + ); + window.onDidChangeTextEditorSelection( + this.onDidChangeTextEditorSelection, + this, + this.disposables + ); + window.onDidChangeNotebookEditorSelection( + this.onDidChangeNotebookEditorSelection, + this, + this.disposables + ); + } + public dispose() { + this._onDidChangeCellStatusBarItems.dispose(); + this.disposables.forEach((d) => d.dispose()); + this.cellStatusbarProvider?.dispose(); + } + public provideCellStatusBarItems( + cell: NotebookCell, + _token: CancellationToken + ): NotebookCellStatusBarItem[] { + if (this.lineLocation === "statusbar") { + return []; + } + const activeEditor = window.activeNotebookEditor; + if (!activeEditor || activeEditor.document !== cell.notebook) { + return []; + } + if ( + !activeEditor.selections.some( + (range) => range.start <= cell.index && range.end > cell.index + ) + ) { + return []; + } + const item = this.textDocumentPositions.get(cell.document); + if (!item) { + return []; + } + + const line = item.line; + const character = item.character; + return [ + new NotebookCellStatusBarItem( + `Ln ${line + 1}, Col ${character + 1}`, + NotebookCellStatusBarAlignment.Left, + undefined, + undefined, + 999999999999999 + ), + ]; + } + private registerProviders() { + if (this.lineLocation === "statusbar") { + this.statusbar = window.createStatusBarItem({ + id: "notebookLinePosition", + name: "notebookLine", + alignment: StatusBarAlignment.Right, + priority: 9999999999, + }); + } else { + this.statusbar?.hide(); + if (!this.cellStatusbarProvider) { + this.cellStatusbarProvider = notebook.registerNotebookCellStatusBarItemProvider( + { viewType: "*" }, + this + ); + } + } + } + private doesDocumentBelongToCurrentNotebook(document: TextDocument) { + const activeEditor = window.activeNotebookEditor; + return activeEditor?.document === document.notebook; + } + private onDidChangeNotebookEditorSelection( + e: NotebookEditorSelectionChangeEvent + ) { + console.error("1"); + } + private onDidChangeTextEditorSelection(e: TextEditorSelectionChangeEvent) { + const document = e.textEditor.document; + if (document.notebook) { + if (e.selections.length) { + this.textDocumentPositions.set( + e.textEditor.document, + e.selections[0].start + ); + if (this.statusbar && this.lineLocation === "statusbar") { + this.statusbar.text = `Ln ${e.selections[0].start.line + 1}, Col ${ + e.selections[0].start.character + 1 + }`; + this.statusbar.show(); + } + } else { + this.statusbar?.hide(); + this.textDocumentPositions.delete(e.textEditor.document); + } + if (this.doesDocumentBelongToCurrentNotebook(document)) { + this._onDidChangeCellStatusBarItems.fire(); + } + } + } + private onDidChangeConfiguration(e: ConfigurationChangeEvent) { + if (e.affectsConfiguration("notebook.cursorPositionLocation")) { + this._lineLocation = undefined; + this.registerProviders(); + } + } +} + +// this method is called when your extension is deactivated +export function deactivate() {} diff --git a/src/test/runTest.ts b/src/test/runTest.ts new file mode 100644 index 0000000..1eabfa3 --- /dev/null +++ b/src/test/runTest.ts @@ -0,0 +1,23 @@ +import * as path from 'path'; + +import { runTests } from 'vscode-test'; + +async function main() { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './suite/index'); + + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } +} + +main(); diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts new file mode 100644 index 0000000..4ca0ab4 --- /dev/null +++ b/src/test/suite/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts new file mode 100644 index 0000000..7029e38 --- /dev/null +++ b/src/test/suite/index.ts @@ -0,0 +1,38 @@ +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + + const testsRoot = path.resolve(__dirname, '..'); + + return new Promise((c, e) => { + glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + console.error(err); + e(err); + } + }); + }); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b65c745 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + }, + "exclude": [ + "node_modules", + ".vscode-test" + ] +} diff --git a/vscode.d.ts b/vscode.d.ts new file mode 100644 index 0000000..7e59e1e --- /dev/null +++ b/vscode.d.ts @@ -0,0 +1,12747 @@ +/*--------------------------------------------------------------------------------------------- + * 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 {@link 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 {@link TextDocument document} 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 {@link TextLine.firstNonWhitespaceCharacterIndex} === {@link TextLine.text TextLine.text.length}. + */ + readonly isEmptyOrWhitespace: boolean; + } + + /** + * Represents a text document, such as a source file. Text documents have + * {@link TextLine lines} 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 {@link FileSystemProvider} + * @see {@link TextDocumentContentProvider} + */ + readonly uri: Uri; + + /** + * The file system path of the associated resource. Shorthand + * notation for {@link TextDocument.uri TextDocument.uri.fsPath}. 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 {@link Uri.scheme `uri.scheme`} + * to figure out where a document will be {@link FileSystemProvider saved}, 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 has 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 {@link EndOfLine end of line} 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 {@link TextLine line}. + */ + 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 {@link TextDocument.validatePosition adjusted}. + * + * @see {@link TextDocument.lineAt} + * + * @param position A position. + * @return A {@link TextLine line}. + */ + lineAt(position: Position): TextLine; + + /** + * Converts the position to a zero-based offset. + * + * The position will be {@link TextDocument.validatePosition adjusted}. + * + * @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 {@link Position}. + */ + positionAt(offset: number): Position; + + /** + * Get the text of this document. A substring can be retrieved by providing + * a range. The range will be {@link TextDocument.validateRange adjusted}. + * + * @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} 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 {@link TextLine.text `TextLine.text`} for more complex, non-wordy, scenarios. + * + * The position will be {@link TextDocument.validatePosition adjusted}. + * + * @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 {@link Position.with with} or + * {@link Position.translate 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 {@link Position.line existing value} + * @param character Value that should be used as character value, default is the {@link Position.character existing value} + * @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 {@link Range.start start}.isBeforeOrEqual({@link Range.end end}) + * + * Range objects are __immutable__. Use the {@link Range.with with}, + * {@link Range.intersection intersection}, or {@link Range.union union} methods + * to derive new ranges from an existing range. + */ + export class Range { + + /** + * The start position. It is before or equal to {@link Range.end end}. + */ + readonly start: Position; + + /** + * The end position. It is after or equal to {@link Range.start 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 {@link Position.isEqual equal} 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 {@link Range.start current start}. + * @param end A position that should be used as end. The default value is the {@link Range.end current 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 {@link Selection.active active}. + */ + anchor: Position; + + /** + * The position of the cursor. + * This position might be before or after {@link Selection.anchor 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 {@link Selection.active active}.isBefore({@link Selection.anchor anchor}). + */ + isReversed: boolean; + } + + /** + * Represents sources that can cause {@link window.onDidChangeTextEditorSelection selection change events}. + */ + 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 {@link TextEditor.selections text editor's selections}. + */ + export interface TextEditorSelectionChangeEvent { + /** + * The {@link TextEditor text editor} for which the selections have changed. + */ + readonly textEditor: TextEditor; + /** + * The new value for the {@link TextEditor.selections text editor's selections}. + */ + readonly selections: ReadonlyArray; + /** + * The {@link TextEditorSelectionChangeKind change kind} which has triggered this + * event. Can be `undefined`. + */ + readonly kind?: TextEditorSelectionChangeKind; + } + + /** + * Represents an event describing the change in a {@link TextEditor.visibleRanges text editor's visible ranges}. + */ + export interface TextEditorVisibleRangesChangeEvent { + /** + * The {@link TextEditor text editor} for which the visible ranges have changed. + */ + readonly textEditor: TextEditor; + /** + * The new value for the {@link TextEditor.visibleRanges text editor's visible ranges}. + */ + readonly visibleRanges: ReadonlyArray; + } + + /** + * Represents an event describing the change in a {@link TextEditor.options text editor's options}. + */ + export interface TextEditorOptionsChangeEvent { + /** + * The {@link TextEditor text editor} for which the options have changed. + */ + readonly textEditor: TextEditor; + /** + * The new value for the {@link TextEditor.options text editor's options}. + */ + readonly options: TextEditorOptions; + } + + /** + * Represents an event describing the change of a {@link TextEditor.viewColumn text editor's view column}. + */ + export interface TextEditorViewColumnChangeEvent { + /** + * The {@link TextEditor text editor} for which the view column has changed. + */ + readonly textEditor: TextEditor; + /** + * The new value for the {@link TextEditor.viewColumn text editor's view column}. + */ + 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 {@link TextEditor text editor}'s {@link TextEditor.options 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 {@link TextEditorOptions.insertSpaces 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 {@link TextEditorOptions.tabSize n} 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 {@link DecorationRenderOptions styling options} in a {@link TextEditor text editor}. + * + * To get an instance of a `TextEditorDecorationType` use + * {@link window.createTextEditorDecorationType 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 {@link TextEditor.revealRange reveal} 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 {@link DecorationRenderOptions.overviewRulerLane overview ruler}. + * 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 {@link TextDocument document} in an {@link TextEditor editor}. + */ + export interface TextDocumentShowOptions { + /** + * An optional view column in which the {@link TextEditor editor} should be shown. + * The default is the {@link ViewColumn.Active active}, other values are adjusted to + * be `Min(column, columnCount + 1)`, the {@link ViewColumn.Active active}-column is + * not adjusted. Use {@link 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 {@link TextEditor editor} from taking focus. + */ + preserveFocus?: boolean; + + /** + * An optional flag that controls if an {@link TextEditor editor}-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 {@link TextEditor editor}. + */ + 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, {@link ThemeIcon.File File}, {@link ThemeIcon.Folder Folder}, + * and [ThemeIcon ids](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing) are supported. + * Using a theme icon is preferred over a custom icon as it gives product theme authors the possibility to change the icons. + * + * *Note* that theme icons can also be rendered inside labels and descriptions. Places that support theme icons spell this out + * and they use the `$()`-syntax, for instance `quickPick.label = "Hello World $(globe)"`. + */ + export class ThemeIcon { + /** + * Reference to an icon representing a file. The icon is taken from the current file icon theme or a placeholder icon is used. + */ + static readonly File: ThemeIcon; + + /** + * Reference to an icon representing a folder. The icon is taken from the current file icon theme or a placeholder icon is used. + */ + static readonly Folder: ThemeIcon; + + /** + * The id of the icon. The available icons are listed in https://code.visualstudio.com/api/references/icons-in-labels#icon-listing. + */ + readonly id: string; + + /** + * The optional ThemeColor of the icon. The color is currently only used in {@link TreeItem}. + */ + readonly color?: ThemeColor; + + /** + * Creates a reference to a theme icon. + * @param id id of the icon. The available icons are listed in https://code.visualstudio.com/api/references/icons-in-labels#icon-listing. + * @param color optional `ThemeColor` for the icon. The color is currently only used in {@link TreeItem}. + */ + constructor(id: string, color?: ThemeColor); + } + + /** + * Represents theme specific rendering styles for a {@link TextEditorDecorationType text editor decoration}. + */ + 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 {@link ThemeColor referenced}. + */ + 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 {@link TextEditorDecorationType text editor decoration}. + */ + 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 {@link TextEditorDecorationType decoration set}. + */ + 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 {@link TextDocument document}. + */ + 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. + */ + readonly viewColumn?: ViewColumn; + + /** + * Perform an edit on the document associated with this text editor. + * + * The given callback-function is invoked with an {@link TextEditorEdit edit-builder} 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 {@link TextEditorEdit edit-builder}. + * @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 {@link SnippetString snippet} 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 {@link TextEditorDecorationType decoration type}, they will be replaced. + * + * @see {@link window.createTextEditorDecorationType createTextEditorDecorationType}. + * + * @param decorationType A decoration type. + * @param rangesOrOptions Either {@link Range ranges} or more detailed {@link DecorationOptions options}. + */ + 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 {@link window.showTextDocument} instead. + * + * @param column The {@link ViewColumn column} 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 {@link TextDocument document}. + */ + 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 {@link TextDocument document} associated with a {@link TextEditor text editor}. + */ + 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 {@link TextDocument document}. + * + * @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 {@link TextDocument document}. + * Although the equivalent text edit can be made with {@link TextEditorEdit.replace 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 {@link TextDocument document}. + */ + 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 {@link 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 {@link Uri.scheme scheme} + * will be `file`. + * + * The *difference* between {@link Uri.parse} and {@link 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; + + /** + * Create a new uri which path is the result of joining + * the path of the base uri with the provided path segments. + * + * - Note 1: `joinPath` only affects the path component + * and all other components (scheme, authority, query, and fragment) are + * left as they are. + * - Note 2: The base uri must have a path; an error is thrown otherwise. + * + * The path segments are normalized in the following ways: + * - sequences of path separators (`/` or `\`) are replaced with a single separator + * - for `file`-uris on windows, the backslash-character (`\`) is considered a path-separator + * - the `..`-segment denotes the parent segment, the `.` denotes the current segment + * - paths have a root which always remains, for instance on windows drive-letters are roots + * so that is true: `joinPath(Uri.file('file:///c:/root'), '../../other').fsPath === 'c:/other'` + * + * @param base An uri. Must have a path. + * @param pathSegments One more more path fragments + * @returns A new uri which path is joined with the given fragments + */ + static joinPath(base: Uri, ...pathSegments: 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 {@link Uri.path `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 {@link 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 + * {@link CancellationTokenSource}. + */ + export interface CancellationToken { + + /** + * Is `true` when the token has been cancelled, `false` otherwise. + */ + isCancellationRequested: boolean; + + /** + * An {@link Event} which fires upon cancellation. + */ + onCancellationRequested: Event; + } + + /** + * A cancellation source creates and controls a {@link CancellationToken cancellation token}. + */ + 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; + } + + /** + * An error type that should be used to signal cancellation of an operation. + * + * This type can be used in response to a {@link CancellationToken cancellation token} + * being cancelled or when an operation is being cancelled by the + * executor of that operation. + */ + export class CancellationError extends Error { + + /** + * Creates a new cancellation error. + */ + constructor(); + } + + /** + * 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. + * + * @example + * 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 {@link 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 {@link 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 {@link TextDocumentContentProvider} or when providing + * API to other extensions. + */ + export class EventEmitter { + + /** + * The event listeners can subscribe to. + */ + event: Event; + + /** + * Notify all subscribers of the {@link EventEmitter.event 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 or from other {@link FileSystemProvider FileSystemProviders}. + * + * To get an instance of a `FileSystemWatcher` use + * {@link workspace.createFileSystemWatcher 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 {@link workspace.registerTextDocumentContentProvider registered} + * for a {@link Uri.scheme uri-scheme}. When a uri with that scheme is to + * be {@link workspace.openTextDocument loaded} 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 + * {@link TextDocument document}. Resources allocated should be released when + * the corresponding document has been {@link workspace.onDidCloseTextDocument closed}. + * + * **Note**: The contents of the created {@link TextDocument document} 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 {@link workspace.registerTextDocumentContentProvider registered} 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. Supports rendering of {@link ThemeIcon theme icons} via + * the `$()`-syntax. + */ + label: string; + + /** + * A human-readable string which is rendered less prominent in the same line. Supports rendering of + * {@link ThemeIcon theme icons} via the `$()`-syntax. + */ + description?: string; + + /** + * A human-readable string which is rendered less prominent in a separate line. Supports rendering of + * {@link ThemeIcon theme icons} via the `$()`-syntax. + */ + detail?: string; + + /** + * Optional flag indicating if this item is picked initially. + * (Only honored when the picker allows multiple selections.) + * + * @see {@link 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 string that represents the title of the quick pick. + */ + title?: string; + + /** + * 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 placeholder 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 {@link WorkspaceFolder workspace folder} pick UI. + */ + export interface WorkspaceFolderPickOptions { + + /** + * An optional string to show as placeholder 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: On Windows and Linux, a file dialog cannot be both a file selector and a folder selector, so if you + * set both `canSelectFiles` and `canSelectFolders` to `true` on these platforms, a folder selector will be shown. + * * 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[] }; + + /** + * Dialog title. + * + * This parameter might be ignored, as not all operating systems display a title on open dialogs + * (for example, macOS). + */ + title?: 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[] }; + + /** + * Dialog title. + * + * This parameter might be ignored, as not all operating systems display a title on save dialogs + * (for example, macOS). + */ + title?: string; + } + + /** + * Represents an action that is shown with an information, warning, or + * error message. + * + * @see {@link window.showInformationMessage showInformationMessage} + * @see {@link window.showWarningMessage showWarningMessage} + * @see {@link window.showErrorMessage 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 {@link window.showInformationMessage showInformationMessage} + * @see {@link window.showWarningMessage showWarningMessage} + * @see {@link window.showErrorMessage 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 { + + /** + * An optional string that represents the title of the input box. + */ + title?: string; + + /** + * The value to prefill in the input box. + */ + value?: string; + + /** + * Selection of the prefilled {@link InputBoxOptions.value `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 placeholder in the input box to guide the user what to type. + */ + placeHolder?: string; + + /** + * Controls if a password input is shown. Password input hides the typed text. + */ + 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 file path. The base path can either be an absolute file + * path as string or uri or a {@link WorkspaceFolder workspace folder}, which is the + * preferred way of creating the relative pattern. + */ + 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 file path and pattern to match. This pattern + * will be matched on file paths relative to the base. + * + * Example: + * ```ts + * const folder = vscode.workspace.workspaceFolders?.[0]; + * if (folder) { + * + * // Match any TypeScript file in the root of this workspace folder + * const pattern1 = new vscode.RelativePattern(folder, '*.ts'); + * + * // Match any TypeScript file in `someFolder` inside this workspace folder + * const pattern2 = new vscode.RelativePattern(folder, 'someFolder/*.ts'); + * } + * ``` + * + * @param base A base to which this pattern will be matched against relatively. It is recommended + * to pass in a {@link WorkspaceFolder workspace folder} if the pattern should match inside the workspace. + * Otherwise, a uri or string should only be used if the pattern is for a file path outside the workspace. + * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on paths relative to the base. + */ + constructor(base: WorkspaceFolder | Uri | 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 {@link RelativePattern relative pattern}. + * + * 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 {@link RelativePattern relative pattern} 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 {@link TextDocument.languageId language}, the {@link Uri.scheme scheme} of + * its resource, or a glob-pattern that is applied to the {@link TextDocument.fileName path}. + * + * @example A language filter that applies to typescript files on disk + * { language: 'typescript', scheme: 'file' } + * + * @example 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`. + */ + readonly language?: string; + + /** + * A Uri {@link Uri.scheme scheme}, like `file` or `untitled`. + */ + readonly scheme?: string; + + /** + * A {@link GlobPattern glob pattern} that is matched on the absolute path of the document. Use a {@link RelativePattern relative pattern} + * to filter documents to a {@link WorkspaceFolder workspace folder}. + */ + readonly pattern?: GlobPattern; + } + + /** + * A language selector is the combination of one or many language identifiers + * and {@link DocumentFilter language filters}. + * + * *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'. + * + * @example + * let sel:DocumentSelector = { scheme: 'file', language: 'typescript' }; + */ + export type DocumentSelector = DocumentFilter | string | ReadonlyArray; + + /** + * A provider result represents the values a provider, like the {@link 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 {@link 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. They must be explicitly requested and will not show in the + * normal [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) menu. Source actions + * can be run on save using `editor.codeActionsOnSave` and are also shown in the `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; + } + + /** + * The reason why code actions were requested. + */ + export enum CodeActionTriggerKind { + /** + * Code actions were explicitly requested by the user or by an extension. + */ + Invoke = 1, + + /** + * Code actions were requested automatically. + * + * This typically happens when current selection in a file changes, but can + * also be triggered when file content changes. + */ + Automatic = 2, + } + + /** + * Contains additional diagnostic information about the context in which + * a {@link CodeActionProvider.provideCodeActions code action} is run. + */ + export interface CodeActionContext { + /** + * The reason why code actions were requested. + */ + readonly triggerKind: CodeActionTriggerKind; + + /** + * 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](https://code.visualstudio.com/docs/editor/editingevolved#_code-action). + */ + 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 {@link CodeAction.edit `edit`} and/or a {@link CodeAction.command `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 {@link WorkspaceEdit workspace edit} this code action performs. + */ + edit?: WorkspaceEdit; + + /** + * {@link Diagnostic Diagnostics} that this code action resolves. + */ + diagnostics?: Diagnostic[]; + + /** + * A {@link Command} this code action executes. + * + * If this command throws an exception, VS Code displays the exception message to users in the editor at the + * current cursor position. + */ + command?: Command; + + /** + * {@link CodeActionKind Kind} 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; + + /** + * Marks that the code action cannot currently be applied. + * + * - Disabled code actions are not shown in automatic [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) + * code action menu. + * + * - Disabled actions are shown as faded out in the code action menu when the user request a more specific type + * of code action, such as refactorings. + * + * - If the user has a [keybinding](https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions) + * that auto applies a code action and only a disabled code actions are returned, VS Code will show the user an + * error message with `reason` in the editor. + */ + disabled?: { + /** + * Human readable description of why the code action is currently disabled. + * + * This is displayed in the code actions UI. + */ + readonly reason: string; + }; + + /** + * Creates a new code action. + * + * A code action must have at least a {@link CodeAction.title title} and {@link CodeAction.edit edits} + * and/or a {@link CodeAction.command 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 [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature. + * + * A code action can be any command that is {@link commands.getCommands known} 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 code actions, such as quick fixes or refactorings. The lack of a result can be signaled + * by returning `undefined`, `null`, or an empty array. + * + * We also support returning `Command` for legacy reasons, however all new extensions should return + * `CodeAction` object instead. + */ + provideCodeActions(document: TextDocument, range: Range | Selection, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | T)[]>; + + /** + * Given a code action fill in its {@link CodeAction.edit `edit`}-property. Changes to + * all other properties, like title, are ignored. A code action that has an edit + * will not be resolved. + * + * *Note* that a code action provider that returns commands, not code actions, cannot successfully + * implement this function. Returning commands is deprecated and instead code actions should be + * returned. + * + * @param codeAction A code action. + * @param token A cancellation token. + * @return The resolved code action or a thenable that resolves to such. It is OK to return the given + * `item`. When no result is returned, the given `item` will be used. + */ + resolveCodeAction?(codeAction: T, token: CancellationToken): ProviderResult; + } + + /** + * Metadata about the type of code actions that a {@link CodeActionProvider} provides. + */ + export interface CodeActionProviderMetadata { + /** + * List of {@link CodeActionKind CodeActionKinds} that a {@link CodeActionProvider} may return. + * + * This list is used to determine if a given `CodeActionProvider` should be invoked or not. + * To avoid unnecessary computation, every `CodeActionProvider` should list use `providedCodeActionKinds`. The + * list of kinds may either be generic, such as `[CodeActionKind.Refactor]`, or list out every kind provided, + * such as `[CodeActionKind.Refactor.Extract.append('function'), CodeActionKind.Refactor.Extract.append('constant'), ...]`. + */ + readonly providedCodeActionKinds?: ReadonlyArray; + + /** + * Static documentation for a class of code actions. + * + * Documentation from the provider is shown in the code actions menu if either: + * + * - Code actions of `kind` are requested by VS Code. In this case, VS Code will show the documentation that + * most closely matches the requested code action kind. For example, if a provider has documentation for + * both `Refactor` and `RefactorExtract`, when the user requests code actions for `RefactorExtract`, + * VS Code will use the documentation for `RefactorExtract` instead of the documentation for `Refactor`. + * + * - Any code actions of `kind` are returned by the provider. + * + * At most one documentation entry will be shown per provider. + */ + readonly documentation?: ReadonlyArray<{ + /** + * The kind of the code action being documented. + * + * If the kind is generic, such as `CodeActionKind.Refactor`, the documentation will be shown whenever any + * refactorings are returned. If the kind if more specific, such as `CodeActionKind.RefactorExtract`, the + * documentation will only be shown when extract refactoring code actions are returned. + */ + readonly kind: CodeActionKind; + + /** + * Command that displays the documentation to the user. + * + * This can display the documentation directly in VS Code or open a website using {@link env.openExternal `env.openExternal`}; + * + * The title of this documentation code action is taken from {@link Command.title `Command.title`} + */ + readonly command: Command; + }>; + } + + /** + * A code lens represents a {@link 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 {@link CodeLensProvider.provideCodeLenses} + * @see {@link 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 {@link Command commands} 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 {@link CodeLens lenses}. 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 {@link CodeLensProvider.resolveCodeLens resolve}. + * + * @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 {@link CodeLensProvider.provideCodeLenses compute}-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: T, token: CancellationToken): ProviderResult; + } + + /** + * Information about where a symbol is defined. + * + * Provides additional metadata over normal {@link Location} definitions, including the range of + * the defining symbol + */ + export type DefinitionLink = LocationLink; + + /** + * The definition of a symbol represented as one or many {@link Location locations}. + * 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 {@link Location locations} + * or {@link LocationLink location links}. + */ + 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. + * + * When created with `supportThemeIcons` then rendering of {@link ThemeIcon theme icons} via + * the `$()`-syntax is supported. + */ + 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; + + /** + * Indicates that this markdown string can contain {@link ThemeIcon ThemeIcons}, e.g. `$(zap)`. + */ + readonly supportThemeIcons?: boolean; + + /** + * Creates a new markdown string with the given value. + * + * @param value Optional, initial value. + * @param supportThemeIcons Optional, Specifies whether {@link ThemeIcon ThemeIcons} are supported within the {@link MarkdownString `MarkdownString`}. + */ + constructor(value?: string, supportThemeIcons?: boolean); + + /** + * 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. When {@link MarkdownString.supportThemeIcons `supportThemeIcons`} is `true`, {@link ThemeIcon ThemeIcons} in the `value` will be iconified. + * @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 {@link languages.getLanguages language identifier}. + */ + 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 {@link 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; + } + + /** + * An EvaluatableExpression represents an expression in a document that can be evaluated by an active debugger or runtime. + * The result of this evaluation is shown in a tooltip-like widget. + * If only a range is specified, the expression will be extracted from the underlying document. + * An optional expression can be used to override the extracted expression. + * In this case the range is still used to highlight the range in the document. + */ + export class EvaluatableExpression { + + /* + * The range is used to extract the evaluatable expression from the underlying document and to highlight it. + */ + readonly range: Range; + + /* + * If specified the expression overrides the extracted expression. + */ + readonly expression?: string; + + /** + * Creates a new evaluatable expression object. + * + * @param range The range in the underlying document from which the evaluatable expression is extracted. + * @param expression If specified overrides the extracted expression. + */ + constructor(range: Range, expression?: string); + } + + /** + * The evaluatable expression provider interface defines the contract between extensions and + * the debug hover. In this contract the provider returns an evaluatable expression for a given position + * in a document and VS Code evaluates this expression in the active debug session and shows the result in a debug hover. + */ + export interface EvaluatableExpressionProvider { + + /** + * Provide an evaluatable expression for the given document and position. + * VS Code will evaluate this expression in the active debug session and will show the result in the debug hover. + * The expression can be implicitly specified by the range in the underlying document or by explicitly returning an expression. + * + * @param document The document for which the debug hover is about to appear. + * @param position The line and character position in the document where the debug hover is about to appear. + * @param token A cancellation token. + * @return An EvaluatableExpression or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideEvaluatableExpression(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + } + + /** + * Provide inline value as text. + */ + export class InlineValueText { + /** + * The document range for which the inline value applies. + */ + readonly range: Range; + /** + * The text of the inline value. + */ + readonly text: string; + /** + * Creates a new InlineValueText object. + * + * @param range The document line where to show the inline value. + * @param text The value to be shown for the line. + */ + constructor(range: Range, text: string); + } + + /** + * Provide inline value through a variable lookup. + * If only a range is specified, the variable name will be extracted from the underlying document. + * An optional variable name can be used to override the extracted name. + */ + export class InlineValueVariableLookup { + /** + * The document range for which the inline value applies. + * The range is used to extract the variable name from the underlying document. + */ + readonly range: Range; + /** + * If specified the name of the variable to look up. + */ + readonly variableName?: string; + /** + * How to perform the lookup. + */ + readonly caseSensitiveLookup: boolean; + /** + * Creates a new InlineValueVariableLookup object. + * + * @param range The document line where to show the inline value. + * @param variableName The name of the variable to look up. + * @param caseSensitiveLookup How to perform the lookup. If missing lookup is case sensitive. + */ + constructor(range: Range, variableName?: string, caseSensitiveLookup?: boolean); + } + + /** + * Provide an inline value through an expression evaluation. + * If only a range is specified, the expression will be extracted from the underlying document. + * An optional expression can be used to override the extracted expression. + */ + export class InlineValueEvaluatableExpression { + /** + * The document range for which the inline value applies. + * The range is used to extract the evaluatable expression from the underlying document. + */ + readonly range: Range; + /** + * If specified the expression overrides the extracted expression. + */ + readonly expression?: string; + /** + * Creates a new InlineValueEvaluatableExpression object. + * + * @param range The range in the underlying document from which the evaluatable expression is extracted. + * @param expression If specified overrides the extracted expression. + */ + constructor(range: Range, expression?: string); + } + + /** + * Inline value information can be provided by different means: + * - directly as a text value (class InlineValueText). + * - as a name to use for a variable lookup (class InlineValueVariableLookup) + * - as an evaluatable expression (class InlineValueEvaluatableExpression) + * The InlineValue types combines all inline value types into one type. + */ + export type InlineValue = InlineValueText | InlineValueVariableLookup | InlineValueEvaluatableExpression; + + /** + * A value-object that contains contextual information when requesting inline values from a InlineValuesProvider. + */ + export interface InlineValueContext { + + /** + * The stack frame (as a DAP Id) where the execution has stopped. + */ + readonly frameId: number; + + /** + * The document range where execution has stopped. + * Typically the end position of the range denotes the line where the inline values are shown. + */ + readonly stoppedLocation: Range; + } + + /** + * The inline values provider interface defines the contract between extensions and the VS Code debugger inline values feature. + * In this contract the provider returns inline value information for a given document range + * and VS Code shows this information in the editor at the end of lines. + */ + export interface InlineValuesProvider { + + /** + * An optional event to signal that inline values have changed. + * @see {@link EventEmitter} + */ + onDidChangeInlineValues?: Event | undefined; + + /** + * Provide "inline value" information for a given document and range. + * VS Code calls this method whenever debugging stops in the given document. + * The returned inline values information is rendered in the editor at the end of lines. + * + * @param document The document for which the inline values information is needed. + * @param viewPort The visible document range for which inline values should be computed. + * @param context A bag containing contextual information like the current location. + * @param token A cancellation token. + * @return An array of InlineValueDescriptors or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext, 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 {@link DocumentHighlightKind.Text text}. + */ + kind?: DocumentHighlightKind; + + /** + * Creates a new document highlight object. + * + * @param range The range the highlight applies to. + * @param kind The highlight kind, default is {@link DocumentHighlightKind.Text 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 + } + + /** + * Symbol tags are extra annotations that tweak the rendering of a symbol. + */ + export enum SymbolTag { + + /** + * Render a symbol as obsolete, usually using a strike-out. + */ + Deprecated = 1 + } + + /** + * 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; + + /** + * Tags for this symbol. + */ + tags?: ReadonlyArray; + + /** + * 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 {@link 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; + + /** + * Tags for this symbol. + */ + tags?: ReadonlyArray; + + /** + * 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 {@link DocumentSymbol.range `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 + * {@link SymbolInformation.location 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 {@link SymbolInformation.location location}. This method is called whenever a symbol + * is selected in the UI. Providers can implement this method and return incomplete symbols from + * {@link WorkspaceSymbolProvider.provideWorkspaceSymbols `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: T, 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); + } + + /** + * Additional data for entries of a workspace edit. Supports to label entries and marks entries + * as needing confirmation by the user. The editor groups edits with equal labels into tree nodes, + * for instance all edits labelled with "Changes in Strings" would be a tree node. + */ + export interface WorkspaceEditEntryMetadata { + + /** + * A flag which indicates that user confirmation is needed. + */ + needsConfirmation: boolean; + + /** + * A human-readable string which is rendered prominent. + */ + label: string; + + /** + * A human-readable string which is rendered less prominent on the same line. + */ + description?: string; + + /** + * The icon path or {@link ThemeIcon} for the edit. + */ + iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; + } + + /** + * A workspace edit is a collection of textual and files changes for + * multiple resources and documents. + * + * Use the {@link workspace.applyEdit 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. + * @param metadata Optional metadata for the entry. + */ + replace(uri: Uri, range: Range, newText: string, metadata?: WorkspaceEditEntryMetadata): void; + + /** + * Insert the given text at the given position. + * + * @param uri A resource identifier. + * @param position A position. + * @param newText A string. + * @param metadata Optional metadata for the entry. + */ + insert(uri: Uri, position: Position, newText: string, metadata?: WorkspaceEditEntryMetadata): void; + + /** + * Delete the text at the given range. + * + * @param uri A resource identifier. + * @param range A range. + * @param metadata Optional metadata for the entry. + */ + delete(uri: Uri, range: Range, metadata?: WorkspaceEditEntryMetadata): 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. + * When both are unset and when the file already exists then the edit cannot + * be applied successfully. + * @param metadata Optional metadata for the entry. + */ + createFile(uri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; + + /** + * Delete a file or folder. + * + * @param uri The uri of the file that is to be deleted. + * @param metadata Optional metadata for the entry. + */ + deleteFile(uri: Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): 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. + * @param metadata Optional metadata for the entry. + */ + renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): 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 {@link SnippetString.value `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 {@link SnippetString.value `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 {@link SnippetString.value `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 choice (`${1|a,b,c|}`) to + * the {@link SnippetString.value `value`} of this snippet string. + * + * @param values The values for choices - the array of strings + * @param number The number of this tabstop, defaults to an auto-increment + * value starting at 1. + * @return This snippet string. + */ + appendChoice(values: string[], number?: number): SnippetString; + + /** + * Builder-function that appends a variable (`${VAR}`) to + * the {@link SnippetString.value `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. + * + * *Note: * This function should throw an error or return a rejected thenable when the provided location + * doesn't allow for a rename. + * + * @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; + } + + /** + * A semantic tokens legend contains the needed information to decipher + * the integer encoded representation of semantic tokens. + */ + export class SemanticTokensLegend { + /** + * The possible token types. + */ + readonly tokenTypes: string[]; + /** + * The possible token modifiers. + */ + readonly tokenModifiers: string[]; + + constructor(tokenTypes: string[], tokenModifiers?: string[]); + } + + /** + * A semantic tokens builder can help with creating a `SemanticTokens` instance + * which contains delta encoded semantic tokens. + */ + export class SemanticTokensBuilder { + + constructor(legend?: SemanticTokensLegend); + + /** + * Add another token. + * + * @param line The token start line number (absolute value). + * @param char The token start character (absolute value). + * @param length The token length in characters. + * @param tokenType The encoded token type. + * @param tokenModifiers The encoded token modifiers. + */ + push(line: number, char: number, length: number, tokenType: number, tokenModifiers?: number): void; + + /** + * Add another token. Use only when providing a legend. + * + * @param range The range of the token. Must be single-line. + * @param tokenType The token type. + * @param tokenModifiers The token modifiers. + */ + push(range: Range, tokenType: string, tokenModifiers?: string[]): void; + + /** + * Finish and create a `SemanticTokens` instance. + */ + build(resultId?: string): SemanticTokens; + } + + /** + * Represents semantic tokens, either in a range or in an entire document. + * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens} for an explanation of the format. + * @see {@link SemanticTokensBuilder} for a helper to create an instance. + */ + export class SemanticTokens { + /** + * The result id of the tokens. + * + * This is the id that will be passed to `DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits` (if implemented). + */ + readonly resultId?: string; + /** + * The actual tokens data. + * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens} for an explanation of the format. + */ + readonly data: Uint32Array; + + constructor(data: Uint32Array, resultId?: string); + } + + /** + * Represents edits to semantic tokens. + * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits provideDocumentSemanticTokensEdits} for an explanation of the format. + */ + export class SemanticTokensEdits { + /** + * The result id of the tokens. + * + * This is the id that will be passed to `DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits` (if implemented). + */ + readonly resultId?: string; + /** + * The edits to the tokens data. + * All edits refer to the initial data state. + */ + readonly edits: SemanticTokensEdit[]; + + constructor(edits: SemanticTokensEdit[], resultId?: string); + } + + /** + * Represents an edit to semantic tokens. + * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits provideDocumentSemanticTokensEdits} for an explanation of the format. + */ + export class SemanticTokensEdit { + /** + * The start offset of the edit. + */ + readonly start: number; + /** + * The count of elements to remove. + */ + readonly deleteCount: number; + /** + * The elements to insert. + */ + readonly data?: Uint32Array; + + constructor(start: number, deleteCount: number, data?: Uint32Array); + } + + /** + * The document semantic tokens provider interface defines the contract between extensions and + * semantic tokens. + */ + export interface DocumentSemanticTokensProvider { + /** + * An optional event to signal that the semantic tokens from this provider have changed. + */ + onDidChangeSemanticTokens?: Event; + + /** + * Tokens in a file are represented as an array of integers. The position of each token is expressed relative to + * the token before it, because most tokens remain stable relative to each other when edits are made in a file. + * + * --- + * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices: + * - at index `5*i` - `deltaLine`: token line number, relative to the previous token + * - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line) + * - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline. + * - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536. + * - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers` + * + * --- + * ### How to encode tokens + * + * Here is an example for encoding a file with 3 tokens in a uint32 array: + * ``` + * { line: 2, startChar: 5, length: 3, tokenType: "property", tokenModifiers: ["private", "static"] }, + * { line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] }, + * { line: 5, startChar: 2, length: 7, tokenType: "class", tokenModifiers: [] } + * ``` + * + * 1. First of all, a legend must be devised. This legend must be provided up-front and capture all possible token types. + * For this example, we will choose the following legend which must be passed in when registering the provider: + * ``` + * tokenTypes: ['property', 'type', 'class'], + * tokenModifiers: ['private', 'static'] + * ``` + * + * 2. The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. Token types are looked + * up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, + * so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because + * bits 0 and 1 are set. Using this legend, the tokens now are: + * ``` + * { line: 2, startChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, + * { line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 }, + * { line: 5, startChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } + * ``` + * + * 3. The next step is to represent each token relative to the previous token in the file. In this case, the second token + * is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` + * of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the + * `startChar` of the third token will not be altered: + * ``` + * { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, + * { deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 }, + * { deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } + * ``` + * + * 4. Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation: + * ``` + * // 1st token, 2nd token, 3rd token + * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] + * ``` + * + * @see {@link SemanticTokensBuilder} for a helper to encode tokens as integers. + * *NOTE*: When doing edits, it is possible that multiple edits occur until VS Code decides to invoke the semantic tokens provider. + * *NOTE*: If the provider cannot temporarily compute semantic tokens, it can indicate this by throwing an error with the message 'Busy'. + */ + provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): ProviderResult; + + /** + * Instead of always returning all the tokens in a file, it is possible for a `DocumentSemanticTokensProvider` to implement + * this method (`provideDocumentSemanticTokensEdits`) and then return incremental updates to the previously provided semantic tokens. + * + * --- + * ### How tokens change when the document changes + * + * Suppose that `provideDocumentSemanticTokens` has previously returned the following semantic tokens: + * ``` + * // 1st token, 2nd token, 3rd token + * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] + * ``` + * + * Also suppose that after some edits, the new semantic tokens in a file are: + * ``` + * // 1st token, 2nd token, 3rd token + * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] + * ``` + * It is possible to express these new tokens in terms of an edit applied to the previous tokens: + * ``` + * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // old tokens + * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // new tokens + * + * edit: { start: 0, deleteCount: 1, data: [3] } // replace integer at offset 0 with 3 + * ``` + * + * *NOTE*: If the provider cannot compute `SemanticTokensEdits`, it can "give up" and return all the tokens in the document again. + * *NOTE*: All edits in `SemanticTokensEdits` contain indices in the old integers array, so they all refer to the previous result state. + */ + provideDocumentSemanticTokensEdits?(document: TextDocument, previousResultId: string, token: CancellationToken): ProviderResult; + } + + /** + * The document range semantic tokens provider interface defines the contract between extensions and + * semantic tokens. + */ + export interface DocumentRangeSemanticTokensProvider { + /** + * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens}. + */ + provideDocumentRangeSemanticTokens(document: TextDocument, range: Range, 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 + * {@link SignatureInformation.label signature label}. *Note*: A label of type string must be + * a substring of its containing signature information's {@link SignatureInformation.label 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[]; + + /** + * The index of the active parameter. + * + * If provided, this is used in place of {@link SignatureHelp.activeSignature `SignatureHelp.activeSignature`}. + */ + activeParameter?: number; + + /** + * 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 {@link 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 + * {@link SignatureHelpProvider.provideSignatureHelp `SignatureHelpProvider`} 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 {@link 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 {@link 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, + User = 25, + Issue = 26, + } + + /** + * Completion item tags are extra annotations that tweak the rendering of a completion + * item. + */ + export enum CompletionItemTag { + /** + * Render a completion as obsolete, usually using a strike-out. + */ + Deprecated = 1 + } + + /** + * 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 {@link CompletionItem.label label}. In that + * case the completion item will replace the {@link TextDocument.getWordRangeAtPosition word} + * until the cursor with the given label or {@link CompletionItem.insertText insertText}. Otherwise the + * given {@link CompletionItem.textEdit edit} is used. + * + * When selecting a completion item in the editor its defined or synthesized text edit will be applied + * to *all* cursors/selections whereas {@link CompletionItem.additionalTextEdits additionalTextEdits} will be + * applied as provided. + * + * @see {@link CompletionItemProvider.provideCompletionItems} + * @see {@link 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; + + /** + * Tags for this completion item. + */ + tags?: ReadonlyArray; + + /** + * 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 {@link CompletionItem.label label} + * is used. + * + * Note that `sortText` is only used for the initial ordering of completion + * items. When having a leading word (prefix) ordering is based on how + * well completions match that prefix and the initial ordering is only used + * when completions match equally well. The prefix is defined by the + * {@link CompletionItem.range `range`}-property and can therefore be different + * for each completion. + */ + sortText?: string; + + /** + * A string that should be used when filtering a set of + * completion items. When `falsy` the {@link CompletionItem.label label} + * is used. + * + * Note that the filter text is matched against the leading word (prefix) which is defined + * by the {@link CompletionItem.range `range`}-property. + */ + 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 {@link CompletionItem.label label} + * is used. + */ + insertText?: string | SnippetString; + + /** + * A range or a insert and replace range selecting the text that should be replaced by this completion item. + * + * When omitted, the range of the {@link TextDocument.getWordRangeAtPosition current word} is used as replace-range + * and as insert-range the start of the {@link TextDocument.getWordRangeAtPosition current word} to the + * current position is used. + * + * *Note 1:* A range must be a {@link Range.isSingleLine single line} and it must + * {@link Range.contains contain} the position at which completion has been {@link CompletionItemProvider.provideCompletionItems requested}. + * *Note 2:* A insert range must be a prefix of a replace range, that means it must be contained and starting at the same position. + */ + range?: Range | { inserting: Range; replacing: 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 {@link CompletionItem.insertText 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 {@link TextEdit edit} which is applied to a document when selecting + * this completion. When an edit is provided the value of + * {@link CompletionItem.insertText insertText} is ignored. + * + * The {@link Range} of the edit must be single-line and on the same + * line completions were {@link CompletionItemProvider.provideCompletionItems requested} at. + */ + textEdit?: TextEdit; + + /** + * An optional array of additional {@link TextEdit text edits} that are applied when + * selecting this completion. Edits must not overlap with the main {@link CompletionItem.textEdit edit} + * nor with themselves. + */ + additionalTextEdits?: TextEdit[]; + + /** + * An optional {@link Command} that is executed *after* inserting this completion. *Note* that + * additional modifications to the current document should be described with the + * {@link CompletionItem.additionalTextEdits additionalTextEdits}-property. + */ + command?: Command; + + /** + * Creates a new completion item. + * + * Completion items must have at least a {@link CompletionItem.label 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 {@link CompletionItemKind kind} of the completion. + */ + constructor(label: string, kind?: CompletionItemKind); + } + + /** + * Represents a collection of {@link CompletionItem completion items} 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: T[]; + + /** + * Creates a new completion list. + * + * @param items The completion items. + * @param isIncomplete The list is not complete. + */ + constructor(items?: T[], isIncomplete?: boolean); + } + + /** + * How a {@link CompletionItemProvider completion provider} 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 + * {@link CompletionItemProvider.provideCompletionItems completion provider} 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 {@link CompletionItem.detail `detail`} + * and {@link CompletionItem.documentation `documentation`} properties by implementing the + * {@link CompletionItemProvider.resolveCompletionItem `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 {@link CompletionList completion list}, 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 {@link CompletionItem.documentation doc-comment} + * or {@link CompletionItem.detail details}. + * + * The editor will only resolve a completion item once. + * + * *Note* that this function is called when completion items are already showing in the UI or when an item has been + * selected for insertion. Because of that, no property that changes the presentation (label, sorting, filtering etc) + * or the (primary) insert behaviour ({@link CompletionItem.insertText insertText}) can be changed. + * + * This function may fill in {@link CompletionItem.additionalTextEdits additionalTextEdits}. However, that means an item might be + * inserted *before* resolving is done and in that case the editor will do a best effort to still apply those additional + * text edits. + * + * @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: T, 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 {@link DocumentLink document links} 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 {@link DocumentLink.target 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 {@link DocumentLinkProvider.provideDocumentLinks `provideDocumentLinks`} method which + * often helps to improve performance. + * + * @param link The link that is to be resolved. + * @param token A cancellation token. + */ + resolveDocumentLink?(link: T, 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 {@link 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 {@link TextEdit edit} which is applied to a document when selecting + * this presentation for the color. When `falsy` the {@link ColorPresentation.label label} + * is used. + */ + textEdit?: TextEdit; + + /** + * An optional array of additional {@link TextEdit text edits} that are applied when + * selecting this color presentation. Edits must not overlap with the main {@link ColorPresentation.textEdit edit} 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 {@link ColorInformation color information} 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 {@link ColorPresentation representations} 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 {@link FoldingRangeKind Kind} of the folding range such as {@link FoldingRangeKind.Comment Comment} or + * {@link FoldingRangeKind.Region Region}. The kind is used to categorize folding ranges and used by commands + * like 'Fold all comments'. See + * {@link 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 {@link 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 { + + /** + * An optional event to signal that the folding ranges from this provider have changed. + */ + onDidChangeFoldingRanges?: Event; + + /** + * 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 {@link 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 independent for each position. The editor will merge + * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range + * is {@link Range.contains contained} 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; + } + + /** + * Represents programming constructs like functions or constructors in the context + * of call hierarchy. + */ + export class CallHierarchyItem { + /** + * The name of this item. + */ + name: string; + + /** + * The kind of this item. + */ + kind: SymbolKind; + + /** + * Tags for this item. + */ + tags?: ReadonlyArray; + + /** + * More detail for this item, e.g. the signature of a function. + */ + detail?: string; + + /** + * The resource identifier of this item. + */ + uri: Uri; + + /** + * 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 revealed when this symbol is being picked, e.g. the name of a function. + * Must be contained by the {@link CallHierarchyItem.range `range`}. + */ + selectionRange: Range; + + /** + * Creates a new call hierarchy item. + */ + constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); + } + + /** + * Represents an incoming call, e.g. a caller of a method or constructor. + */ + export class CallHierarchyIncomingCall { + + /** + * The item that makes the call. + */ + from: CallHierarchyItem; + + /** + * The range at which at which the calls appears. This is relative to the caller + * denoted by {@link CallHierarchyIncomingCall.from `this.from`}. + */ + fromRanges: Range[]; + + /** + * Create a new call object. + * + * @param item The item making the call. + * @param fromRanges The ranges at which the calls appear. + */ + constructor(item: CallHierarchyItem, fromRanges: Range[]); + } + + /** + * Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc. + */ + export class CallHierarchyOutgoingCall { + + /** + * The item that is called. + */ + to: CallHierarchyItem; + + /** + * The range at which this item is called. This is the range relative to the caller, e.g the item + * passed to {@link CallHierarchyProvider.provideCallHierarchyOutgoingCalls `provideCallHierarchyOutgoingCalls`} + * and not {@link CallHierarchyOutgoingCall.to `this.to`}. + */ + fromRanges: Range[]; + + /** + * Create a new call object. + * + * @param item The item being called + * @param fromRanges The ranges at which the calls appear. + */ + constructor(item: CallHierarchyItem, fromRanges: Range[]); + } + + /** + * The call hierarchy provider interface describes the contract between extensions + * and the call hierarchy feature which allows to browse calls and caller of function, + * methods, constructor etc. + */ + export interface CallHierarchyProvider { + + /** + * Bootstraps call hierarchy by returning the item that is denoted by the given document + * and position. This item will be used as entry into the call graph. Providers should + * return `undefined` or `null` when there is no item at the given location. + * + * @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. + * @returns A call hierarchy item or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + prepareCallHierarchy(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + + /** + * Provide all incoming calls for an item, e.g all callers for a method. In graph terms this describes directed + * and annotated edges inside the call graph, e.g the given item is the starting node and the result is the nodes + * that can be reached. + * + * @param item The hierarchy item for which incoming calls should be computed. + * @param token A cancellation token. + * @returns A set of incoming calls or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideCallHierarchyIncomingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult; + + /** + * Provide all outgoing calls for an item, e.g call calls to functions, methods, or constructors from the given item. In + * graph terms this describes directed and annotated edges inside the call graph, e.g the given item is the starting + * node and the result is the nodes that can be reached. + * + * @param item The hierarchy item for which outgoing calls should be computed. + * @param token A cancellation token. + * @returns A set of outgoing calls or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideCallHierarchyOutgoingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult; + } + + /** + * Represents a list of ranges that can be edited together along with a word pattern to describe valid range contents. + */ + export class LinkedEditingRanges { + /** + * Create a new linked editing ranges object. + * + * @param ranges A list of ranges that can be edited together + * @param wordPattern An optional word pattern that describes valid contents for the given ranges + */ + constructor(ranges: Range[], wordPattern?: RegExp); + + /** + * A list of ranges that can be edited together. The ranges must have + * identical length and text content. The ranges cannot overlap. + */ + readonly ranges: Range[]; + + /** + * An optional word pattern that describes valid contents for the given ranges. + * If no pattern is provided, the language configuration's word pattern will be used. + */ + readonly wordPattern?: RegExp; + } + + /** + * The linked editing range provider interface defines the contract between extensions and + * the linked editing feature. + */ + export interface LinkedEditingRangeProvider { + /** + * For a given position in a document, returns the range of the symbol at the position and all ranges + * that have the same content. A change to one of the ranges can be applied to all other ranges if the new content + * is valid. An optional word pattern can be returned with the result to describe valid contents. + * If no result-specific word pattern is provided, the word pattern from the language configuration is used. + * + * @param document The document in which the provider was invoked. + * @param position The position at which the provider was invoked. + * @param token A cancellation token. + * @return A list of ranges that can be edited together + */ + provideLinkedEditingRanges(document: TextDocument, position: 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; + /** + * This rule will only execute if the text above the current line matches this regular expression. + */ + previousLineText?: 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 Settings* + * - *Global (User) Settings* + * - *Workspace settings* + * - *Workspace Folder settings* - From one of the {@link workspace.workspaceFolders Workspace Folders} under which requested resource belongs to. + * - *Language settings* - Settings defined under requested language. + * + * The *effective* value (returned by {@link WorkspaceConfiguration.get `get`}) is computed by overriding or merging the values in the following order. + * + * ``` + * `defaultValue` (if defined in `package.json` otherwise derived from the value's type) + * `globalValue` (if defined) + * `workspaceValue` (if defined) + * `workspaceFolderValue` (if defined) + * `defaultLanguageValue` (if defined) + * `globalLanguageValue` (if defined) + * `workspaceLanguageValue` (if defined) + * `workspaceFolderLanguageValue` (if defined) + * ``` + * **Note:** Only `object` value types are merged and all other value types are overridden. + * + * Example 1: Overriding + * + * ```ts + * defaultValue = 'on'; + * globalValue = 'relative' + * workspaceFolderValue = 'off' + * value = 'off' + * ``` + * + * Example 2: Language Values + * + * ```ts + * defaultValue = 'on'; + * globalValue = 'relative' + * workspaceFolderValue = 'off' + * globalLanguageValue = 'on' + * value = 'on' + * ``` + * + * Example 3: Object Values + * + * ```ts + * defaultValue = { "a": 1, "b": 2 }; + * globalValue = { "b": 3, "c": 4 }; + * value = { "a": 1, "b": 3, "c": 4 }; + * ``` + * + * *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.workspace.workspaceFolders[0].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, folder-specific value + * and language-specific values (if {@link WorkspaceConfiguration} is scoped to a language). + * + * Also provides all language ids under which the given configuration setting is defined. + * + * *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, + + defaultLanguageValue?: T; + globalLanguageValue?: T; + workspaceLanguageValue?: T; + workspaceFolderLanguageValue?: T; + + languageIds?: string[]; + + } | undefined; + + /** + * Update a configuration value. The updated configuration values are persisted. + * + * A value can be changed in + * + * - {@link ConfigurationTarget.Global Global settings}: Changes the value for all instances of the editor. + * - {@link ConfigurationTarget.Workspace Workspace settings}: Changes the value for current workspace, if available. + * - {@link ConfigurationTarget.WorkspaceFolder Workspace folder settings}: Changes the value for settings from one of the {@link workspace.workspaceFolders Workspace Folders} under which the requested resource belongs to. + * - Language settings: Changes the value for the requested languageId. + * + * *Note:* To remove a configuration value use `undefined`, like so: `config.update('somekey', undefined)` + * + * @param section Configuration name, supports _dotted_ names. + * @param value The new value. + * @param configurationTarget The {@link ConfigurationTarget configuration target} or a boolean value. + * - If `true` updates {@link ConfigurationTarget.Global Global settings}. + * - If `false` updates {@link ConfigurationTarget.Workspace Workspace settings}. + * - If `undefined` or `null` updates to {@link ConfigurationTarget.WorkspaceFolder Workspace folder settings} if configuration is resource specific, + * otherwise to {@link ConfigurationTarget.Workspace Workspace settings}. + * @param overrideInLanguage Whether to update the value in the scope of requested languageId or not. + * - If `true` updates the value under the requested languageId. + * - If `undefined` updates the value under the requested languageId only if the configuration is defined for the language. + * @throws error while updating + * - configuration which is not registered. + * - window configuration to workspace folder + * - configuration to workspace or workspace folder when no workspace is opened. + * - configuration to workspace folder when there is no workspace folder settings. + * - configuration to workspace folder when {@link WorkspaceConfiguration} is not scoped to a resource. + */ + update(section: string, value: any, configurationTarget?: ConfigurationTarget | boolean, overrideInLanguage?: 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 {@link Location locations}, + * 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, + + /** + * Deprecated or obsolete code. + * + * Diagnostics with this tag are rendered with a strike through. + */ + Deprecated = 2, + } + + /** + * 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 {@link DiagnosticSeverity.Error 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 {@link CodeActionContext code actions}. + */ + code?: string | number | { + /** + * A code or identifier for this diagnostic. + * Should be used for later processing, e.g. when providing {@link CodeActionContext code actions}. + */ + value: string | number; + + /** + * A target URI to open with more information about the diagnostic error. + */ + target: Uri; + }; + + /** + * 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 {@link DiagnosticSeverity.Error error}. + */ + constructor(range: Range, message: string, severity?: DiagnosticSeverity); + } + + /** + * A diagnostics collection is a container that manages a set of + * {@link Diagnostic diagnostics}. Diagnostics are always scopes to a + * diagnostics collection and a resource. + * + * To get an instance of a `DiagnosticCollection` use + * {@link languages.createDiagnosticCollection 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 diagnostics for multiple resources in this collection. + * + * _Note_ that 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 {@link Diagnostic diagnostics} 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 + * {@link DiagnosticCollection.clear 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* {@link TextEditor.viewColumn 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* {@link TextEditor.viewColumn 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 + * {@link window.createOutputChannel 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; + } + + /** + * Accessibility information which controls screen reader behavior. + */ + export interface AccessibilityInformation { + /** + * Label to be read out by a screen reader once the item has focus. + */ + label: string; + + /** + * Role of the widget which defines how a screen reader interacts with it. + * The role should be set in special cases when for example a tree-like element behaves like a checkbox. + * If role is not specified VS Code will pick the appropriate role automatically. + * More about aria roles can be found here https://w3c.github.io/aria/#widget_roles + */ + role?: string; + } + + /** + * 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 ThemeIcon [icon set](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing), 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 background color for this entry. + * + * *Note*: only `new ThemeColor('statusBarItem.errorBackground')` is + * supported for now. More background colors may be supported in the + * future. + * + * *Note*: when a background color is set, the statusbar may override + * the `color` choice to ensure the entry is readable in all themes. + */ + backgroundColor: ThemeColor | undefined; + + /** + * {@link Command `Command`} or identifier of a command to run on click. + * + * The command must be {@link commands.getCommands known}. + * + * Note that if this is a {@link Command `Command`} object, only the {@link Command.command `command`} and {@link Command.arguments `arguments`} + * are used by VS Code. + */ + command: string | Command | undefined; + + /** + * Accessibility information used when screen reader interacts with this StatusBar item + */ + accessibilityInformation?: AccessibilityInformation; + + /** + * Shows the entry in the status bar. + */ + show(): void; + + /** + * Hide the entry in the status bar. + */ + hide(): void; + + /** + * Dispose and free associated resources. Call + * {@link StatusBarItem.hide 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; + + /** + * The object used to initialize the terminal, this is useful for example to detecting the + * shell type of when the terminal was not launched by this extension or for detecting what + * folder the shell was launched in. + */ + readonly creationOptions: Readonly; + + /** + * The exit status of the terminal, this will be undefined while the terminal is active. + * + * **Example:** Show a notification with the exit code when the terminal exits with a + * non-zero exit code. + * ```typescript + * window.onDidCloseTerminal(t => { + * if (t.exitStatus && t.exitStatus.code) { + * vscode.window.showInformationMessage(`Exit code: ${t.exitStatus.code}`); + * } + * }); + * ``` + */ + readonly exitStatus: TerminalExitStatus | undefined; + + /** + * 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; + } + + /** + * Provides information on a line in a terminal in order to provide links for it. + */ + export interface TerminalLinkContext { + /** + * This is the text from the unwrapped line in the terminal. + */ + line: string; + + /** + * The terminal the link belongs to. + */ + terminal: Terminal; + } + + /** + * A provider that enables detection and handling of links within terminals. + */ + export interface TerminalLinkProvider { + /** + * Provide terminal links for the given context. Note that this can be called multiple times + * even before previous calls resolve, make sure to not share global objects (eg. `RegExp`) + * that could have problems when asynchronous usage may overlap. + * @param context Information about what links are being provided for. + * @param token A cancellation token. + * @return A list of terminal links for the given line. + */ + provideTerminalLinks(context: TerminalLinkContext, token: CancellationToken): ProviderResult; + + /** + * Handle an activated terminal link. + * @param link The link to handle. + */ + handleTerminalLink(link: T): ProviderResult; + } + + /** + * A link on a terminal line. + */ + export interface TerminalLink { + /** + * The start index of the link on {@link TerminalLinkContext.line}. + */ + startIndex: number; + + /** + * The length of the link on {@link TerminalLinkContext.line}. + */ + length: number; + + /** + * 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; + } + + /** + * A file decoration represents metadata that can be rendered with a file. + */ + export class FileDecoration { + + /** + * A very short string that represents this decoration. + */ + badge?: string; + + /** + * A human-readable tooltip for this decoration. + */ + tooltip?: string; + + /** + * The color of this decoration. + */ + color?: ThemeColor; + + /** + * A flag expressing that this decoration should be + * propagated to its parents. + */ + propagate?: boolean; + + /** + * Creates a new decoration. + * + * @param badge A letter that represents the decoration. + * @param tooltip The tooltip of the decoration. + * @param color The color of the decoration. + */ + constructor(badge?: string, tooltip?: string, color?: ThemeColor); + } + + /** + * The decoration provider interfaces defines the contract between extensions and + * file decorations. + */ + export interface FileDecorationProvider { + + /** + * An optional event to signal that decorations for one or many files have changed. + * + * *Note* that this event should be used to propagate information about children. + * + * @see {@link EventEmitter} + */ + onDidChangeFileDecorations?: Event; + + /** + * Provide decorations for a given uri. + * + * *Note* that this function is only called when a file gets rendered in the UI. + * This means a decoration from a descendent that propagates upwards must be signaled + * to the editor via the {@link FileDecorationProvider.onDidChangeFileDecorations onDidChangeFileDecorations}-event. + * + * @param uri The uri of the file to provide a decoration for. + * @param token A cancellation token. + * @returns A decoration or a thenable that resolves to such. + */ + provideFileDecoration(uri: Uri, token: CancellationToken): ProviderResult; + } + + + /** + * 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 {@link extensions.getExtension getExtension}. + */ + export interface Extension { + + /** + * The canonical extension identifier in the form of: `publisher.name`. + */ + readonly id: string; + + /** + * The uri of the directory containing the extension. + */ + readonly extensionUri: Uri; + + /** + * The absolute file path of the directory containing this extension. Shorthand + * notation for {@link Extension.extensionUri Extension.extensionUri.fsPath} (independent of the uri scheme). + */ + 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 + * is defined in the `package.json`-file of extensions but can also be refined + * via the `remote.extensionKind`-setting. When no remote extension host exists, + * the value is {@link 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; + } + + /** + * The ExtensionMode is provided on the `ExtensionContext` and indicates the + * mode the specific extension is running in. + */ + export enum ExtensionMode { + /** + * The extension is installed normally (for example, from the marketplace + * or VSIX) in VS Code. + */ + Production = 1, + + /** + * The extension is running from an `--extensionDevelopmentPath` provided + * when launching VS Code. + */ + Development = 2, + + /** + * The extension is running from an `--extensionTestsPath` and + * the extension host is running unit tests. + */ + Test = 3, + } + + /** + * 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 {@link workspace.workspaceFolders workspace}. + */ + readonly workspaceState: Memento; + + /** + * A memento object that stores state independent + * of the current opened {@link workspace.workspaceFolders workspace}. + */ + readonly globalState: Memento & { + /** + * Set the keys whose values should be synchronized across devices when synchronizing user-data + * like configuration, extensions, and mementos. + * + * Note that this function defines the whole set of keys whose values are synchronized: + * - calling it with an empty array stops synchronization for this memento + * - calling it with a non-empty array replaces all keys whose values are synchronized + * + * For any given set of keys this function needs to be called only once but there is no harm in + * repeatedly calling it. + * + * @param keys The set of keys whose values are synced. + */ + setKeysForSync(keys: string[]): void; + }; + + /** + * A storage utility for secrets. + */ + readonly secrets: SecretStorage; + + /** + * The uri of the directory containing the extension. + */ + readonly extensionUri: Uri; + + /** + * The absolute file path of the directory containing the extension. Shorthand + * notation for {@link TextDocument.uri ExtensionContext.extensionUri.fsPath} (independent of the uri scheme). + */ + readonly extensionPath: string; + + /** + * Gets the extension's environment variable collection for this workspace, enabling changes + * to be applied to terminal environment variables. + */ + readonly environmentVariableCollection: EnvironmentVariableCollection; + + /** + * Get the absolute path of a resource contained in the extension. + * + * *Note* that an absolute uri can be constructed via {@link Uri.joinPath `Uri.joinPath`} and + * {@link ExtensionContext.extensionUri `extensionUri`}, e.g. `vscode.Uri.joinPath(context.extensionUri, relativePath);` + * + * @param relativePath A relative path to a resource contained in the extension. + * @return The absolute path of the resource. + */ + asAbsolutePath(relativePath: string): string; + + /** + * The uri of a workspace specific directory in which the extension + * can store private state. The directory might not exist and creation is + * up to the extension. However, the parent directory is guaranteed to be existent. + * The value is `undefined` when no workspace nor folder has been opened. + * + * Use {@link ExtensionContext.workspaceState `workspaceState`} or + * {@link ExtensionContext.globalState `globalState`} to store key value data. + * + * @see {@link FileSystem `workspace.fs`} for how to read and write files and folders from + * an uri. + */ + readonly storageUri: Uri | undefined; + + /** + * 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 {@link ExtensionContext.workspaceState `workspaceState`} or + * {@link ExtensionContext.globalState `globalState`} to store key value data. + * + * @deprecated Use {@link ExtensionContext.storageUri storageUri} instead. + */ + readonly storagePath: string | undefined; + + /** + * The uri of a directory 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 {@link ExtensionContext.globalState `globalState`} to store key value data. + * + * @see {@link FileSystem `workspace.fs`} for how to read and write files and folders from + * an uri. + */ + readonly globalStorageUri: Uri; + + /** + * 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 {@link ExtensionContext.globalState `globalState`} to store key value data. + * + * @deprecated Use {@link ExtensionContext.globalStorageUri globalStorageUri} instead. + */ + readonly globalStoragePath: string; + + /** + * The uri 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. + * + * @see {@link FileSystem `workspace.fs`} for how to read and write files and folders from + * an uri. + */ + readonly logUri: Uri; + + /** + * 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. + * + * @deprecated Use {@link ExtensionContext.logUri logUri} instead. + */ + readonly logPath: string; + + /** + * The mode the extension is running in. This is specific to the current + * extension. One extension may be in `ExtensionMode.Development` while + * other extensions in the host run in `ExtensionMode.Release`. + */ + readonly extensionMode: ExtensionMode; + + /** + * The current `Extension` instance. + */ + readonly extension: Extension; + } + + /** + * 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; + } + + /** + * The event data that is fired when a secret is added or removed. + */ + export interface SecretStorageChangeEvent { + /** + * The key of the secret that has changed. + */ + readonly key: string; + } + + /** + * Represents a storage utility for secrets, information that is + * sensitive. + */ + export interface SecretStorage { + /** + * Retrieve a secret that was stored with key. Returns undefined if there + * is no password matching that key. + * @param key The key the secret was stored under. + * @returns The stored value or `undefined`. + */ + get(key: string): Thenable; + + /** + * Store a secret under a given key. + * @param key The key to store the secret under. + * @param value The secret. + */ + store(key: string, value: string): Thenable; + + /** + * Remove a secret from storage. + * @param key The key the secret was stored under. + */ + delete(key: string): Thenable; + + /** + * Fires when a secret is stored or deleted. + */ + onDidChange: Event; + } + + /** + * Represents a color theme kind. + */ + export enum ColorThemeKind { + Light = 1, + Dark = 2, + HighContrast = 3 + } + + /** + * Represents a color theme. + */ + export interface ColorTheme { + + /** + * The kind of this color theme: light, dark or high contrast. + */ + readonly kind: ColorThemeKind; + } + + /** + * 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 | undefined; + + /** + * 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; + } + + /** + * Class used to execute an extension callback as a task. + */ + export class CustomExecution { + /** + * Constructs a CustomExecution task object. The callback will be executed when the task is run, at which point the + * extension should return the Pseudoterminal it will "run in". The task should wait to do further execution until + * {@link Pseudoterminal.open} is called. Task cancellation should be handled using + * {@link Pseudoterminal.close}. When the task is complete fire + * {@link Pseudoterminal.onDidClose}. + * @param callback The callback that will be called when the task is started by a user. Any ${} style variables that + * were in the task definition will be resolved and passed into the callback as `resolvedDefinition`. + */ + constructor(callback: (resolvedDefinition: TaskDefinition) => Thenable); + } + + /** + * The scope of a task. + */ + export enum TaskScope { + /** + * The task is a global task. Global tasks are currently not supported. + */ + 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. Global tasks are currently not supported. + * @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 | CustomExecution, 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; + + /** + * A human-readable string which is rendered less prominently on a separate line in places + * where the task's name is displayed. Supports rendering of {@link ThemeIcon theme icons} + * via the `$()`-syntax. + */ + detail?: string; + + /** + * The task's execution engine + */ + execution?: ProcessExecution | ShellExecution | CustomExecution; + + /** + * 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'. Supports rendering of {@link ThemeIcon theme icons} via the `$()`-syntax. + */ + 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 {@link 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 {@link Task.execution `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`. + * + * Note that when filling in the properties of `task`, you _must_ be sure to + * use the exact same `TaskDefinition` and not create a new one. Other properties + * may be changed. + * + * @param task The task to resolve. + * @param token A cancellation token. + * @return The resolved task + */ + resolveTask(task: T, 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. Will be `undefined` when the task is terminated. + */ + readonly exitCode: number | undefined; + } + + 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 {@link 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 Optional filter to select tasks of a certain type or version. + */ + 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. + * + * @throws When running a ShellExecution or a ProcessExecution + * task in an environment where a new process cannot be started. + * In such an environment, only CustomExecution tasks can be run. + * + * @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 case 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. + * + * *Note:* This value might be a bitmask, e.g. `FileType.File | FileType.SymbolicLink`. + */ + 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. + * + * *Note:* If the file changed, it is important to provide an updated `mtime` that advanced + * from the previous value. Otherwise there may be optimizations in place that will not show + * the updated file contents in an editor for example. + */ + mtime: number; + /** + * The size in bytes. + * + * *Note:* If the file changed, it is important to provide an updated `size`. Otherwise there + * may be optimizations in place that will not show the updated file contents in an editor for + * example. + */ + 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); + + /** + * A code that identifies this error. + * + * Possible values are names of errors, like {@link FileSystemError.FileNotFound `FileNotFound`}, + * or `Unknown` for unspecified errors. + */ + readonly code: string; + } + + /** + * 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 {@link Uri uris} 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 {@link FileType kinds} 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 {@link FileSystemProvider.watch watched} + * by clients of this provider. + * + * *Note:* It is important that the metadata of the file that changed provides an + * updated `mtime` that advanced from the previous value in the {@link FileStat stat} and a + * correct `size` value. Otherwise there may be optimizations in place that will not show + * the change in an editor for example. + */ + 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 {@link FileType.SymbolicLink 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 {@link FileSystemError.FileNotFound `FileNotFound`} when `uri` doesn't exist. + */ + stat(uri: Uri): FileStat | Thenable; + + /** + * Retrieve all entries of a {@link FileType.Directory directory}. + * + * @param uri The uri of the folder. + * @return An array of name/type-tuples or a thenable that resolves to such. + * @throws {@link FileSystemError.FileNotFound `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 {@link FileSystemError.FileNotFound `FileNotFound`} when the parent of `uri` doesn't exist, e.g. no mkdirp-logic required. + * @throws {@link FileSystemError.FileExists `FileExists`} when `uri` already exists. + * @throws {@link FileSystemError.NoPermissions `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 {@link FileSystemError.FileNotFound `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 {@link FileSystemError.FileNotFound `FileNotFound`} when `uri` doesn't exist and `create` is not set. + * @throws {@link FileSystemError.FileNotFound `FileNotFound`} when the parent of `uri` doesn't exist and `create` is set, e.g. no mkdirp-logic required. + * @throws {@link FileSystemError.FileExists `FileExists`} when `uri` already exists, `create` is set but `overwrite` is not set. + * @throws {@link FileSystemError.NoPermissions `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 {@link FileSystemError.FileNotFound `FileNotFound`} when `uri` doesn't exist. + * @throws {@link FileSystemError.NoPermissions `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 {@link FileSystemError.FileNotFound `FileNotFound`} when `oldUri` doesn't exist. + * @throws {@link FileSystemError.FileNotFound `FileNotFound`} when parent of `newUri` doesn't exist, e.g. no mkdirp-logic required. + * @throws {@link FileSystemError.FileExists `FileExists`} when `newUri` exists and when the `overwrite` option is not `true`. + * @throws {@link FileSystemError.NoPermissions `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 {@link FileSystemError.FileNotFound `FileNotFound`} when `source` doesn't exist. + * @throws {@link FileSystemError.FileNotFound `FileNotFound`} when parent of `destination` doesn't exist, e.g. no mkdirp-logic required. + * @throws {@link FileSystemError.FileExists `FileExists`} when `destination` exists and when the `overwrite` option is not `true`. + * @throws {@link FileSystemError.NoPermissions `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 + * {@link FileSystemProvider file system providers}. 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 available as {@link 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 {@link FileType.Directory 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). + * + * *Note* that missing directories are created automatically, e.g this call has + * `mkdirp` semantics. + * + * @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; + + /** + * Check if a given file system supports writing files. + * + * Keep in mind that just because a file system supports writing, that does + * not mean that writes will always succeed. There may be permissions issues + * or other errors that prevent writing a file. + * + * @param scheme The scheme of the filesystem, for example `file` or `git`. + * + * @return `true` if the file system supports writing, `false` if it does not + * support writing (i.e. it is readonly), and `undefined` if VS Code does not + * know about the filesystem. + */ + isWritableFileSystem(scheme: string): boolean | undefined; + } + + /** + * 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 uris from `asWebviewUri` + * + * 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; + } + + /** + * Displays html content, similarly to an iframe. + */ + export interface Webview { + /** + * Content settings for the webview. + */ + options: WebviewOptions; + + /** + * HTML contents of the webview. + * + * This should be a complete, valid html document. Changing this property causes the webview to be reloaded. + * + * Webviews are sandboxed from normal extension process, so all communication with the webview must use + * message passing. To send a message from the extension to the webview, use {@link Webview.postMessage `postMessage`}. + * To send message from the webview back to an extension, use the `acquireVsCodeApi` function inside the webview + * to get a handle to VS Code's api and then call `.postMessage()`: + * + * ```html + * + * ``` + * + * To load a resources from the workspace inside a webview, use the `{@link Webview.asWebviewUri asWebviewUri}` method + * and ensure the resource's directory is listed in {@link WebviewOptions.localResourceRoots `WebviewOptions.localResourceRoots`}. + * + * Keep in mind that even though webviews are sandboxed, they still allow running scripts and loading arbitrary content, + * so extensions must follow all standard web security best practices when working with webviews. This includes + * properly sanitizing all untrusted input (including content from the workspace) and + * setting a [content security policy](https://aka.ms/vscode-api-webview-csp). + */ + html: string; + + /** + * Fired when the webview content posts a message. + * + * Webview content can post strings or json serializable objects back to a VS Code extension. They cannot + * post `Blob`, `File`, `ImageData` and other DOM specific objects since the extension that receives the + * message does not run in a browser environment. + */ + readonly onDidReceiveMessage: Event; + + /** + * Post a message to the webview content. + * + * Messages are only delivered if the webview is live (either visible or in the + * background with `retainContextWhenHidden`). + * + * @param message Body of the message. This must be a string or other json serializable object. + * + * For older versions of vscode, if an `ArrayBuffer` is included in `message`, + * it will not be serialized properly and will not be received by the webview. + * Similarly any TypedArrays, such as a `Uint8Array`, will be very inefficiently + * serialized and will also not be recreated as a typed array inside the webview. + * + * However if your extension targets vscode 1.57+ in the `engines` field of its + * `package.json`, any `ArrayBuffer` values that appear in `message` will be more + * efficiently transferred to the webview and will also be correctly recreated inside + * of the webview. + */ + postMessage(message: any): Thenable; + + /** + * Convert a uri for the local file system to one that can be used inside webviews. + * + * Webviews cannot directly load resources from the workspace or local file system using `file:` uris. The + * `asWebviewUri` function takes a local `file:` uri and converts it into a uri that can be used inside of + * a webview to load the same resource: + * + * ```ts + * webview.html = `` + * ``` + */ + asWebviewUri(localResource: Uri): Uri; + + /** + * Content security policy source for webview resources. + * + * This is the origin that should be used in a content security policy rule: + * + * ``` + * img-src https: ${webview.cspSource} ...; + * ``` + */ + readonly cspSource: string; + } + + /** + * 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 }; + + /** + * {@link Webview `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. + * + * @param T Type of the webview's 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: T): Thenable; + } + + /** + * A webview based view. + */ + export interface WebviewView { + /** + * Identifies the type of the webview view, such as `'hexEditor.dataView'`. + */ + readonly viewType: string; + + /** + * The underlying webview for the view. + */ + readonly webview: Webview; + + /** + * View title displayed in the UI. + * + * The view title is initially taken from the extension `package.json` contribution. + */ + title?: string; + + /** + * Human-readable string which is rendered less prominently in the title. + */ + description?: string; + + /** + * Event fired when the view is disposed. + * + * Views are disposed when they are explicitly hidden by a user (this happens when a user + * right clicks in a view and unchecks the webview view). + * + * Trying to use the view after it has been disposed throws an exception. + */ + readonly onDidDispose: Event; + + /** + * Tracks if the webview is currently visible. + * + * Views are visible when they are on the screen and expanded. + */ + readonly visible: boolean; + + /** + * Event fired when the visibility of the view changes. + * + * Actions that trigger a visibility change: + * + * - The view is collapsed or expanded. + * - The user switches to a different view group in the sidebar or panel. + * + * Note that hiding a view using the context menu instead disposes of the view and fires `onDidDispose`. + */ + readonly onDidChangeVisibility: Event; + + /** + * Reveal the view in the UI. + * + * If the view is collapsed, this will expand it. + * + * @param preserveFocus When `true` the view will not take focus. + */ + show(preserveFocus?: boolean): void; + } + + /** + * Additional information the webview view being resolved. + * + * @param T Type of the webview's state. + */ + interface WebviewViewResolveContext { + /** + * Persisted state from the webview content. + * + * To save resources, VS Code normally deallocates webview documents (the iframe content) that are not visible. + * For example, when the user collapse a view or switches to another top level activity in the sidebar, the + * `WebviewView` itself is kept alive but the webview's underlying document is deallocated. It is recreated when + * the view becomes visible again. + * + * You can prevent this behavior by setting `retainContextWhenHidden` in the `WebviewOptions`. However this + * increases resource usage and should be avoided wherever possible. Instead, you can use persisted state to + * save off a webview's state so that it can be quickly recreated as needed. + * + * To save off a persisted state, inside the webview call `acquireVsCodeApi().setState()` with + * any json serializable object. To restore the state again, call `getState()`. For example: + * + * ```js + * // Within the webview + * const vscode = acquireVsCodeApi(); + * + * // Get existing state + * const oldState = vscode.getState() || { value: 0 }; + * + * // Update state + * setState({ value: oldState.value + 1 }) + * ``` + * + * VS Code ensures that the persisted state is saved correctly when a webview is hidden and across + * editor restarts. + */ + readonly state: T | undefined; + } + + /** + * Provider for creating `WebviewView` elements. + */ + export interface WebviewViewProvider { + /** + * Revolves a webview view. + * + * `resolveWebviewView` is called when a view first becomes visible. This may happen when the view is + * first loaded or when the user hides and then shows a view again. + * + * @param webviewView Webview view to restore. The provider should take ownership of this view. The + * provider must set the webview's `.html` and hook up all webview events it is interested in. + * @param context Additional metadata about the view being resolved. + * @param token Cancellation token indicating that the view being provided is no longer needed. + * + * @return Optional thenable indicating that the view has been fully resolved. + */ + resolveWebviewView(webviewView: WebviewView, context: WebviewViewResolveContext, token: CancellationToken): Thenable | void; + } + + /** + * Provider for text based custom editors. + * + * Text based custom editors use a {@link TextDocument `TextDocument`} as their data model. This considerably simplifies + * implementing a custom editor as it allows VS Code to handle many common operations such as + * undo and backup. The provider is responsible for synchronizing text changes between the webview and the `TextDocument`. + */ + export interface CustomTextEditorProvider { + + /** + * Resolve a custom editor for a given text resource. + * + * This is called when a user first opens a resource for a `CustomTextEditorProvider`, or if they reopen an + * existing editor using this `CustomTextEditorProvider`. + * + * + * @param document Document for the resource to resolve. + * + * @param webviewPanel The webview panel used to display the editor UI for this resource. + * + * During resolve, the provider must fill in the initial html for the content webview panel and hook up all + * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to + * use later for example in a command. See {@link WebviewPanel `WebviewPanel`} for additional details. + * + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return Thenable indicating that the custom editor has been resolved. + */ + resolveCustomTextEditor(document: TextDocument, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; + } + + /** + * Represents a custom document used by a {@link CustomEditorProvider `CustomEditorProvider`}. + * + * Custom documents are only used within a given `CustomEditorProvider`. The lifecycle of a `CustomDocument` is + * managed by VS Code. When no more references remain to a `CustomDocument`, it is disposed of. + */ + interface CustomDocument { + /** + * The associated uri for this document. + */ + readonly uri: Uri; + + /** + * Dispose of the custom document. + * + * This is invoked by VS Code when there are no more references to a given `CustomDocument` (for example when + * all editors associated with the document have been closed.) + */ + dispose(): void; + } + + /** + * Event triggered by extensions to signal to VS Code that an edit has occurred on an {@link CustomDocument `CustomDocument`}. + * + * @see {@link CustomDocumentProvider.onDidChangeCustomDocument `CustomDocumentProvider.onDidChangeCustomDocument`}. + */ + interface CustomDocumentEditEvent { + + /** + * The document that the edit is for. + */ + readonly document: T; + + /** + * Undo the edit operation. + * + * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your + * extension should restore the document and editor to the state they were in just before this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + undo(): Thenable | void; + + /** + * Redo the edit operation. + * + * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your + * extension should restore the document and editor to the state they were in just after this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + redo(): Thenable | void; + + /** + * Display name describing the edit. + * + * This will be shown to users in the UI for undo/redo operations. + */ + readonly label?: string; + } + + /** + * Event triggered by extensions to signal to VS Code that the content of a {@link CustomDocument `CustomDocument`} + * has changed. + * + * @see {@link CustomDocumentProvider.onDidChangeCustomDocument `CustomDocumentProvider.onDidChangeCustomDocument`}. + */ + interface CustomDocumentContentChangeEvent { + /** + * The document that the change is for. + */ + readonly document: T; + } + + /** + * A backup for an {@link CustomDocument `CustomDocument`}. + */ + interface CustomDocumentBackup { + /** + * Unique identifier for the backup. + * + * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. + */ + readonly id: string; + + /** + * Delete the current backup. + * + * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup + * is made or when the file is saved. + */ + delete(): void; + } + + /** + * Additional information used to implement {@link CustomEditableDocument.backup `CustomEditableDocument.backup`}. + */ + interface CustomDocumentBackupContext { + /** + * Suggested file location to write the new backup. + * + * Note that your extension is free to ignore this and use its own strategy for backup. + * + * If the editor is for a resource from the current workspace, `destination` will point to a file inside + * `ExtensionContext.storagePath`. The parent folder of `destination` may not exist, so make sure to created it + * before writing the backup to this location. + */ + readonly destination: Uri; + } + + /** + * Additional information about the opening custom document. + */ + interface CustomDocumentOpenContext { + /** + * The id of the backup to restore the document from or `undefined` if there is no backup. + * + * If this is provided, your extension should restore the editor from the backup instead of reading the file + * from the user's workspace. + */ + readonly backupId?: string; + + /** + * If the URI is an untitled file, this will be populated with the byte data of that file + * + * If this is provided, your extension should utilize this byte data rather than executing fs APIs on the URI passed in + */ + readonly untitledDocumentData?: Uint8Array; + } + + /** + * Provider for readonly custom editors that use a custom document model. + * + * Custom editors use {@link CustomDocument `CustomDocument`} as their document model instead of a {@link TextDocument `TextDocument`}. + * + * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple + * text based documents, use {@link CustomTextEditorProvider `CustomTextEditorProvider`} instead. + * + * @param T Type of the custom document returned by this provider. + */ + export interface CustomReadonlyEditorProvider { + + /** + * Create a new document for a given resource. + * + * `openCustomDocument` is called when the first time an editor for a given resource is opened. The opened + * document is then passed to `resolveCustomEditor` so that the editor can be shown to the user. + * + * Already opened `CustomDocument` are re-used if the user opened additional editors. When all editors for a + * given resource are closed, the `CustomDocument` is disposed of. Opening an editor at this point will + * trigger another call to `openCustomDocument`. + * + * @param uri Uri of the document to open. + * @param openContext Additional information about the opening custom document. + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return The custom document. + */ + openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): Thenable | T; + + /** + * Resolve a custom editor for a given resource. + * + * This is called whenever the user opens a new editor for this `CustomEditorProvider`. + * + * @param document Document for the resource being resolved. + * + * @param webviewPanel The webview panel used to display the editor UI for this resource. + * + * During resolve, the provider must fill in the initial html for the content webview panel and hook up all + * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to + * use later for example in a command. See {@link WebviewPanel `WebviewPanel`} for additional details. + * + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return Optional thenable indicating that the custom editor has been resolved. + */ + resolveCustomEditor(document: T, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; + } + + /** + * Provider for editable custom editors that use a custom document model. + * + * Custom editors use {@link CustomDocument `CustomDocument`} as their document model instead of a {@link TextDocument `TextDocument`}. + * This gives extensions full control over actions such as edit, save, and backup. + * + * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple + * text based documents, use {@link CustomTextEditorProvider `CustomTextEditorProvider`} instead. + * + * @param T Type of the custom document returned by this provider. + */ + export interface CustomEditorProvider extends CustomReadonlyEditorProvider { + /** + * Signal that an edit has occurred inside a custom editor. + * + * This event must be fired by your extension whenever an edit happens in a custom editor. An edit can be + * anything from changing some text, to cropping an image, to reordering a list. Your extension is free to + * define what an edit is and what data is stored on each edit. + * + * Firing `onDidChange` causes VS Code to mark the editors as being dirty. This is cleared when the user either + * saves or reverts the file. + * + * Editors that support undo/redo must fire a `CustomDocumentEditEvent` whenever an edit happens. This allows + * users to undo and redo the edit using VS Code's standard VS Code keyboard shortcuts. VS Code will also mark + * the editor as no longer being dirty if the user undoes all edits to the last saved state. + * + * Editors that support editing but cannot use VS Code's standard undo/redo mechanism must fire a `CustomDocumentContentChangeEvent`. + * The only way for a user to clear the dirty state of an editor that does not support undo/redo is to either + * `save` or `revert` the file. + * + * An editor should only ever fire `CustomDocumentEditEvent` events, or only ever fire `CustomDocumentContentChangeEvent` events. + */ + readonly onDidChangeCustomDocument: Event> | Event>; + + /** + * Save a custom document. + * + * This method is invoked by VS Code when the user saves a custom editor. This can happen when the user + * triggers save while the custom editor is active, by commands such as `save all`, or by auto save if enabled. + * + * To implement `save`, the implementer must persist the custom editor. This usually means writing the + * file data for the custom document to disk. After `save` completes, any associated editor instances will + * no longer be marked as dirty. + * + * @param document Document to save. + * @param cancellation Token that signals the save is no longer required (for example, if another save was triggered). + * + * @return Thenable signaling that saving has completed. + */ + saveCustomDocument(document: T, cancellation: CancellationToken): Thenable; + + /** + * Save a custom document to a different location. + * + * This method is invoked by VS Code when the user triggers 'save as' on a custom editor. The implementer must + * persist the custom editor to `destination`. + * + * When the user accepts save as, the current editor is be replaced by an non-dirty editor for the newly saved file. + * + * @param document Document to save. + * @param destination Location to save to. + * @param cancellation Token that signals the save is no longer required. + * + * @return Thenable signaling that saving has completed. + */ + saveCustomDocumentAs(document: T, destination: Uri, cancellation: CancellationToken): Thenable; + + /** + * Revert a custom document to its last saved state. + * + * This method is invoked by VS Code when the user triggers `File: Revert File` in a custom editor. (Note that + * this is only used using VS Code's `File: Revert File` command and not on a `git revert` of the file). + * + * To implement `revert`, the implementer must make sure all editor instances (webviews) for `document` + * are displaying the document in the same state is saved in. This usually means reloading the file from the + * workspace. + * + * @param document Document to revert. + * @param cancellation Token that signals the revert is no longer required. + * + * @return Thenable signaling that the change has completed. + */ + revertCustomDocument(document: T, cancellation: CancellationToken): Thenable; + + /** + * Back up a dirty custom document. + * + * Backups are used for hot exit and to prevent data loss. Your `backup` method should persist the resource in + * its current state, i.e. with the edits applied. Most commonly this means saving the resource to disk in + * the `ExtensionContext.storagePath`. When VS Code reloads and your custom editor is opened for a resource, + * your extension should first check to see if any backups exist for the resource. If there is a backup, your + * extension should load the file contents from there instead of from the resource in the workspace. + * + * `backup` is triggered approximately one second after the user stops editing the document. If the user + * rapidly edits the document, `backup` will not be invoked until the editing stops. + * + * `backup` is not invoked when `auto save` is enabled (since auto save already persists the resource). + * + * @param document Document to backup. + * @param context Information that can be used to backup the document. + * @param cancellation Token that signals the current backup since a new backup is coming in. It is up to your + * extension to decided how to respond to cancellation. If for example your extension is backing up a large file + * in an operation that takes time to complete, your extension may decide to finish the ongoing backup rather + * than cancelling it to ensure that VS Code has some valid backup. + */ + backupCustomDocument(document: T, context: CustomDocumentBackupContext, cancellation: CancellationToken): 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; + } + + /** + * Possible kinds of UI that can use extensions. + */ + export enum UIKind { + + /** + * Extensions are accessed from a desktop application. + */ + Desktop = 1, + + /** + * Extensions are accessed from a web browser. + */ + Web = 2 + } + + /** + * 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. + * + * *Note* that the value is the empty string when running in an + * environment that has no representation of an application root folder. + */ + 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; + + /** + * Indicates that this is a fresh install of the application. + * `true` if within the first day of installation otherwise `false`. + */ + export const isNewAppInstall: boolean; + + /** + * Indicates whether the users has telemetry enabled. + * Can be observed to determine if the extension should send telemetry. + */ + export const isTelemetryEnabled: boolean; + + /** + * An {@link Event} which fires when the user enabled or disables telemetry. + * `true` if the user has enabled telemetry or `false` if the user has disabled telemetry. + */ + export const onDidChangeTelemetryEnabled: Event; + + /** + * 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 {@link 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. Note that in + * environments that do not support a shell the value is the empty string. + */ + export const shell: string; + + /** + * The UI kind property indicates from which UI extensions + * are accessed from. For example, extensions could be accessed + * from a desktop application or a web browser. + */ + export const uiKind: UIKind; + + /** + * Opens a link externally using the default application. Depending on the + * used scheme this can be: + * * a browser (`http:`, `https:`) + * * a mail client (`mailto:`) + * * VSCode itself (`vscode:` from `vscode.env.uriScheme`) + * + * *Note* that {@link window.showTextDocument `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; + + /** + * Resolves a uri to form that is accessible externally. Currently only supports `https:`, `http:` and + * `vscode.env.uriScheme` uris. + * + * #### `http:` or `https:` scheme + * + * Resolves an *external* uri, such as a `http:` or `https:` link, from where the extension is running to a + * uri to the same resource on the client machine. + * + * This is a no-op if the extension is running on the client machine. + * + * If the extension is running remotely, this function automatically establishes a port forwarding tunnel + * from the local machine to `target` on the remote and returns a local uri to the tunnel. The lifetime of + * the port forwarding tunnel is managed by VS Code and the tunnel can be closed by the user. + * + * *Note* that uris passed through `openExternal` are automatically resolved and you should not call `asExternalUri` on them. + * + * #### `vscode.env.uriScheme` + * + * Creates a uri that - if opened in a browser (e.g. via `openExternal`) - will result in a registered {@link UriHandler} + * to trigger. + * + * Extensions should not make any assumptions about the resulting uri and should not alter it in anyway. + * Rather, extensions can e.g. use this uri in an authentication flow, by adding the uri as callback query + * argument to the server to authenticate to. + * + * *Note* that if the server decides to add additional query parameters to the uri (e.g. a token or secret), it + * will appear in the uri that is passed to the {@link UriHandler}. + * + * **Example** of an authentication flow: + * ```typescript + * vscode.window.registerUriHandler({ + * handleUri(uri: vscode.Uri): vscode.ProviderResult { + * if (uri.path === '/did-authenticate') { + * console.log(uri.toString()); + * } + * } + * }); + * + * const callableUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://my.extension/did-authenticate`)); + * await vscode.env.openExternal(callableUri); + * ``` + * + * *Note* that extensions should not cache the result of `asExternalUri` as the resolved uri may become invalid due to + * a system or user action — for example, in remote cases, a user may close a port forwarding tunnel that was opened by + * `asExternalUri`. + * + * @return A uri that can be used on the client machine. + */ + export function asExternalUri(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 {@link commands.registerCommand registerCommand} + * and {@link commands.registerTextEditorCommand registerTextEditorCommand} functions. Commands + * can be executed {@link commands.executeCommand manually} 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 {@link commands.registerCommand commands} 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 + * {@link TextEditorEdit edit}-builder. Note that the edit-builder is only valid while the + * callback executes. + * + * @param command A unique identifier for the command. + * @param callback A command handler function with access to an {@link TextEditor editor} and an {@link TextEditorEdit edit}. + * @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 {@link Position `Position`}, {@link Range `Range`}, {@link Uri `Uri`} and {@link 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 with 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 {@link Uri uris}. + * + * @see {@link window.registerUriHandler}. + */ + export interface UriHandler { + + /** + * Handle the provided system-wide {@link Uri}. + * + * @see {@link 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 {@link Event} which fires when the {@link window.activeTextEditor active editor} + * has changed. *Note* that the event also fires when the active editor changes + * to `undefined`. + */ + export const onDidChangeActiveTextEditor: Event; + + /** + * An {@link Event} which fires when the array of {@link window.visibleTextEditors visible editors} + * has changed. + */ + export const onDidChangeVisibleTextEditors: Event; + + /** + * An {@link Event} which fires when the selection in an editor has changed. + */ + export const onDidChangeTextEditorSelection: Event; + + /** + * An {@link Event} which fires when the visible ranges of an editor has changed. + */ + export const onDidChangeTextEditorVisibleRanges: Event; + + /** + * An {@link Event} which fires when the options of an editor have changed. + */ + export const onDidChangeTextEditorOptions: Event; + + /** + * An {@link 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 {@link Event} which fires when the {@link window.activeTerminal active terminal} + * has changed. *Note* that the event also fires when the active terminal changes + * to `undefined`. + */ + export const onDidChangeActiveTerminal: Event; + + /** + * An {@link Event} which fires when a terminal has been created, either through the + * {@link window.createTerminal createTerminal} API or commands. + */ + export const onDidOpenTerminal: Event; + + /** + * An {@link Event} which fires when a terminal is disposed. + */ + export const onDidCloseTerminal: Event; + + /** + * Represents the current window's state. + */ + export const state: WindowState; + + /** + * An {@link 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 {@link ViewColumn column} can be provided + * to control where the editor is being shown. Might change the {@link window.activeTextEditor active editor}. + * + * @param document A text document to be shown. + * @param column A view column in which the {@link TextEditor editor} should be shown. The default is the {@link ViewColumn.Active active}, other values + * are adjusted to be `Min(column, columnCount + 1)`, the {@link ViewColumn.Active active}-column is not adjusted. Use {@link 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 {@link TextEditor editor}. + */ + export function showTextDocument(document: TextDocument, column?: ViewColumn, preserveFocus?: boolean): Thenable; + + /** + * Show the given document in a text editor. {@link TextDocumentShowOptions Options} can be provided + * to control options of the editor is being shown. Might change the {@link window.activeTextEditor active editor}. + * + * @param document A text document to be shown. + * @param options {@link TextDocumentShowOptions Editor options} to configure the behavior of showing the {@link TextEditor editor}. + * @return A promise that resolves to an {@link TextEditor editor}. + */ + export function showTextDocument(document: TextDocument, options?: TextDocumentShowOptions): Thenable; + + /** + * A short-hand for `openTextDocument(uri).then(document => showTextDocument(document, options))`. + * + * @see {@link openTextDocument} + * + * @param uri A resource identifier. + * @param options {@link TextDocumentShowOptions Editor options} to configure the behavior of showing the {@link TextEditor editor}. + * @return A promise that resolves to an {@link TextEditor editor}. + */ + 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link window.showInformationMessage 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 {@link workspace.workspaceFolders workspace folders} 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 {@link QuickPick} to let the user pick an item from a list + * of items of type T. + * + * Note that in many cases the more convenient {@link window.showQuickPick} + * is easier to use. {@link window.createQuickPick} should be used + * when {@link window.showQuickPick} does not offer the required flexibility. + * + * @return A new {@link QuickPick}. + */ + export function createQuickPick(): QuickPick; + + /** + * Creates a {@link InputBox} to let the user enter some text input. + * + * Note that in many cases the more convenient {@link window.showInputBox} + * is easier to use. {@link window.createInputBox} should be used + * when {@link window.showInputBox} does not offer the required flexibility. + * + * @return A new {@link InputBox}. + */ + export function createInputBox(): InputBox; + + /** + * Creates a new {@link OutputChannel output channel} 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 {@link window.createStatusBarItem items}. + * + * @param text The message to show, supports icon substitution as in status bar {@link StatusBarItem.text items}. + * @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 {@link window.createStatusBarItem items}. + * + * @param text The message to show, supports icon substitution as in status bar {@link StatusBarItem.text items}. + * @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 {@link window.createStatusBarItem items}. + * + * *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 {@link StatusBarItem.text items}. + * @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 {@link 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 {@link ProgressOptions `ProgressOptions`}. + * + * @param task A callback returning a promise. Progress state can be reported with + * the provided {@link 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 {@link 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 {@link StatusBarItem item}. + * + * @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 {@link Terminal} with a backing shell process. The cwd of the terminal will be the workspace + * directory if it 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. + * @throws When running in an environment where a new process cannot be started. + */ + export function createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): Terminal; + + /** + * Creates a {@link Terminal} with a backing shell process. + * + * @param options A TerminalOptions object describing the characteristics of the new terminal. + * @return A new Terminal. + * @throws When running in an environment where a new process cannot be started. + */ + export function createTerminal(options: TerminalOptions): Terminal; + + /** + * Creates a {@link Terminal} where an extension controls its input and output. + * + * @param options An {@link ExtensionTerminalOptions} object describing + * the characteristics of the new terminal. + * @return A new Terminal. + */ + export function createTerminal(options: ExtensionTerminalOptions): Terminal; + + /** + * Register a {@link TreeDataProvider} for the view contributed using the extension point `views`. + * This will allow you to contribute data to the {@link TreeView} and update if the data changes. + * + * **Note:** To get access to the {@link TreeView} and perform operations on it, use {@link window.createTreeView createTreeView}. + * + * @param viewId Id of the view contributed using the extension point `views`. + * @param treeDataProvider A {@link TreeDataProvider} that provides tree data for the view + */ + export function registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): Disposable; + + /** + * Create a {@link 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 {@link TreeView} + * @returns a {@link TreeView}. + */ + export function createTreeView(viewId: string, options: TreeViewOptions): TreeView; + + /** + * Registers a {@link UriHandler uri handler} capable of handling system-wide {@link Uri uris}. + * 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 {@link 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; + + /** + * Register a new provider for webview views. + * + * @param viewId Unique id of the view. This should match the `id` from the + * `views` contribution in the package.json. + * @param provider Provider for the webview views. + * + * @return Disposable that unregisters the provider. + */ + export function registerWebviewViewProvider(viewId: string, provider: WebviewViewProvider, options?: { + /** + * Content settings for the webview created for this view. + */ + readonly webviewOptions?: { + /** + * Controls if the webview element itself (iframe) is kept around even when the view + * is no longer visible. + * + * Normally the webview's html context is created when the view 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 view 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 view's context cannot be quickly saved and restored. + */ + readonly retainContextWhenHidden?: boolean; + }; + }): Disposable; + + /** + * Register a provider for custom editors for the `viewType` contributed by the `customEditors` extension point. + * + * When a custom editor is opened, VS Code fires an `onCustomEditor:viewType` activation event. Your extension + * must register a {@link CustomTextEditorProvider `CustomTextEditorProvider`}, {@link CustomReadonlyEditorProvider `CustomReadonlyEditorProvider`}, + * {@link CustomEditorProvider `CustomEditorProvider`}for `viewType` as part of activation. + * + * @param viewType Unique identifier for the custom editor provider. This should match the `viewType` from the + * `customEditors` contribution point. + * @param provider Provider that resolves custom editors. + * @param options Options for the provider. + * + * @return Disposable that unregisters the provider. + */ + export function registerCustomEditorProvider(viewType: string, provider: CustomTextEditorProvider | CustomReadonlyEditorProvider | CustomEditorProvider, options?: { + /** + * Content settings for the webview panels created for this custom editor. + */ + readonly webviewOptions?: WebviewPanelOptions; + + /** + * Only applies to `CustomReadonlyEditorProvider | CustomEditorProvider`. + * + * Indicates that the provider allows multiple editor instances to be open at the same time for + * the same resource. + * + * By default, VS Code only allows one editor instance to be open at a time for each resource. If the + * user tries to open a second editor instance for the resource, the first one is instead moved to where + * the second one was to be opened. + * + * When `supportsMultipleEditorsPerDocument` is enabled, users can split and create copies of the custom + * editor. In this case, the custom editor must make sure it can properly synchronize the states of all + * editor instances for a resource so that they are consistent. + */ + readonly supportsMultipleEditorsPerDocument?: boolean; + }): Disposable; + + /** + * Register provider that enables the detection and handling of links within the terminal. + * @param provider The provider that provides the terminal links. + * @return Disposable that unregisters the provider. + */ + export function registerTerminalLinkProvider(provider: TerminalLinkProvider): Disposable; + + /** + * Register a file decoration provider. + * + * @param provider A {@link FileDecorationProvider}. + * @return A {@link Disposable} that unregisters the provider. + */ + export function registerFileDecorationProvider(provider: FileDecorationProvider): Disposable; + + /** + * The currently active color theme as configured in the settings. The active + * theme can be changed via the `workbench.colorTheme` setting. + */ + export let activeColorTheme: ColorTheme; + + /** + * An {@link Event} which fires when the active color theme is changed or has changes. + */ + export const onDidChangeActiveColorTheme: Event; + } + + /** + * Options for creating a {@link TreeView} + */ + export interface TreeViewOptions { + + /** + * A data provider that provides tree data. + */ + treeDataProvider: TreeDataProvider; + + /** + * Whether to show collapse all action or not. + */ + showCollapseAll?: boolean; + + /** + * Whether the tree supports multi-select. When the tree supports multi-select and a command is executed from the tree, + * the first argument to the command is the tree item that the command was executed on and the second argument is an + * array containing all selected tree items. + */ + canSelectMany?: boolean; + } + + /** + * The event that is fired when an element in the {@link 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 {@link TreeView.selection tree view's selection} + */ + export interface TreeViewSelectionChangeEvent { + + /** + * Selected elements. + */ + readonly selection: T[]; + + } + + /** + * The event that is fired when there is a change in {@link TreeView.visible tree view's visibility} + */ + export interface TreeViewVisibilityChangeEvent { + + /** + * `true` if the {@link TreeView tree view} 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 {@link TreeView.selection selection} has changed + */ + readonly onDidChangeSelection: Event>; + + /** + * `true` if the {@link TreeView tree view} is visible otherwise `false`. + */ + readonly visible: boolean; + + /** + * Event that is fired when {@link TreeView.visible visibility} has changed + */ + readonly onDidChangeVisibility: Event; + + /** + * An optional human-readable message that will be rendered in the view. + * Setting the message to null, undefined, or empty string will remove the message from the view. + */ + message?: string; + + /** + * The tree view title is initially taken from the extension package.json + * Changes to the title property will be properly reflected in the UI in the title of the view. + */ + title?: string; + + /** + * An optional human-readable description which is rendered less prominently in the title of the view. + * Setting the title description to null, undefined, or empty string will remove the description from the view. + */ + description?: string; + + /** + * 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:** The {@link TreeDataProvider} that the `TreeView` {@link window.createTreeView is registered with} with must implement {@link TreeDataProvider.getParent 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 {@link TreeItem} representation of the `element` + * + * @param element The element for which {@link TreeItem} representation is asked for. + * @return {@link 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 {@link TreeView.reveal reveal} API. + * + * @param element The element for which the parent has to be returned. + * @return Parent of `element`. + */ + getParent?(element: T): ProviderResult; + + /** + * Called on hover to resolve the {@link TreeItem.tooltip TreeItem} property if it is undefined. + * Called on tree item click/open to resolve the {@link TreeItem.command TreeItem} property if it is undefined. + * Only properties that were undefined can be resolved in `resolveTreeItem`. + * Functionality may be expanded later to include being called to resolve other missing + * properties on selection and/or on open. + * + * Will only ever be called once per TreeItem. + * + * onDidChangeTreeData should not be triggered from within resolveTreeItem. + * + * *Note* that this function is called when tree items are already showing in the UI. + * Because of that, no property that changes the presentation (label, description, etc.) + * can be changed. + * + * @param item Undefined properties of `item` should be set then `item` should be returned. + * @param element The object associated with the TreeItem. + * @param token A cancellation token. + * @return The resolved tree item or a thenable that resolves to such. It is OK to return the given + * `item`. When no result is returned, the given `item` will be used. + */ + resolveTreeItem?(item: TreeItem, element: T, token: CancellationToken): ProviderResult; + } + + export class TreeItem { + /** + * A human-readable string describing this item. When `falsy`, it is derived from {@link TreeItem.resourceUri resourceUri}. + */ + label?: string | TreeItemLabel; + + /** + * 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 {@link ThemeIcon} for the tree item. + * When `falsy`, {@link ThemeIcon.Folder Folder Theme Icon} is assigned, if item is collapsible otherwise {@link ThemeIcon.File File Theme Icon}. + * When a file or folder {@link ThemeIcon} is specified, icon is derived from the current file icon theme for the specified theme icon using {@link TreeItem.resourceUri 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 {@link TreeItem.resourceUri resourceUri} and when `falsy`, it is not shown. + */ + description?: string | boolean; + + /** + * The {@link Uri} of the resource representing this item. + * + * Will be used to derive the {@link TreeItem.label label}, when it is not provided. + * Will be used to derive the icon from current file icon theme, when {@link TreeItem.iconPath iconPath} has {@link ThemeIcon} value. + */ + resourceUri?: Uri; + + /** + * The tooltip text when you hover over this item. + */ + tooltip?: string | MarkdownString | undefined; + + /** + * The {@link Command} that should be executed when the tree item is selected. + * + * Please use `vscode.open` or `vscode.diff` as command IDs when the tree item is opening + * something in the editor. Using these commands ensures that the resulting editor will + * appear consistent with how other built-in trees open editors. + */ + command?: Command; + + /** + * {@link 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; + + /** + * Accessibility information used when screen reader interacts with this tree item. + * Generally, a TreeItem has no need to set the `role` of the accessibilityInformation; + * however, there are cases where a TreeItem is not displayed in a tree-like way where setting the `role` may make sense. + */ + accessibilityInformation?: AccessibilityInformation; + + /** + * @param label A human-readable string describing this item + * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link TreeItemCollapsibleState.None} + */ + constructor(label: string | TreeItemLabel, collapsibleState?: TreeItemCollapsibleState); + + /** + * @param resourceUri The {@link Uri} of the resource representing this item. + * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link 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 + } + + /** + * Label describing the {@link TreeItem Tree item} + */ + export interface TreeItemLabel { + + /** + * A human-readable string describing the {@link TreeItem Tree item}. + */ + label: string; + + /** + * Ranges in the label to highlight. A range is defined as a tuple of two number where the + * first is the inclusive start index and the second the exclusive end index + */ + highlights?: [number, number][]; + } + + /** + * 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 | undefined }; + + /** + * 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 message to write to the terminal on first launch, note that this is not sent to the + * process but, rather written directly to the terminal. This supports escape sequences such + * a setting text style. + */ + message?: string; + } + + /** + * Value-object describing what options a virtual process terminal should use. + */ + export interface ExtensionTerminalOptions { + /** + * A human-readable string which will be used to represent the terminal in the UI. + */ + name: string; + + /** + * An implementation of {@link Pseudoterminal} that allows an extension to + * control a terminal. + */ + pty: Pseudoterminal; + } + + /** + * Defines the interface of a terminal pty, enabling extensions to control a terminal. + */ + interface Pseudoterminal { + /** + * An event that when fired will write data to the terminal. Unlike + * {@link Terminal.sendText} which sends text to the underlying child + * pseudo-device (the child), this will write the text to parent pseudo-device (the + * _terminal_ itself). + * + * Note writing `\n` will just move the cursor down 1 row, you need to write `\r` as well + * to move the cursor to the left-most cell. + * + * **Example:** Write red text to the terminal + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * open: () => writeEmitter.fire('\x1b[31mHello world\x1b[0m'), + * close: () => {} + * }; + * vscode.window.createTerminal({ name: 'My terminal', pty }); + * ``` + * + * **Example:** Move the cursor to the 10th row and 20th column and write an asterisk + * ```typescript + * writeEmitter.fire('\x1b[10;20H*'); + * ``` + */ + onDidWrite: Event; + + /** + * An event that when fired allows overriding the {@link Pseudoterminal.setDimensions dimensions} of the + * terminal. Note that when set, the overridden dimensions will only take effect when they + * are lower than the actual dimensions of the terminal (ie. there will never be a scroll + * bar). Set to `undefined` for the terminal to go back to the regular dimensions (fit to + * the size of the panel). + * + * **Example:** Override the dimensions of a terminal to 20 columns and 10 rows + * ```typescript + * const dimensionsEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * onDidOverrideDimensions: dimensionsEmitter.event, + * open: () => { + * dimensionsEmitter.fire({ + * columns: 20, + * rows: 10 + * }); + * }, + * close: () => {} + * }; + * vscode.window.createTerminal({ name: 'My terminal', pty }); + * ``` + */ + onDidOverrideDimensions?: Event; + + /** + * An event that when fired will signal that the pty is closed and dispose of the terminal. + * + * A number can be used to provide an exit code for the terminal. Exit codes must be + * positive and a non-zero exit codes signals failure which shows a notification for a + * regular terminal and allows dependent tasks to proceed when used with the + * `CustomExecution` API. + * + * **Example:** Exit the terminal when "y" is pressed, otherwise show a notification. + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const closeEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * onDidClose: closeEmitter.event, + * open: () => writeEmitter.fire('Press y to exit successfully'), + * close: () => {}, + * handleInput: data => { + * if (data !== 'y') { + * vscode.window.showInformationMessage('Something went wrong'); + * } + * closeEmitter.fire(); + * } + * }; + * vscode.window.createTerminal({ name: 'Exit example', pty }); + * ``` + */ + onDidClose?: Event; + + /** + * Implement to handle when the pty is open and ready to start firing events. + * + * @param initialDimensions The dimensions of the terminal, this will be undefined if the + * terminal panel has not been opened before this is called. + */ + open(initialDimensions: TerminalDimensions | undefined): void; + + /** + * Implement to handle when the terminal is closed by an act of the user. + */ + close(): void; + + /** + * Implement to handle incoming keystrokes in the terminal or when an extension calls + * {@link Terminal.sendText}. `data` contains the keystrokes/text serialized into + * their corresponding VT sequence representation. + * + * @param data The incoming data. + * + * **Example:** Echo input in the terminal. The sequence for enter (`\r`) is translated to + * CRLF to go to a new line and move the cursor to the start of the line. + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * open: () => {}, + * close: () => {}, + * handleInput: data => writeEmitter.fire(data === '\r' ? '\r\n' : data) + * }; + * vscode.window.createTerminal({ name: 'Local echo', pty }); + * ``` + */ + handleInput?(data: string): void; + + /** + * Implement to handle when the number of rows and columns that fit into the terminal panel + * changes, for example when font size changes or when the panel is resized. The initial + * state of a terminal's dimensions should be treated as `undefined` until this is triggered + * as the size of a terminal isn't known until it shows up in the user interface. + * + * When dimensions are overridden by + * {@link Pseudoterminal.onDidOverrideDimensions onDidOverrideDimensions}, `setDimensions` will + * continue to be called with the regular panel dimensions, allowing the extension continue + * to react dimension changes. + * + * @param dimensions The new dimensions. + */ + setDimensions?(dimensions: TerminalDimensions): void; + } + + /** + * Represents the dimensions of a terminal. + */ + export interface TerminalDimensions { + /** + * The number of columns in the terminal. + */ + readonly columns: number; + + /** + * The number of rows in the terminal. + */ + readonly rows: number; + } + + /** + * Represents how a terminal exited. + */ + export interface TerminalExitStatus { + /** + * The exit code that a terminal exited with, it can have the following values: + * - Zero: the terminal process or custom execution succeeded. + * - Non-zero: the terminal process or custom execution failed. + * - `undefined`: the user forcibly closed the terminal or a custom execution exited + * without providing an exit code. + */ + readonly code: number | undefined; + } + + /** + * A type of mutation that can be applied to an environment variable. + */ + export enum EnvironmentVariableMutatorType { + /** + * Replace the variable's existing value. + */ + Replace = 1, + /** + * Append to the end of the variable's existing value. + */ + Append = 2, + /** + * Prepend to the start of the variable's existing value. + */ + Prepend = 3 + } + + /** + * A type of mutation and its value to be applied to an environment variable. + */ + export interface EnvironmentVariableMutator { + /** + * The type of mutation that will occur to the variable. + */ + readonly type: EnvironmentVariableMutatorType; + + /** + * The value to use for the variable. + */ + readonly value: string; + } + + /** + * A collection of mutations that an extension can apply to a process environment. + */ + export interface EnvironmentVariableCollection { + /** + * Whether the collection should be cached for the workspace and applied to the terminal + * across window reloads. When true the collection will be active immediately such when the + * window reloads. Additionally, this API will return the cached version if it exists. The + * collection will be invalidated when the extension is uninstalled or when the collection + * is cleared. Defaults to true. + */ + persistent: boolean; + + /** + * Replace an environment variable with a value. + * + * Note that an extension can only make a single change to any one variable, so this will + * overwrite any previous calls to replace, append or prepend. + * + * @param variable The variable to replace. + * @param value The value to replace the variable with. + */ + replace(variable: string, value: string): void; + + /** + * Append a value to an environment variable. + * + * Note that an extension can only make a single change to any one variable, so this will + * overwrite any previous calls to replace, append or prepend. + * + * @param variable The variable to append to. + * @param value The value to append to the variable. + */ + append(variable: string, value: string): void; + + /** + * Prepend a value to an environment variable. + * + * Note that an extension can only make a single change to any one variable, so this will + * overwrite any previous calls to replace, append or prepend. + * + * @param variable The variable to prepend. + * @param value The value to prepend to the variable. + */ + prepend(variable: string, value: string): void; + + /** + * Gets the mutator that this collection applies to a variable, if any. + * + * @param variable The variable to get the mutator for. + */ + get(variable: string): EnvironmentVariableMutator | undefined; + + /** + * Iterate over each mutator in this collection. + * + * @param callback Function to execute for each entry. + * @param thisArg The `this` context used when invoking the handler function. + */ + forEach(callback: (variable: string, mutator: EnvironmentVariableMutator, collection: EnvironmentVariableCollection) => any, thisArg?: any): void; + + /** + * Deletes this collection's mutator for a variable. + * + * @param variable The variable to delete the mutator for. + */ + delete(variable: string): void; + + /** + * Clears all mutators from this collection. + */ + clear(): void; + } + + /** + * 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 | { viewId: string }; + + /** + * 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 {@link QuickInput.show}. + * + * There are several reasons why this UI might have to be hidden and + * the extension will be notified through {@link QuickInput.onDidHide}. + * (Examples include: an explicit call to {@link 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 {@link QuickInput.hide}. + * + * When the extension no longer needs this input UI, it should + * {@link QuickInput.dispose} it to allow for freeing up + * any resources associated with it. + * + * See {@link QuickPick} and {@link 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 {@link QuickInput.onDidHide} event. + */ + show(): void; + + /** + * Hides this input UI. This will also fire an {@link 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 {@link QuickInput.onDidHide}. + * (Examples include: an explicit call to {@link 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 {@link 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 {@link QuickPick.canSelectMany canSelectMany} to allow for + * selecting multiple items. + * + * Note that in many cases the more convenient {@link window.showQuickPick} + * is easier to use. {@link window.createQuickPick} should be used + * when {@link 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 {@link QuickInput} to let the user input a text value. + * + * Note that in many cases the more convenient {@link window.showInputBox} + * is easier to use. {@link window.createInputBox} should be used + * when {@link 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 {@link QuickPick} or {@link 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 {@link QuickPick} and {@link InputBox}. + */ + export class QuickInputButtons { + + /** + * A back button for {@link QuickPick} and {@link 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 {@link TextDocument document}. + */ + export interface TextDocumentContentChangeEvent { + /** + * The range that got replaced. + */ + readonly range: Range; + /** + * The offset of the range that got replaced. + */ + readonly rangeOffset: number; + /** + * The length of the range that got replaced. + */ + readonly rangeLength: number; + /** + * The new text for the range. + */ + readonly text: string; + } + + /** + * An event describing a transactional {@link TextDocument document} 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 {@link TextDocument document} will be saved. + * + * To make modifications to the document before it is being saved, call the + * {@link TextDocumentWillSaveEvent.waitUntil `waitUntil`}-function with a thenable + * that resolves to an array of {@link TextEdit text edits}. + */ + 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 {@link TextEdit pre-save-edits}. + * 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 {@link TextEdit pre-save-edits}. + */ + 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 that is fired when files are going to be created. + * + * To make modifications to the workspace before the files are created, + * call the {@link FileWillCreateEvent.waitUntil `waitUntil`}-function with a + * thenable that resolves to a {@link WorkspaceEdit workspace edit}. + */ + export interface FileWillCreateEvent { + + /** + * The files that are going to be created. + */ + readonly files: ReadonlyArray; + + /** + * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. + * + * *Note:* This function can only be called during event dispatch and not + * in an asynchronous manner: + * + * ```ts + * workspace.onWillCreateFiles(event => { + * // async, will *throw* an error + * setTimeout(() => event.waitUntil(promise)); + * + * // sync, OK + * event.waitUntil(promise); + * }) + * ``` + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + + /** + * Allows to pause the event until the provided thenable resolves. + * + * *Note:* This function can only be called during event dispatch. + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + } + + /** + * An event that is fired after files are created. + */ + export interface FileCreateEvent { + + /** + * The files that got created. + */ + readonly files: ReadonlyArray; + } + + /** + * An event that is fired when files are going to be deleted. + * + * To make modifications to the workspace before the files are deleted, + * call the {@link FileWillCreateEvent.waitUntil `waitUntil}-function with a + * thenable that resolves to a {@link WorkspaceEdit workspace edit}. + */ + export interface FileWillDeleteEvent { + + /** + * The files that are going to be deleted. + */ + readonly files: ReadonlyArray; + + /** + * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. + * + * *Note:* This function can only be called during event dispatch and not + * in an asynchronous manner: + * + * ```ts + * workspace.onWillCreateFiles(event => { + * // async, will *throw* an error + * setTimeout(() => event.waitUntil(promise)); + * + * // sync, OK + * event.waitUntil(promise); + * }) + * ``` + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + + /** + * Allows to pause the event until the provided thenable resolves. + * + * *Note:* This function can only be called during event dispatch. + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + } + + /** + * An event that is fired after files are deleted. + */ + export interface FileDeleteEvent { + + /** + * The files that got deleted. + */ + readonly files: ReadonlyArray; + } + + /** + * An event that is fired when files are going to be renamed. + * + * To make modifications to the workspace before the files are renamed, + * call the {@link FileWillCreateEvent.waitUntil `waitUntil}-function with a + * thenable that resolves to a {@link WorkspaceEdit workspace edit}. + */ + export interface FileWillRenameEvent { + + /** + * The files that are going to be renamed. + */ + readonly files: ReadonlyArray<{ oldUri: Uri, newUri: Uri }>; + + /** + * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. + * + * *Note:* This function can only be called during event dispatch and not + * in an asynchronous manner: + * + * ```ts + * workspace.onWillCreateFiles(event => { + * // async, will *throw* an error + * setTimeout(() => event.waitUntil(promise)); + * + * // sync, OK + * event.waitUntil(promise); + * }) + * ``` + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + + /** + * Allows to pause the event until the provided thenable resolves. + * + * *Note:* This function can only be called during event dispatch. + * + * @param thenable A thenable that delays saving. + */ + waitUntil(thenable: Thenable): void; + } + + /** + * An event that is fired after files are renamed. + */ + export interface FileRenameEvent { + + /** + * The files that got renamed. + */ + readonly files: ReadonlyArray<{ oldUri: Uri, newUri: Uri }>; + } + + /** + * An event describing a change to the set of {@link workspace.workspaceFolders workspace folders}. + */ + 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 primary workspace folder. + */ + export interface WorkspaceFolder { + + /** + * The associated uri for this workspace folder. + * + * *Note:* The {@link 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 {@link 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 collection of one + * or more folders that are opened in a VS Code window (instance). + * + * It is also possible to open VS Code without a workspace. For example, when you open a + * new VS Code window by selecting a file from your platform's File menu, you will not be + * inside a workspace. In this mode, some of VS Code's capabilities are reduced but you can + * still open text files and edit them. + * + * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on + * the concept of workspaces in VS Code. + * + * The workspace offers support for {@link workspace.createFileSystemWatcher listening} to fs + * events and for {@link workspace.findFiles finding} 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 {@link FileSystem file system} 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 workspace folder that is open in VS Code. `undefined` when no workspace + * has been opened. + * + * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information + * on workspaces in VS Code. + * + * @deprecated Use {@link workspace.workspaceFolders `workspaceFolders`} instead. + */ + export const rootPath: string | undefined; + + /** + * List of workspace folders that are open in VS Code. `undefined when no workspace + * has been opened. + * + * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information + * on workspaces in VS Code. + * + * *Note* that the first entry corresponds to the value of `rootPath`. + */ + export const workspaceFolders: ReadonlyArray | undefined; + + /** + * The name of the workspace. `undefined` when no workspace + * has been opened. + * + * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on + * the concept of workspaces in VS Code. + */ + 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 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); + * ``` + * + * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on + * the concept of workspaces in VS Code. + * + * **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 {@link WorkspaceFolder workspace folder} 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 {@link workspace.workspaceFolders workspace folders} 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 {@link Uri.fsPath 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` {@link workspace.workspaceFolders workspace folders} 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 {@link 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 {@link updateWorkspaceFolders updateWorkspaceFolders()} multiple times + * without waiting for the {@link onDidChangeWorkspaceFolders `onDidChangeWorkspaceFolders()`} to fire. + * + * @param start the zero-based location in the list of currently opened {@link WorkspaceFolder workspace folders} + * 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 {@link workspace.workspaceFolders workspace folders} can be watched. + * *Note* that when watching for file changes such as '**​/*.js', notifications will not be sent when a parent folder is + * moved or deleted (this is a known limitation of the current implementation and may change in the future). + * + * @param globPattern A {@link GlobPattern glob pattern} that is applied to the absolute paths of created, changed, + * and deleted files. Use a {@link RelativePattern relative pattern} to limit events to a certain {@link WorkspaceFolder workspace folder}. + * @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 {@link workspace.workspaceFolders workspace folders} in the workspace. + * + * @example + * findFiles('**​/*.js', '**​/node_modules/**', 10) + * + * @param include A {@link GlobPattern glob pattern} 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 {@link RelativePattern relative pattern} + * to restrict the search results to a {@link WorkspaceFolder workspace folder}. + * @param exclude A {@link GlobPattern glob pattern} 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 + * {@link workspace.workspaceFolders workspace folders} 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 + * {@link WorkspaceEdit workspace edit}. + * + * 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, unless that are interleaved with resource edits. 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: ReadonlyArray; + + /** + * Opens a document. Will return early if this document is already open. Otherwise + * the document is loaded and the {@link workspace.onDidOpenTextDocument didOpen}-event fires. + * + * The document is denoted by an {@link Uri}. Depending on the {@link Uri.scheme 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 contributed {@link TextDocumentContentProvider text document content providers} and + * {@link FileSystemProvider file system providers} are consulted. + * + * *Note* that the lifecycle of the returned document is owned by the editor and not by the extension. That means an + * {@link workspace.onDidCloseTextDocument `onDidClose`}-event can occur at any time after opening it. + * + * @param uri Identifies the resource to open. + * @return A promise that resolves to a {@link TextDocument document}. + */ + export function openTextDocument(uri: Uri): Thenable; + + /** + * A short-hand for `openTextDocument(Uri.file(fileName))`. + * + * @see {@link openTextDocument} + * @param fileName A name of a file on disk. + * @return A promise that resolves to a {@link TextDocument document}. + */ + 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 {@link TextDocument document}. + */ + 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 {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable; + + /** + * An event that is emitted when a {@link TextDocument text document} is opened or when the language id + * of a text document {@link languages.setTextDocumentLanguage has been changed}. + * + * To add an event listener when a visible text document is opened, use the {@link TextEditor} events in the + * {@link window} namespace. Note that: + * + * - The event is emitted before the {@link TextDocument document} is updated in the + * {@link window.activeTextEditor active text editor} + * - When a {@link TextDocument text document} is already open (e.g.: open in another {@link window.visibleTextEditors visible text editor}) this event is not emitted + * + */ + export const onDidOpenTextDocument: Event; + + /** + * An event that is emitted when a {@link TextDocument text document} is disposed or when the language id + * of a text document {@link languages.setTextDocumentLanguage has been changed}. + * + * *Note 1:* There is no guarantee that this event fires when an editor tab is closed, use the + * {@link window.onDidChangeVisibleTextEditors `onDidChangeVisibleTextEditors`}-event to know when editors change. + * + * *Note 2:* A document can be open but not shown in an editor which means this event can fire + * for a document that has not been shown in an editor. + */ + export const onDidCloseTextDocument: Event; + + /** + * An event that is emitted when a {@link TextDocument text document} is changed. This usually happens + * when the {@link TextDocument.getText contents} changes but also when other things like the + * {@link TextDocument.isDirty dirty}-state changes. + */ + export const onDidChangeTextDocument: Event; + + /** + * An event that is emitted when a {@link TextDocument text document} 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 {@link TextDocumentWillSaveEvent.waitUntil delay} 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 {@link TextDocument text document} is saved to disk. + */ + export const onDidSaveTextDocument: Event; + + /** + * An event that is emitted when files are being created. + * + * *Note 1:* This event is triggered by user gestures, like creating a file from the + * explorer, or from the {@link workspace.applyEdit `workspace.applyEdit`}-api. This event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + * + * *Note 2:* When this event is fired, edits to files that are are being created cannot be applied. + */ + export const onWillCreateFiles: Event; + + /** + * An event that is emitted when files have been created. + * + * *Note:* This event is triggered by user gestures, like creating a file from the + * explorer, or from the {@link workspace.applyEdit `workspace.applyEdit`}-api, but this event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + */ + export const onDidCreateFiles: Event; + + /** + * An event that is emitted when files are being deleted. + * + * *Note 1:* This event is triggered by user gestures, like deleting a file from the + * explorer, or from the {@link workspace.applyEdit `workspace.applyEdit`}-api, but this event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + * + * *Note 2:* When deleting a folder with children only one event is fired. + */ + export const onWillDeleteFiles: Event; + + /** + * An event that is emitted when files have been deleted. + * + * *Note 1:* This event is triggered by user gestures, like deleting a file from the + * explorer, or from the {@link workspace.applyEdit `workspace.applyEdit`}-api, but this event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + * + * *Note 2:* When deleting a folder with children only one event is fired. + */ + export const onDidDeleteFiles: Event; + + /** + * An event that is emitted when files are being renamed. + * + * *Note 1:* This event is triggered by user gestures, like renaming a file from the + * explorer, and from the {@link workspace.applyEdit `workspace.applyEdit`}-api, but this event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + * + * *Note 2:* When renaming a folder with children only one event is fired. + */ + export const onWillRenameFiles: Event; + + /** + * An event that is emitted when files have been renamed. + * + * *Note 1:* This event is triggered by user gestures, like renaming a file from the + * explorer, and from the {@link workspace.applyEdit `workspace.applyEdit`}-api, but this event is *not* fired when + * files change on disk, e.g triggered by another application, or when using the + * {@link FileSystem `workspace.fs`}-api. + * + * *Note 2:* When renaming a folder with children only one event is fired. + */ + export const onDidRenameFiles: 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 scope is provided configuration confined to that scope is returned. Scope can be a resource or a language identifier or both. + * + * @param section A dot-separated identifier. + * @param scope A scope for which the configuration is asked for. + * @return The full configuration or a subset. + */ + export function getConfiguration(section?: string | undefined, scope?: ConfigurationScope | null): WorkspaceConfiguration; + + /** + * An event that is emitted when the {@link WorkspaceConfiguration configuration} 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 {@link 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-{@link Uri.scheme scheme} the provider registers for. + * @param provider The filesystem provider. + * @param options Immutable metadata about the provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { readonly isCaseSensitive?: boolean, readonly isReadonly?: boolean }): Disposable; + + /** + * When true, the user has explicitly trusted the contents of the workspace. + */ + export const isTrusted: boolean; + + /** + * Event that fires when the current workspace has been trusted. + */ + export const onDidGrantWorkspaceTrust: Event; + } + + /** + * The configuration scope which can be a + * a 'resource' or a languageId or both or + * a '{@link TextDocument}' or + * a '{@link WorkspaceFolder}' + */ + export type ConfigurationScope = Uri | TextDocument | WorkspaceFolder | { uri?: Uri, languageId: string }; + + /** + * An event describing the change in Configuration + */ + export interface ConfigurationChangeEvent { + + /** + * Checks if the given section has changed. + * If scope is provided, checks if the section has changed for resources under the given scope. + * + * @param section Configuration name, supports _dotted_ names. + * @param scope A scope in which to check. + * @return `true` if the given section has changed. + */ + affectsConfiguration(section: string, scope?: ConfigurationScope): 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 {@link TextDocument} and a {@link 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 {@link DocumentSelector document selector} which is either a language id, like `javascript` or + * a more complex {@link DocumentFilter filter} like `{ language: 'typescript', scheme: 'file' }`. Matching a document against such + * a selector will result in a {@link languages.match score} 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 {@link languages.registerHoverProvider hover}, + * the score is only checked to be `>0`, for other features, like {@link languages.registerCompletionItemProvider IntelliSense} 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 {@link TextDocument.languageId language} that is associated + * with the given document. + * + * *Note* that calling this function will trigger the {@link workspace.onDidCloseTextDocument `onDidCloseTextDocument`} event + * followed by the {@link workspace.onDidOpenTextDocument `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 {@link DocumentSelector selector} and a document. Values + * greater than zero mean the selector matches the document. + * + * A match is computed according to these rules: + * 1. When {@link 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 {@link DocumentFilter `DocumentFilter`}, so `"fooLang"` is like `{ language: "fooLang" }`. + * 3. A {@link 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 {@link 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. + * + * @param resource A resource + * @returns An array of {@link Diagnostic diagnostics} objects or an empty array. + */ + export function getDiagnostics(resource: Uri): Diagnostic[]; + + /** + * Get all diagnostics. + * + * @returns An array of uri-diagnostics tuples or an empty array. + */ + export function getDiagnostics(): [Uri, Diagnostic[]][]; + + /** + * Create a diagnostics collection. + * + * @param name The {@link DiagnosticCollection.name 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 {@link languages.match score} 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. + * + * A completion item provider can be associated with a set of `triggerCharacters`. When trigger + * characters are being typed, completions are requested but only from providers that registered + * the typed character. Because of that trigger characters should be different than {@link LanguageConfiguration.wordPattern word characters}, + * a common trigger character is `.` to trigger member completions. + * + * @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. + * @return A {@link 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 provides. + * @return A {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable; + + /** + * Register a provider that locates evaluatable expressions in text documents. + * VS Code will evaluate the expression in the active debug session and will show the result in the debug hover. + * + * If multiple providers are registered for a language an arbitrary provider will be used. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider An evaluatable expression provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerEvaluatableExpressionProvider(selector: DocumentSelector, provider: EvaluatableExpressionProvider): Disposable; + + /** + * Register a provider that returns data for the debugger's 'inline value' feature. + * Whenever the generic VS Code debugger has stopped in a source file, providers registered for the language of the file + * are called to return textual data that will be shown in the editor at the end of lines. + * + * 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 inline values provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerInlineValuesProvider(selector: DocumentSelector, provider: InlineValuesProvider): Disposable; + + /** + * Register a document highlight provider. + * + * Multiple providers can be registered for a language. In that case providers are sorted + * by their {@link languages.match score} 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link languages.match score} and asked in sequence. The first provider producing a result + * defines the result of the whole operation. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider A rename provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerRenameProvider(selector: DocumentSelector, provider: RenameProvider): Disposable; + + /** + * Register a semantic tokens provider for a whole document. + * + * Multiple providers can be registered for a language. In that case providers are sorted + * by their {@link languages.match score} 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 semantic tokens provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerDocumentSemanticTokensProvider(selector: DocumentSelector, provider: DocumentSemanticTokensProvider, legend: SemanticTokensLegend): Disposable; + + /** + * Register a semantic tokens provider for a document range. + * + * *Note:* If a document has both a `DocumentSemanticTokensProvider` and a `DocumentRangeSemanticTokensProvider`, + * the range provider will be invoked only initially, for the time in which the full document provider takes + * to resolve the first request. Once the full document provider resolves the first request, the semantic tokens + * provided via the range provider will be discarded and from that point forward, only the document provider + * will be used. + * + * Multiple providers can be registered for a language. In that case providers are sorted + * by their {@link languages.match score} 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 semantic tokens provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerDocumentRangeSemanticTokensProvider(selector: DocumentSelector, provider: DocumentRangeSemanticTokensProvider, legend: SemanticTokensLegend): Disposable; + + /** + * Register a formatting provider for a document. + * + * Multiple providers can be registered for a language. In that case providers are sorted + * by their {@link languages.match score} 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 {@link 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 {@link DocumentFormattingEditProvider document formatter} + * which means there is no need to {@link languages.registerDocumentFormattingEditProvider register} 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 {@link languages.match score} 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 {@link 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 {@link languages.match score} 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 {@link 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 {@link languages.match score} 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable; + + /** + * Register a call hierarchy provider. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider A call hierarchy provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerCallHierarchyProvider(selector: DocumentSelector, provider: CallHierarchyProvider): Disposable; + + /** + * Register a linked editing range provider. + * + * Multiple providers can be registered for a language. In that case providers are sorted + * by their {@link languages.match score} and the best-matching provider that has a result 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 linked editing range provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerLinkedEditingRangeProvider(selector: DocumentSelector, provider: LinkedEditingRangeProvider): Disposable; + + /** + * Set a {@link LanguageConfiguration language configuration} for a language. + * + * @param language A language identifier like `typescript`. + * @param configuration Language configuration. + * @return A {@link 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 placeholder in the input box to guide the user. + */ + placeholder: string; + + /** + * Controls whether the input box is visible (default is `true`). + */ + visible: boolean; + } + + interface QuickDiffProvider { + + /** + * Provide a {@link 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 + * {@link SourceControlResourceState source control resource state}. + */ + export interface SourceControlResourceThemableDecorations { + + /** + * The icon path for a specific + * {@link SourceControlResourceState source control resource state}. + */ + readonly iconPath?: string | Uri; + } + + /** + * The decorations for a {@link SourceControlResourceState source control resource state}. + * Can be independently specified for light and dark themes. + */ + export interface SourceControlResourceDecorations extends SourceControlResourceThemableDecorations { + + /** + * Whether the {@link SourceControlResourceState source control resource state} should + * be striked-through in the UI. + */ + readonly strikeThrough?: boolean; + + /** + * Whether the {@link SourceControlResourceState source control resource state} should + * be faded in the UI. + */ + readonly faded?: boolean; + + /** + * The title for a specific + * {@link SourceControlResourceState source control resource state}. + */ + 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 {@link SourceControlResourceGroup source control group}. + */ + export interface SourceControlResourceState { + + /** + * The {@link Uri} of the underlying resource inside the workspace. + */ + readonly resourceUri: Uri; + + /** + * The {@link Command} which should be run when the resource + * state is open in the Source Control viewlet. + */ + readonly command?: Command; + + /** + * The {@link SourceControlResourceDecorations decorations} for this source control + * resource state. + */ + readonly decorations?: SourceControlResourceDecorations; + + /** + * Context value of the resource state. This can be used to contribute resource specific actions. + * For example, if a resource is given a context value as `diffable`. When contributing actions to `scm/resourceState/context` + * using `menus` extension point, you can specify context value for key `scmResourceState` in `when` expressions, like `scmResourceState == diffable`. + * ``` + * "contributes": { + * "menus": { + * "scm/resourceState/context": [ + * { + * "command": "extension.diff", + * "when": "scmResourceState == diffable" + * } + * ] + * } + * } + * ``` + * This will show action `extension.diff` only for resources with `contextValue` is `diffable`. + */ + readonly contextValue?: string; + } + + /** + * A source control resource group is a collection of + * {@link SourceControlResourceState source control resource states}. + */ + 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 {@link SourceControlResourceState source control resource states}. + */ + hideWhenEmpty?: boolean; + + /** + * This group's collection of + * {@link SourceControlResourceState source control resource states}. + */ + resourceStates: SourceControlResourceState[]; + + /** + * Dispose this source control resource group. + */ + dispose(): void; + } + + /** + * An source control is able to provide {@link SourceControlResourceState resource states} + * 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 {@link SourceControlInputBox input box} for this source control. + */ + readonly inputBox: SourceControlInputBox; + + /** + * The UI-visible count of {@link SourceControlResourceState resource states} of + * this source control. + * + * Equals to the total number of {@link SourceControlResourceState resource state} + * of this source control, if undefined. + */ + count?: number; + + /** + * An optional {@link QuickDiffProvider quick diff provider}. + */ + 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 {@link SourceControlResourceGroup resource group}. + */ + createResourceGroup(id: string, label: string): SourceControlResourceGroup; + + /** + * Dispose this source control. + */ + dispose(): void; + } + + export namespace scm { + + /** + * The {@link SourceControlInputBox input box} for the last source control + * created by the extension. + * + * @deprecated Use SourceControl.inputBox instead + */ + export const inputBox: SourceControlInputBox; + + /** + * Creates a new {@link SourceControl source control} 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 {@link SourceControl source control}. + */ + export function createSourceControl(id: string, label: string, rootUri?: Uri): SourceControl; + } + + /** + * A DebugProtocolMessage is an opaque stand-in type for the [ProtocolMessage](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage) type defined in the Debug Adapter Protocol. + */ + export interface DebugProtocolMessage { + // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage). + } + + /** + * A DebugProtocolSource is an opaque stand-in type for the [Source](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source) type defined in the Debug Adapter Protocol. + */ + export interface DebugProtocolSource { + // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source). + } + + /** + * A DebugProtocolBreakpoint is an opaque stand-in type for the [Breakpoint](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint) type defined in the Debug Adapter Protocol. + */ + export interface DebugProtocolBreakpoint { + // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint). + } + + /** + * 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 {@link DebugConfiguration debug configuration}. + */ + readonly type: string; + + /** + * The debug session's name is initially taken from the {@link DebugConfiguration debug configuration}. + * Any changes will be properly reflected in the UI. + */ + name: string; + + /** + * The workspace folder of this session or `undefined` for a folderless setup. + */ + readonly workspaceFolder: WorkspaceFolder | undefined; + + /** + * The "resolved" {@link DebugConfiguration debug configuration} 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; + + /** + * Maps a VS Code breakpoint to the corresponding Debug Adapter Protocol (DAP) breakpoint that is managed by the debug adapter of the debug session. + * If no DAP breakpoint exists (either because the VS Code breakpoint was not yet registered or because the debug adapter is not interested in the breakpoint), the value `undefined` is returned. + * + * @param breakpoint A VS Code {@link Breakpoint}. + * @return A promise that resolves to the Debug Adapter Protocol breakpoint or `undefined`. + */ + getDebugProtocolBreakpoint(breakpoint: Breakpoint): Thenable; + } + + /** + * A custom Debug Adapter Protocol event received from a {@link DebugSession debug session}. + */ + export interface DebugSessionCustomEvent { + /** + * The {@link DebugSession debug session} 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 debug configurations to the debug service + * and to resolve launch configurations before they are used to start a debug session. + * A debug configuration provider is registered via {@link debug.registerDebugConfigurationProvider}. + */ + export interface DebugConfigurationProvider { + /** + * Provides {@link DebugConfiguration debug configuration} to the debug service. 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 {@link DebugConfiguration debug configurations}. + */ + provideDebugConfigurations?(folder: WorkspaceFolder | undefined, token?: CancellationToken): ProviderResult; + + /** + * Resolves a {@link DebugConfiguration debug configuration} 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 {@link DebugConfiguration debug configuration} 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; + + /** + * This hook is directly called after 'resolveDebugConfiguration' but with all variables substituted. + * It can be used to resolve or verify a {@link DebugConfiguration debug configuration} 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 'resolveDebugConfigurationWithSubstitutedVariables' 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 {@link DebugConfiguration debug configuration} to resolve. + * @param token A cancellation token. + * @return The resolved debug configuration or undefined or null. + */ + resolveDebugConfigurationWithSubstitutedVariables?(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); + } + + /** + * Represents a debug adapter running as a Named Pipe (on Windows)/UNIX Domain Socket (on non-Windows) based server. + */ + export class DebugAdapterNamedPipeServer { + /** + * The path to the NamedPipe/UNIX Domain Socket. + */ + readonly path: string; + + /** + * Create a description for a debug adapter running as a Named Pipe (on Windows)/UNIX Domain Socket (on non-Windows) based server. + */ + constructor(path: string); + } + + /** + * A debug adapter that implements the Debug Adapter Protocol can be registered with VS Code if it implements the DebugAdapter interface. + */ + export interface DebugAdapter extends Disposable { + + /** + * An event which fires after the debug adapter has sent a Debug Adapter Protocol message to VS Code. + * Messages can be requests, responses, or events. + */ + readonly onDidSendMessage: Event; + + /** + * Handle a Debug Adapter Protocol message. + * Messages can be requests, responses, or events. + * Results or errors are returned via onSendMessage events. + * @param message A Debug Adapter Protocol message + */ + handleMessage(message: DebugProtocolMessage): void; + } + + /** + * A debug adapter descriptor for an inline implementation. + */ + export class DebugAdapterInlineImplementation { + + /** + * Create a descriptor for an inline implementation of a debug adapter. + */ + constructor(implementation: DebugAdapter); + } + + export type DebugAdapterDescriptor = DebugAdapterExecutable | DebugAdapterServer | DebugAdapterNamedPipeServer | DebugAdapterInlineImplementation; + + 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 {@link DebugAdapterDescriptor}. + * Currently two types of debug adapters are supported: + * - a debug adapter executable is specified as a command path and arguments (see {@link DebugAdapterExecutable}), + * - a debug adapter server reachable via a communication port (see {@link 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 {@link DebugSession debug session} 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 {@link DebugAdapterDescriptor debug adapter descriptor} 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 {@link DebugSession debug session} for which the debug adapter tracker will be used. + * @return A {@link DebugAdapterTracker debug adapter tracker} 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 {@link Breakpoint breakpoints}. + */ + 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); + } + + /** + * Debug console mode used by debug session, see {@link DebugSessionOptions options}. + */ + export enum DebugConsoleMode { + /** + * Debug session should have a separate debug console. + */ + Separate = 0, + + /** + * Debug session should share debug console with its parent session. + * This value has no effect for sessions which do not have a parent session. + */ + MergeWithParent = 1 + } + + /** + * Options for {@link debug.startDebugging starting a debug session}. + */ + export interface DebugSessionOptions { + + /** + * When specified the newly created debug session is registered as a "child" session of this + * "parent" debug session. + */ + parentSession?: DebugSession; + + /** + * Controls whether this session should have a separate debug console or share it + * with the parent session. Has no effect for sessions which do not have a parent session. + * Defaults to Separate. + */ + consoleMode?: DebugConsoleMode; + + /** + * Controls whether this session should run without debugging, thus ignoring breakpoints. + * When this property is not specified, the value from the parent session (if there is one) is used. + */ + noDebug?: boolean; + + /** + * Controls if the debug session's parent session is shown in the CALL STACK view even if it has only a single child. + * By default, the debug session will never hide its parent. + * If compact is true, debug sessions with a single child are hidden in the CALL STACK view to make the tree more compact. + */ + compact?: boolean; + } + + /** + * A DebugConfigurationProviderTriggerKind specifies when the `provideDebugConfigurations` method of a `DebugConfigurationProvider` is triggered. + * Currently there are two situations: to provide the initial debug configurations for a newly created launch.json or + * to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). + * A trigger kind is used when registering a `DebugConfigurationProvider` with {@link debug.registerDebugConfigurationProvider}. + */ + export enum DebugConfigurationProviderTriggerKind { + /** + * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide the initial debug configurations for a newly created launch.json. + */ + Initial = 1, + /** + * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). + */ + Dynamic = 2 + } + + /** + * Namespace for debug functionality. + */ + export namespace debug { + + /** + * The currently active {@link DebugSession debug session} 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 {@link DebugConsole debug console}. + * 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 {@link Event} which fires when the {@link debug.activeDebugSession active debug session} + * has changed. *Note* that the event also fires when the active debug session changes + * to `undefined`. + */ + export const onDidChangeActiveDebugSession: Event; + + /** + * An {@link Event} which fires when a new {@link DebugSession debug session} has been started. + */ + export const onDidStartDebugSession: Event; + + /** + * An {@link Event} which fires when a custom DAP event is received from the {@link DebugSession debug session}. + */ + export const onDidReceiveDebugSessionCustomEvent: Event; + + /** + * An {@link Event} which fires when a {@link DebugSession debug session} has terminated. + */ + export const onDidTerminateDebugSession: Event; + + /** + * An {@link Event} that is emitted when the set of breakpoints is added, removed, or changed. + */ + export const onDidChangeBreakpoints: Event; + + /** + * Register a {@link DebugConfigurationProvider debug configuration provider} for a specific debug type. + * The optional {@link DebugConfigurationProviderTriggerKind triggerKind} can be used to specify when the `provideDebugConfigurations` method of the provider is triggered. + * Currently two trigger kinds are possible: with the value `Initial` (or if no trigger kind argument is given) the `provideDebugConfigurations` method is used to provide the initial debug configurations to be copied into a newly created launch.json. + * With the trigger kind `Dynamic` the `provideDebugConfigurations` method is used to dynamically determine debug configurations to be presented to the user (in addition to the static configurations from the launch.json). + * Please note that the `triggerKind` argument only applies to the `provideDebugConfigurations` method: so the `resolveDebugConfiguration` methods are not affected at all. + * Registering a single provider with resolve methods for different trigger kinds, results in the same resolve methods called multiple times. + * 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 {@link DebugConfigurationProvider debug configuration provider} to register. + * @param triggerKind The {@link DebugConfigurationProviderTrigger trigger} for which the 'provideDebugConfiguration' method of the provider is registered. If `triggerKind` is missing, the value `DebugConfigurationProviderTriggerKind.Initial` is assumed. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerDebugConfigurationProvider(debugType: string, provider: DebugConfigurationProvider, triggerKind?: DebugConfigurationProviderTriggerKind): Disposable; + + /** + * Register a {@link DebugAdapterDescriptorFactory debug adapter descriptor factory} 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 {@link DebugAdapterDescriptorFactory debug adapter descriptor factory} to register. + * @return A {@link 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 {@link DebugAdapterTrackerFactory debug adapter tracker factory} to register. + * @return A {@link 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 {@link 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 {@link WorkspaceFolder workspace folder} 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 {@link DebugConfiguration} object. + * @param parentSessionOrOptions Debug session options. When passed a parent {@link DebugSession debug session}, assumes options with just this parent session. + * @return A thenable that resolves when debugging could be successfully started. + */ + export function startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, parentSessionOrOptions?: DebugSession | DebugSessionOptions): Thenable; + + /** + * Stop the given debug session or stop all debug sessions if session is omitted. + * @param session The {@link DebugSession debug session} to stop; if omitted all sessions are stopped. + */ + export function stopDebugging(session?: 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; + + /** + * Converts a "Source" descriptor object received via the Debug Adapter Protocol into a Uri that can be used to load its contents. + * If the source descriptor is based on a path, a file Uri is returned. + * If the source descriptor uses a reference number, a specific debug Uri (scheme 'debug') is constructed that requires a corresponding VS Code ContentProvider and a running debug session + * + * If the "Source" descriptor has insufficient information for creating the Uri, an error is thrown. + * + * @param source An object conforming to the [Source](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source) type defined in the Debug Adapter Protocol. + * @param session An optional debug session that will be used when the source descriptor uses a reference number to load the contents from an active debug session. + * @return A uri that can be used to load the contents of the source. + */ + export function asDebugSourceUri(source: DebugProtocolSource, session?: DebugSession): Uri; + } + + /** + * Namespace for dealing with installed extensions. Extensions are represented + * by an {@link 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 `extensionDependencies`-entry + * to `package.json`, and use the {@link extensions.getExtension getExtension}-function + * and the {@link Extension.exports 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 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; + + /** + * 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; + } + + /** + * Collapsible state of a {@link CommentThread comment thread} + */ + export enum CommentThreadCollapsibleState { + /** + * Determines an item is collapsed + */ + Collapsed = 0, + + /** + * Determines an item is expanded + */ + Expanded = 1 + } + + /** + * Comment mode of a {@link Comment} + */ + export enum CommentMode { + /** + * Displays the comment editor + */ + Editing = 0, + + /** + * Displays the preview of the comment + */ + Preview = 1 + } + + /** + * A collection of {@link Comment comments} 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; + + /** + * Whether the thread supports reply. + * Defaults to true. + */ + canReply: boolean; + + /** + * 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 {@link CommentThread Comment Thread} + */ + label?: string; + + /** + * Dispose this comment thread. + * + * Once disposed, this comment thread will be removed from visible editors and Comment Panel when appropriate. + */ + dispose(): void; + } + + /** + * Author information of a {@link 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 {@link 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; + + /** + * {@link CommentMode Comment mode} of the comment + */ + mode: CommentMode; + + /** + * The {@link CommentAuthorInformation author information} 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 {@link Comment} + */ + reactions?: CommentReaction[]; + + /** + * Optional label describing the {@link 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 {@link CommentThread comment thread} + */ + thread: CommentThread; + + /** + * The value in the comment editor + */ + text: string; + } + + /** + * Commenting range provider for a {@link CommentController comment controller}. + */ + 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; + } + + /** + * Represents a {@link CommentController comment controller}'s {@link CommentController.options options}. + */ + export interface CommentOptions { + /** + * An optional string to show on the comment input box when it's collapsed. + */ + prompt?: string; + + /** + * An optional string to show as placeholder in the comment input box when it's focused. + */ + placeHolder?: string; + } + + /** + * A comment controller is able to provide {@link CommentThread comments} 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; + + /** + * Comment controller options + */ + options?: CommentOptions; + + /** + * Optional commenting range provider. Provide a list {@link Range ranges} 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 {@link CommentThread comment thread}. 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 {@link Comment}. + */ + reactionHandler?: (comment: Comment, reaction: CommentReaction) => Thenable; + + /** + * Dispose this comment controller. + * + * Once disposed, all {@link CommentThread comment threads} created by this comment controller will also be removed from the editor + * and Comments Panel. + */ + dispose(): void; + } + + namespace comments { + /** + * Creates a new {@link CommentController comment controller} instance. + * + * @param id An `id` for the comment controller. + * @param label A human-readable string for the comment controller. + * @return An instance of {@link CommentController comment controller}. + */ + export function createCommentController(id: string, label: string): CommentController; + } + + //#endregion + + /** + * Represents a session of a currently logged in user. + */ + export interface AuthenticationSession { + /** + * The identifier of the authentication session. + */ + readonly id: string; + + /** + * The access token. + */ + readonly accessToken: string; + + /** + * The account associated with the session. + */ + readonly account: AuthenticationSessionAccountInformation; + + /** + * The permissions granted by the session's access token. Available scopes + * are defined by the {@link AuthenticationProvider}. + */ + readonly scopes: ReadonlyArray; + } + + /** + * The information of an account associated with an {@link AuthenticationSession}. + */ + export interface AuthenticationSessionAccountInformation { + /** + * The unique identifier of the account. + */ + readonly id: string; + + /** + * The human-readable name of the account. + */ + readonly label: string; + } + + + /** + * Options to be used when getting an {@link AuthenticationSession} from an {@link AuthenticationProvider}. + */ + export interface AuthenticationGetSessionOptions { + /** + * Whether login should be performed if there is no matching session. + * + * If true, a modal dialog will be shown asking the user to sign in. If false, a numbered badge will be shown + * on the accounts activity bar icon. An entry for the extension will be added under the menu to sign in. This + * allows quietly prompting the user to sign in. + * + * If there is a matching session but the extension has not been granted access to it, setting this to true + * will also result in an immediate modal dialog, and false will add a numbered badge to the accounts icon. + * + * Defaults to false. + */ + createIfNone?: boolean; + + /** + * Whether the existing user session preference should be cleared. + * + * For authentication providers that support being signed into multiple accounts at once, the user will be + * prompted to select an account to use when {@link authentication.getSession getSession} is called. This preference + * is remembered until {@link authentication.getSession getSession} is called with this flag. + * + * Defaults to false. + */ + clearSessionPreference?: boolean; + } + + /** + * Basic information about an {@link AuthenticationProvider} + */ + export interface AuthenticationProviderInformation { + /** + * The unique identifier of the authentication provider. + */ + readonly id: string; + + /** + * The human-readable name of the authentication provider. + */ + readonly label: string; + } + + /** + * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. + */ + export interface AuthenticationSessionsChangeEvent { + /** + * The {@link AuthenticationProvider} that has had its sessions change. + */ + readonly provider: AuthenticationProviderInformation; + } + + /** + * Options for creating an {@link AuthenticationProvider}. + */ + export interface AuthenticationProviderOptions { + /** + * Whether it is possible to be signed into multiple accounts at once with this provider. + * If not specified, will default to false. + */ + readonly supportsMultipleAccounts?: boolean; + } + + /** + * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. + */ + export interface AuthenticationProviderAuthenticationSessionsChangeEvent { + /** + * The {@link AuthenticationSession}s of the {@link AuthentiationProvider AuthenticationProvider} that have been added. + */ + readonly added?: ReadonlyArray; + + /** + * The {@link AuthenticationSession}s of the {@link AuthentiationProvider AuthenticationProvider} that have been removed. + */ + readonly removed?: ReadonlyArray; + + /** + * The {@link AuthenticationSession}s of the {@link AuthentiationProvider AuthenticationProvider} that have been changed. + * A session changes when its data excluding the id are updated. An example of this is a session refresh that results in a new + * access token being set for the session. + */ + readonly changed?: ReadonlyArray; + } + + /** + * A provider for performing authentication to a service. + */ + export interface AuthenticationProvider { + /** + * An {@link Event} which fires when the array of sessions has changed, or data + * within a session has changed. + */ + readonly onDidChangeSessions: Event; + + /** + * Get a list of sessions. + * @param scopes An optional list of scopes. If provided, the sessions returned should match + * these permissions, otherwise all sessions should be returned. + * @returns A promise that resolves to an array of authentication sessions. + */ + getSessions(scopes?: string[]): Thenable>; + + /** + * Prompts a user to login. + * + * If login is successful, the onDidChangeSessions event should be fired. + * + * If login fails, a rejected promise should be returned. + * + * If the provider has specified that it does not support multiple accounts, + * then this should never be called if there is already an existing session matching these + * scopes. + * @param scopes A list of scopes, permissions, that the new session should be created with. + * @returns A promise that resolves to an authentication session. + */ + createSession(scopes: string[]): Thenable; + + /** + * Removes the session corresponding to session id. + * + * If the removal is successful, the onDidChangeSessions event should be fired. + * + * If a session cannot be removed, the provider should reject with an error message. + * @param sessionId The id of the session to remove. + */ + removeSession(sessionId: string): Thenable; + } + + + /** + * Namespace for authentication. + */ + export namespace authentication { + /** + * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not + * registered, or if the user does not consent to sharing authentication information with + * the extension. If there are multiple sessions with the same scopes, the user will be shown a + * quickpick to select which account they would like to use. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to VS Code that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @param options The {@link GetSessionOptions} to use + * @returns A thenable that resolves to an authentication session + */ + export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions & { createIfNone: true }): Thenable; + + /** + * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not + * registered, or if the user does not consent to sharing authentication information with + * the extension. If there are multiple sessions with the same scopes, the user will be shown a + * quickpick to select which account they would like to use. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to VS Code that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @param options The {@link GetSessionOptions} to use + * @returns A thenable that resolves to an authentication session if available, or undefined if there are no sessions + */ + export function getSession(providerId: string, scopes: string[], options?: AuthenticationGetSessionOptions): Thenable; + + /** + * An {@link Event} which fires when the authentication sessions of an authentication provider have + * been added, removed, or changed. + */ + export const onDidChangeSessions: Event; + + /** + * Register an authentication provider. + * + * There can only be one provider per id and an error is being thrown when an id + * has already been used by another provider. Ids are case-sensitive. + * + * @param id The unique identifier of the provider. + * @param label The human-readable name of the provider. + * @param provider The authentication provider provider. + * @params options Additional options for the provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerAuthenticationProvider(id: string, label: string, provider: AuthenticationProvider, options?: AuthenticationProviderOptions): Disposable; + } +} + +/** + * 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, onrejected?: (reason: any) => TResult | Thenable): Thenable; + then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable; +} diff --git a/vscode.proposed.d.ts b/vscode.proposed.d.ts new file mode 100644 index 0000000..2bb3498 --- /dev/null +++ b/vscode.proposed.d.ts @@ -0,0 +1,3128 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * This is the place for API experiments and proposals. + * These API are NOT stable and subject to change. They are only available in the Insiders + * distribution and CANNOT be used in published extensions. + * + * To test these API in local environment: + * - Use Insiders release of VS Code. + * - Add `"enableProposedApi": true` to your package.json. + * - Copy this file to your project. + */ + +declare module 'vscode' { + + //#region auth provider: https://github.com/microsoft/vscode/issues/88309 + + /** + * An {@link Event} which fires when an {@link AuthenticationProvider} is added or removed. + */ + export interface AuthenticationProvidersChangeEvent { + /** + * The ids of the {@link AuthenticationProvider}s that have been added. + */ + readonly added: ReadonlyArray; + + /** + * The ids of the {@link AuthenticationProvider}s that have been removed. + */ + readonly removed: ReadonlyArray; + } + + export namespace authentication { + /** + * @deprecated - getSession should now trigger extension activation. + * Fires with the provider id that was registered or unregistered. + */ + export const onDidChangeAuthenticationProviders: Event; + + /** + * @deprecated + * An array of the information of authentication providers that are currently registered. + */ + export const providers: ReadonlyArray; + + /** + * @deprecated + * Logout of a specific session. + * @param providerId The id of the provider to use + * @param sessionId The session id to remove + * provider + */ + export function logout(providerId: string, sessionId: string): Thenable; + } + + //#endregion + + // eslint-disable-next-line vscode-dts-region-comments + //#region @alexdima - resolvers + + export interface MessageOptions { + /** + * Do not render a native message box. + */ + useCustom?: boolean; + } + + export interface RemoteAuthorityResolverContext { + resolveAttempt: number; + } + + export class ResolvedAuthority { + readonly host: string; + readonly port: number; + readonly connectionToken: string | undefined; + + constructor(host: string, port: number, connectionToken?: string); + } + + export enum RemoteTrustOption { + Unknown = 0, + DisableTrust = 1, + MachineTrusted = 2 + } + + export interface ResolvedOptions { + extensionHostEnv?: { [key: string]: string | null; }; + + trust?: RemoteTrustOption; + } + + export interface TunnelOptions { + remoteAddress: { port: number, host: string; }; + // The desired local port. If this port can't be used, then another will be chosen. + localAddressPort?: number; + label?: string; + public?: boolean; + } + + export interface TunnelDescription { + remoteAddress: { port: number, host: string; }; + //The complete local address(ex. localhost:1234) + localAddress: { port: number, host: string; } | string; + public?: boolean; + } + + export interface Tunnel extends TunnelDescription { + // Implementers of Tunnel should fire onDidDispose when dispose is called. + onDidDispose: Event; + dispose(): void | Thenable; + } + + /** + * Used as part of the ResolverResult if the extension has any candidate, + * published, or forwarded ports. + */ + export interface TunnelInformation { + /** + * Tunnels that are detected by the extension. The remotePort is used for display purposes. + * The localAddress should be the complete local address (ex. localhost:1234) for connecting to the port. Tunnels provided through + * detected are read-only from the forwarded ports UI. + */ + environmentTunnels?: TunnelDescription[]; + + } + + export interface TunnelCreationOptions { + /** + * True when the local operating system will require elevation to use the requested local port. + */ + elevationRequired?: boolean; + } + + export enum CandidatePortSource { + None = 0, + Process = 1, + Output = 2 + } + + export type ResolverResult = ResolvedAuthority & ResolvedOptions & TunnelInformation; + + export class RemoteAuthorityResolverError extends Error { + static NotAvailable(message?: string, handled?: boolean): RemoteAuthorityResolverError; + static TemporarilyNotAvailable(message?: string): RemoteAuthorityResolverError; + + constructor(message?: string); + } + + export interface RemoteAuthorityResolver { + resolve(authority: string, context: RemoteAuthorityResolverContext): ResolverResult | Thenable; + /** + * Can be optionally implemented if the extension can forward ports better than the core. + * When not implemented, the core will use its default forwarding logic. + * When implemented, the core will use this to forward ports. + * + * To enable the "Change Local Port" action on forwarded ports, make sure to set the `localAddress` of + * the returned `Tunnel` to a `{ port: number, host: string; }` and not a string. + */ + tunnelFactory?: (tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions) => Thenable | undefined; + + /**p + * Provides filtering for candidate ports. + */ + showCandidatePort?: (host: string, port: number, detail: string) => Thenable; + + /** + * Lets the resolver declare which tunnel factory features it supports. + * UNDER DISCUSSION! MAY CHANGE SOON. + */ + tunnelFeatures?: { + elevation: boolean; + public: boolean; + }; + + candidatePortSource?: CandidatePortSource; + } + + export namespace workspace { + /** + * Forwards a port. If the current resolver implements RemoteAuthorityResolver:forwardPort then that will be used to make the tunnel. + * By default, openTunnel only support localhost; however, RemoteAuthorityResolver:tunnelFactory can be used to support other ips. + * + * @throws When run in an environment without a remote. + * + * @param tunnelOptions The `localPort` is a suggestion only. If that port is not available another will be chosen. + */ + export function openTunnel(tunnelOptions: TunnelOptions): Thenable; + + /** + * Gets an array of the currently available tunnels. This does not include environment tunnels, only tunnels that have been created by the user. + * Note that these are of type TunnelDescription and cannot be disposed. + */ + export let tunnels: Thenable; + + /** + * Fired when the list of tunnels has changed. + */ + export const onDidChangeTunnels: Event; + } + + export interface ResourceLabelFormatter { + scheme: string; + authority?: string; + formatting: ResourceLabelFormatting; + } + + export interface ResourceLabelFormatting { + label: string; // myLabel:/${path} + // For historic reasons we use an or string here. Once we finalize this API we should start using enums instead and adopt it in extensions. + // eslint-disable-next-line vscode-dts-literal-or-types + separator: '/' | '\\' | ''; + tildify?: boolean; + normalizeDriveLetter?: boolean; + workspaceSuffix?: string; + authorityPrefix?: string; + stripPathStartingSeparator?: boolean; + } + + export namespace workspace { + export function registerRemoteAuthorityResolver(authorityPrefix: string, resolver: RemoteAuthorityResolver): Disposable; + export function registerResourceLabelFormatter(formatter: ResourceLabelFormatter): Disposable; + } + + //#endregion + + //#region editor insets: https://github.com/microsoft/vscode/issues/85682 + + export interface WebviewEditorInset { + readonly editor: TextEditor; + readonly line: number; + readonly height: number; + readonly webview: Webview; + readonly onDidDispose: Event; + dispose(): void; + } + + export namespace window { + export function createWebviewTextEditorInset(editor: TextEditor, line: number, height: number, options?: WebviewOptions): WebviewEditorInset; + } + + //#endregion + + //#region read/write in chunks: https://github.com/microsoft/vscode/issues/84515 + + export interface FileSystemProvider { + open?(resource: Uri, options: { create: boolean; }): number | Thenable; + close?(fd: number): void | Thenable; + read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): number | Thenable; + write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): number | Thenable; + } + + //#endregion + + //#region TextSearchProvider: https://github.com/microsoft/vscode/issues/59921 + + /** + * The parameters of a query for text search. + */ + export interface TextSearchQuery { + /** + * The text pattern to search for. + */ + pattern: string; + + /** + * Whether or not `pattern` should match multiple lines of text. + */ + isMultiline?: boolean; + + /** + * Whether or not `pattern` should be interpreted as a regular expression. + */ + isRegExp?: boolean; + + /** + * Whether or not the search should be case-sensitive. + */ + isCaseSensitive?: boolean; + + /** + * Whether or not to search for whole word matches only. + */ + isWordMatch?: boolean; + } + + /** + * A file glob pattern to match file paths against. + * TODO@roblourens merge this with the GlobPattern docs/definition in vscode.d.ts. + * @see {@link GlobPattern} + */ + export type GlobString = string; + + /** + * Options common to file and text search + */ + export interface SearchOptions { + /** + * The root folder to search within. + */ + folder: Uri; + + /** + * Files that match an `includes` glob pattern should be included in the search. + */ + includes: GlobString[]; + + /** + * Files that match an `excludes` glob pattern should be excluded from the search. + */ + excludes: GlobString[]; + + /** + * Whether external files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useIgnoreFiles"`. + */ + useIgnoreFiles: boolean; + + /** + * Whether symlinks should be followed while searching. + * See the vscode setting `"search.followSymlinks"`. + */ + followSymlinks: boolean; + + /** + * Whether global files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useGlobalIgnoreFiles"`. + */ + useGlobalIgnoreFiles: boolean; + } + + /** + * Options to specify the size of the result text preview. + * These options don't affect the size of the match itself, just the amount of preview text. + */ + export interface TextSearchPreviewOptions { + /** + * The maximum number of lines in the preview. + * Only search providers that support multiline search will ever return more than one line in the match. + */ + matchLines: number; + + /** + * The maximum number of characters included per line. + */ + charsPerLine: number; + } + + /** + * Options that apply to text search. + */ + export interface TextSearchOptions extends SearchOptions { + /** + * The maximum number of results to be returned. + */ + maxResults: number; + + /** + * Options to specify the size of the result text preview. + */ + previewOptions?: TextSearchPreviewOptions; + + /** + * Exclude files larger than `maxFileSize` in bytes. + */ + maxFileSize?: number; + + /** + * Interpret files using this encoding. + * See the vscode setting `"files.encoding"` + */ + encoding?: string; + + /** + * Number of lines of context to include before each match. + */ + beforeContext?: number; + + /** + * Number of lines of context to include after each match. + */ + afterContext?: number; + } + + /** + * Represents the severiry of a TextSearchComplete message. + */ + export enum TextSearchCompleteMessageType { + Information = 1, + Warning = 2, + } + + /** + * Information collected when text search is complete. + */ + export interface TextSearchComplete { + /** + * Whether the search hit the limit on the maximum number of search results. + * `maxResults` on {@link TextSearchOptions `TextSearchOptions`} specifies the max number of results. + * - If exactly that number of matches exist, this should be false. + * - If `maxResults` matches are returned and more exist, this should be true. + * - If search hits an internal limit which is less than `maxResults`, this should be true. + */ + limitHit?: boolean; + + /** + * Additional information regarding the state of the completed search. + * + * Messages with "Information" tyle support links in markdown syntax: + * - Click to [run a command](command:workbench.action.OpenQuickPick) + * - Click to [open a website](https://aka.ms) + */ + message?: { text: string, type: TextSearchCompleteMessageType } | { text: string, type: TextSearchCompleteMessageType }[]; + } + + /** + * A preview of the text result. + */ + export interface TextSearchMatchPreview { + /** + * The matching lines of text, or a portion of the matching line that contains the match. + */ + text: string; + + /** + * The Range within `text` corresponding to the text of the match. + * The number of matches must match the TextSearchMatch's range property. + */ + matches: Range | Range[]; + } + + /** + * A match from a text search + */ + export interface TextSearchMatch { + /** + * The uri for the matching document. + */ + uri: Uri; + + /** + * The range of the match within the document, or multiple ranges for multiple matches. + */ + ranges: Range | Range[]; + + /** + * A preview of the text match. + */ + preview: TextSearchMatchPreview; + } + + /** + * A line of context surrounding a TextSearchMatch. + */ + export interface TextSearchContext { + /** + * The uri for the matching document. + */ + uri: Uri; + + /** + * One line of text. + * previewOptions.charsPerLine applies to this + */ + text: string; + + /** + * The line number of this line of context. + */ + lineNumber: number; + } + + export type TextSearchResult = TextSearchMatch | TextSearchContext; + + /** + * A TextSearchProvider provides search results for text results inside files in the workspace. + */ + export interface TextSearchProvider { + /** + * Provide results that match the given text pattern. + * @param query The parameters for this query. + * @param options A set of options to consider while searching. + * @param progress A progress callback that must be invoked for all results. + * @param token A cancellation token. + */ + provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): ProviderResult; + } + + //#endregion + + //#region FileSearchProvider: https://github.com/microsoft/vscode/issues/73524 + + /** + * The parameters of a query for file search. + */ + export interface FileSearchQuery { + /** + * The search pattern to match against file paths. + */ + pattern: string; + } + + /** + * Options that apply to file search. + */ + export interface FileSearchOptions extends SearchOptions { + /** + * The maximum number of results to be returned. + */ + maxResults?: number; + + /** + * A CancellationToken that represents the session for this search query. If the provider chooses to, this object can be used as the key for a cache, + * and searches with the same session object can search the same cache. When the token is cancelled, the session is complete and the cache can be cleared. + */ + session?: CancellationToken; + } + + /** + * A FileSearchProvider provides search results for files in the given folder that match a query string. It can be invoked by quickopen or other extensions. + * + * A FileSearchProvider is the more powerful of two ways to implement file search in VS Code. Use a FileSearchProvider if you wish to search within a folder for + * all files that match the user's query. + * + * The FileSearchProvider will be invoked on every keypress in quickopen. When `workspace.findFiles` is called, it will be invoked with an empty query string, + * and in that case, every file in the folder should be returned. + */ + export interface FileSearchProvider { + /** + * Provide the set of files that match a certain file path pattern. + * @param query The parameters for this query. + * @param options A set of options to consider while searching files. + * @param token A cancellation token. + */ + provideFileSearchResults(query: FileSearchQuery, options: FileSearchOptions, token: CancellationToken): ProviderResult; + } + + export namespace workspace { + /** + * Register a search provider. + * + * Only one provider can be registered per scheme. + * + * @param scheme The provider will be invoked for workspace folders that have this file scheme. + * @param provider The provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerFileSearchProvider(scheme: string, provider: FileSearchProvider): Disposable; + + /** + * Register a text search provider. + * + * Only one provider can be registered per scheme. + * + * @param scheme The provider will be invoked for workspace folders that have this file scheme. + * @param provider The provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerTextSearchProvider(scheme: string, provider: TextSearchProvider): Disposable; + } + + //#endregion + + //#region findTextInFiles: https://github.com/microsoft/vscode/issues/59924 + + /** + * Options that can be set on a findTextInFiles search. + */ + export interface FindTextInFilesOptions { + /** + * A {@link GlobPattern glob pattern} that defines the files to search for. The glob pattern + * will be matched against the file paths of files relative to their workspace. Use a {@link RelativePattern relative pattern} + * to restrict the search results to a {@link WorkspaceFolder workspace folder}. + */ + include?: GlobPattern; + + /** + * A {@link GlobPattern glob pattern} 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`, default excludes will + * apply. + */ + exclude?: GlobPattern; + + /** + * Whether to use the default and user-configured excludes. Defaults to true. + */ + useDefaultExcludes?: boolean; + + /** + * The maximum number of results to search for + */ + maxResults?: number; + + /** + * Whether external files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useIgnoreFiles"`. + */ + useIgnoreFiles?: boolean; + + /** + * Whether global files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useGlobalIgnoreFiles"`. + */ + useGlobalIgnoreFiles?: boolean; + + /** + * Whether symlinks should be followed while searching. + * See the vscode setting `"search.followSymlinks"`. + */ + followSymlinks?: boolean; + + /** + * Interpret files using this encoding. + * See the vscode setting `"files.encoding"` + */ + encoding?: string; + + /** + * Options to specify the size of the result text preview. + */ + previewOptions?: TextSearchPreviewOptions; + + /** + * Number of lines of context to include before each match. + */ + beforeContext?: number; + + /** + * Number of lines of context to include after each match. + */ + afterContext?: number; + } + + export namespace workspace { + /** + * Search text in files across all {@link workspace.workspaceFolders workspace folders} in the workspace. + * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. + * @param callback A callback, called for each result + * @param token A token that can be used to signal cancellation to the underlying search engine. + * @return A thenable that resolves when the search is complete. + */ + export function findTextInFiles(query: TextSearchQuery, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; + + /** + * Search text in files across all {@link workspace.workspaceFolders workspace folders} in the workspace. + * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. + * @param options An optional set of query options. Include and exclude patterns, maxResults, etc. + * @param callback A callback, called for each result + * @param token A token that can be used to signal cancellation to the underlying search engine. + * @return A thenable that resolves when the search is complete. + */ + export function findTextInFiles(query: TextSearchQuery, options: FindTextInFilesOptions, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; + } + + //#endregion + + //#region diff command: https://github.com/microsoft/vscode/issues/84899 + + /** + * The contiguous set of modified lines in a diff. + */ + export interface LineChange { + readonly originalStartLineNumber: number; + readonly originalEndLineNumber: number; + readonly modifiedStartLineNumber: number; + readonly modifiedEndLineNumber: number; + } + + export namespace commands { + + /** + * Registers a diff information command that can be invoked via a keyboard shortcut, + * a menu item, an action, or directly. + * + * Diff information commands are different from ordinary {@link commands.registerCommand commands} as + * they only execute when there is an active diff editor when the command is called, and the diff + * information has been computed. Also, the command handler of an editor command has access to + * the diff information. + * + * @param command A unique identifier for the command. + * @param callback A command handler function with access to the {@link LineChange diff information}. + * @param thisArg The `this` context used when invoking the handler function. + * @return Disposable which unregisters this command on disposal. + */ + export function registerDiffInformationCommand(command: string, callback: (diff: LineChange[], ...args: any[]) => any, thisArg?: any): Disposable; + } + + //#endregion + + // eslint-disable-next-line vscode-dts-region-comments + //#region @weinand: variables view action contributions + + /** + * A DebugProtocolVariableContainer is an opaque stand-in type for the intersection of the Scope and Variable types defined in the Debug Adapter Protocol. + * See https://microsoft.github.io/debug-adapter-protocol/specification#Types_Scope and https://microsoft.github.io/debug-adapter-protocol/specification#Types_Variable. + */ + export interface DebugProtocolVariableContainer { + // Properties: the intersection of DAP's Scope and Variable types. + } + + /** + * A DebugProtocolVariable is an opaque stand-in type for the Variable type defined in the Debug Adapter Protocol. + * See https://microsoft.github.io/debug-adapter-protocol/specification#Types_Variable. + */ + export interface DebugProtocolVariable { + // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_Variable). + } + + //#endregion + + // eslint-disable-next-line vscode-dts-region-comments + //#region @joaomoreno: SCM validation + + /** + * Represents the validation type of the Source Control input. + */ + export enum SourceControlInputBoxValidationType { + + /** + * 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 + } + + export interface SourceControlInputBoxValidation { + + /** + * The validation message to display. + */ + readonly message: string; + + /** + * The validation type. + */ + readonly type: SourceControlInputBoxValidationType; + } + + /** + * Represents the input box in the Source Control viewlet. + */ + export interface SourceControlInputBox { + + /** + * Shows a transient contextual message on the input. + */ + showValidationMessage(message: string, type: SourceControlInputBoxValidationType): void; + + /** + * A validation function for the input box. It's possible to change + * the validation provider simply by setting this property to a different function. + */ + validateInput?(value: string, cursorPosition: number): ProviderResult; + } + + //#endregion + + // eslint-disable-next-line vscode-dts-region-comments + //#region @joaomoreno: SCM selected provider + + export interface SourceControl { + + /** + * Whether the source control is selected. + */ + readonly selected: boolean; + + /** + * An event signaling when the selection state changes. + */ + readonly onDidChangeSelection: Event; + } + + //#endregion + + //#region Terminal data write event https://github.com/microsoft/vscode/issues/78502 + + export interface TerminalDataWriteEvent { + /** + * The {@link Terminal} for which the data was written. + */ + readonly terminal: Terminal; + /** + * The data being written. + */ + readonly data: string; + } + + namespace window { + /** + * An event which fires when the terminal's child pseudo-device is written to (the shell). + * In other words, this provides access to the raw data stream from the process running + * within the terminal, including VT sequences. + */ + export const onDidWriteTerminalData: Event; + } + + //#endregion + + //#region Terminal dimensions property and change event https://github.com/microsoft/vscode/issues/55718 + + /** + * An {@link Event} which fires when a {@link Terminal}'s dimensions change. + */ + export interface TerminalDimensionsChangeEvent { + /** + * The {@link Terminal} for which the dimensions have changed. + */ + readonly terminal: Terminal; + /** + * The new value for the {@link Terminal.dimensions terminal's dimensions}. + */ + readonly dimensions: TerminalDimensions; + } + + export namespace window { + /** + * An event which fires when the {@link Terminal.dimensions dimensions} of the terminal change. + */ + export const onDidChangeTerminalDimensions: Event; + } + + export interface Terminal { + /** + * The current dimensions of the terminal. This will be `undefined` immediately after the + * terminal is created as the dimensions are not known until shortly after the terminal is + * created. + */ + readonly dimensions: TerminalDimensions | undefined; + } + + //#endregion + + //#region Terminal name change event https://github.com/microsoft/vscode/issues/114898 + + export interface Pseudoterminal { + /** + * An event that when fired allows changing the name of the terminal. + * + * **Example:** Change the terminal name to "My new terminal". + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const changeNameEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * onDidChangeName: changeNameEmitter.event, + * open: () => changeNameEmitter.fire('My new terminal'), + * close: () => {} + * }; + * vscode.window.createTerminal({ name: 'My terminal', pty }); + * ``` + */ + onDidChangeName?: Event; + } + + //#endregion + + //#region Terminal icon https://github.com/microsoft/vscode/issues/120538 + + export interface TerminalOptions { + /** + * A codicon ID to associate with this terminal. + */ + readonly icon?: string; + } + + //#endregion + + // eslint-disable-next-line vscode-dts-region-comments + //#region @jrieken -> exclusive document filters + + export interface DocumentFilter { + readonly exclusive?: boolean; + } + + //#endregion + + //#region Tree View: https://github.com/microsoft/vscode/issues/61313 @alexr00 + export interface TreeView extends Disposable { + reveal(element: T | undefined, options?: { select?: boolean, focus?: boolean, expand?: boolean | number; }): Thenable; + } + //#endregion + + //#region Custom Tree View Drag and Drop https://github.com/microsoft/vscode/issues/32592 + export interface TreeViewOptions { + /** + * * Whether the tree supports drag and drop. + */ + canDragAndDrop?: boolean; + } + + export interface TreeDataProvider { + /** + * Optional method to reparent an `element`. + * + * **NOTE:** This method should be implemented if the tree supports drag and drop. + * + * @param elements The selected elements that will be reparented. + * @param targetElement The new parent of the elements. + */ + setParent?(elements: T[], targetElement: T): Thenable; + } + + //#endregion + + //#region Task presentation group: https://github.com/microsoft/vscode/issues/47265 + export interface TaskPresentationOptions { + /** + * Controls whether the task is executed in a specific terminal group using split panes. + */ + group?: string; + } + //#endregion + + //#region Status bar item with ID and Name: https://github.com/microsoft/vscode/issues/74972 + + /** + * Options to configure the status bar item. + */ + export interface StatusBarItemOptions { + + /** + * A unique identifier of the status bar item. The identifier + * is for example used to allow a user to show or hide the + * status bar item in the UI. + */ + id: string; + + /** + * A human readable name of the status bar item. The name is + * for example used as a label in the UI to show or hide the + * status bar item. + */ + name: string; + + /** + * Accessibility information used when screen reader interacts with this status bar item. + */ + accessibilityInformation?: AccessibilityInformation; + + /** + * The alignment of the status bar item. + */ + alignment?: StatusBarAlignment; + + /** + * The priority of the status bar item. Higher value means the item should + * be shown more to the left. + */ + priority?: number; + } + + export namespace window { + + /** + * Creates a status bar {@link StatusBarItem item}. + * + * @param options The options of the item. If not provided, some default values + * will be assumed. For example, the `StatusBarItemOptions.id` will be the id + * of the extension and the `StatusBarItemOptions.name` will be the extension name. + * @return A new status bar item. + */ + export function createStatusBarItem(options?: StatusBarItemOptions): StatusBarItem; + } + + //#endregion + + //#region Custom editor move https://github.com/microsoft/vscode/issues/86146 + + // TODO: Also for custom editor + + export interface CustomTextEditorProvider { + + /** + * Handle when the underlying resource for a custom editor is renamed. + * + * This allows the webview for the editor be preserved throughout the rename. If this method is not implemented, + * VS Code will destory the previous custom editor and create a replacement one. + * + * @param newDocument New text document to use for the custom editor. + * @param existingWebviewPanel Webview panel for the custom editor. + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return Thenable indicating that the webview editor has been moved. + */ + // eslint-disable-next-line vscode-dts-provider-naming + moveCustomTextEditor?(newDocument: TextDocument, existingWebviewPanel: WebviewPanel, token: CancellationToken): Thenable; + } + + //#endregion + + //#region allow QuickPicks to skip sorting: https://github.com/microsoft/vscode/issues/73904 + + export interface QuickPick extends QuickInput { + /** + * An optional flag to sort the final results by index of first query match in label. Defaults to true. + */ + sortByLabel: boolean; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/122922, Notebook, Finalization 1 + + export enum NotebookCellKind { + // todo@API rename/rethink as "Markup" cell + Markdown = 1, + Code = 2 + } + + // todo@API support ids https://github.com/jupyter/enhancement-proposals/blob/master/62-cell-id/cell-id.md + export interface NotebookCell { + readonly index: number; + readonly notebook: NotebookDocument; + readonly kind: NotebookCellKind; + readonly document: TextDocument; + readonly metadata: NotebookCellMetadata + readonly outputs: ReadonlyArray; + + // todo@API maybe just executionSummary or lastExecutionSummary? + readonly latestExecutionSummary: NotebookCellExecutionSummary | undefined; + } + + /** + * Represents a notebook which itself is a sequence of {@link NotebookCell code or markup cells}. Notebook documents are + * created from {@link NotebookData notebook data}. + */ + export interface NotebookDocument { + + /** + * The associated uri for this notebook. + * + * *Note* that most notebooks use the `file`-scheme, which means they are files on disk. However, **not** all notebooks are + * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. + * + * @see {@link FileSystemProvider} + * @see {@link TextDocumentContentProvider} + */ + readonly uri: Uri; + + // todo@API should we really expose this? + // todo@API should this be called `notebookType` or `notebookKind` + readonly viewType: string; + + /** + * The version number of this notebook (it will strictly increase after each + * change, including undo/redo). + */ + readonly version: number; + + /** + * `true` if there are unpersisted changes. + */ + readonly isDirty: boolean; + + /** + * Is this notebook representing an untitled file which has not been saved yet. + */ + readonly isUntitled: boolean; + + /** + * `true` if the notebook has been closed. A closed notebook isn't synchronized anymore + * and won't be re-used when the same resource is opened again. + */ + readonly isClosed: boolean; + + /** + * The {@link NotebookDocumentMetadata metadata} for this notebook. + */ + readonly metadata: NotebookDocumentMetadata; + + /** + * The number of cells in the notebook. + */ + readonly cellCount: number; + + /** + * Return the cell at the specified index. The index will be adjusted to the notebook. + * + * @param index - The index of the cell to retrieve. + * @return A {@link NotebookCell cell}. + */ + cellAt(index: number): NotebookCell; + + /** + * Get the cells of this notebook. A subset can be retrieved by providing + * a range. The range will be adjuset to the notebook. + * + * @param range A notebook range. + * @returns The cells contained by the range or all cells. + */ + getCells(range?: NotebookRange): NotebookCell[]; + + /** + * Save the document. The saving will be handled by the corresponding content provider + * + * @return A promise that will resolve to true when the document + * has been saved. If the file was not dirty or the save failed, + * will return false. + */ + save(): Thenable; + } + + export class NotebookCellMetadata { + /** + * Whether a code cell's editor is collapsed + */ + readonly inputCollapsed?: boolean; + + /** + * Whether a code cell's outputs are collapsed + */ + readonly outputCollapsed?: boolean; + + /** + * Additional attributes of a cell metadata. + */ + readonly [key: string]: any; + + /** + * Create a new notebook cell metadata. + * + * @param inputCollapsed Whether a code cell's editor is collapsed + * @param outputCollapsed Whether a code cell's outputs are collapsed + */ + constructor(inputCollapsed?: boolean, outputCollapsed?: boolean); + + /** + * Derived a new cell metadata from this metadata. + * + * @param change An object that describes a change to this NotebookCellMetadata. + * @return A new NotebookCellMetadata that reflects the given change. Will return `this` NotebookCellMetadata if the change + * is not changing anything. + */ + with(change: { inputCollapsed?: boolean | null, outputCollapsed?: boolean | null, [key: string]: any }): NotebookCellMetadata; + } + + export interface NotebookCellExecutionSummary { + readonly executionOrder?: number; + readonly success?: boolean; + readonly startTime?: number; + readonly endTime?: number; + } + + export class NotebookDocumentMetadata { + /** + * Additional attributes of the document metadata. + */ + readonly [key: string]: any; + + /** + * Create a new notebook document metadata + */ + constructor(); + + /** + * Derived a new document metadata from this metadata. + * + * @param change An object that describes a change to this NotebookDocumentMetadata. + * @return A new NotebookDocumentMetadata that reflects the given change. Will return `this` NotebookDocumentMetadata if the change + * is not changing anything. + */ + with(change: { [key: string]: any }): NotebookDocumentMetadata + } + + /** + * A notebook range represents on ordered pair of two cell indicies. + * It is guaranteed that start is less than or equal to end. + */ + export class NotebookRange { + + /** + * The zero-based start index of this range. + */ + readonly start: number; + + /** + * The exclusive end index of this range (zero-based). + */ + readonly end: number; + + /** + * `true` if `start` and `end` are equal. + */ + readonly isEmpty: boolean; + + /** + * Create a new notebook range. If `start` is not + * before or equal to `end`, the values will be swapped. + * + * @param start start index + * @param end end index. + */ + constructor(start: number, end: number); + + /** + * Derive a new range for 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?: number, end?: number }): NotebookRange; + } + + // code specific mime types + // application/x.notebook.error-traceback + // application/x.notebook.stdout + // application/x.notebook.stderr + // application/x.notebook.stream + export class NotebookCellOutputItem { + + // todo@API + // add factory functions for common mime types + // static textplain(value:string): NotebookCellOutputItem; + // static errortrace(value:any): NotebookCellOutputItem; + + mime: string; + + //todo@API string or Unit8Array? + value: unknown; + + metadata?: Record; + + constructor(mime: string, value: unknown, metadata?: Record); + } + + // @jrieken transient + export class NotebookCellOutput { + id: string; + outputs: NotebookCellOutputItem[]; + metadata?: Record; + constructor(outputs: NotebookCellOutputItem[], metadata?: Record); + constructor(outputs: NotebookCellOutputItem[], id: string, metadata?: Record); + } + + // todo@API support ids https://github.com/jupyter/enhancement-proposals/blob/master/62-cell-id/cell-id.md + export class NotebookCellData { + kind: NotebookCellKind; + // todo@API better names: value? text? + source: string; + // todo@API languageId (as in TextDocument) + language: string; + outputs?: NotebookCellOutput[]; + metadata?: NotebookCellMetadata; + // todo@API just executionSummary or lastExecutionSummary + latestExecutionSummary?: NotebookCellExecutionSummary; + constructor(kind: NotebookCellKind, source: string, language: string, outputs?: NotebookCellOutput[], metadata?: NotebookCellMetadata, latestExecutionSummary?: NotebookCellExecutionSummary); + } + + export class NotebookData { + cells: NotebookCellData[]; + metadata: NotebookDocumentMetadata; + constructor(cells: NotebookCellData[], metadata?: NotebookDocumentMetadata); + } + + /** + * The notebook serializer enables the editor to open notebook files. + * + * At its core the editor only knows a {@link NotebookData notebook data structure} but not + * how that data structure is written to a file, nor how it is read from a file. The + * notebook serializer bridges this gap by deserializing bytes into notebook data and + * vice versa. + */ + export interface NotebookSerializer { + + /** + * Deserialize contents of a notebook file into the notebook data structure. + * + * @param content Contents of a notebook file. + * @param token A cancellation token. + * @return Notebook data or a thenable that resolves to such. + */ + deserializeNotebook(content: Uint8Array, token: CancellationToken): NotebookData | Thenable; + + /** + * Serialize notebook data into file contents. + * + * @param data A notebook data structure. + * @param token A cancellation token. + * @returns An array of bytes or a thenable that resolves to such. + */ + serializeNotebook(data: NotebookData, token: CancellationToken): Uint8Array | Thenable; + } + + export interface NotebookDocumentContentOptions { + /** + * Controls if outputs change will trigger notebook document content change and if it will be used in the diff editor + * Default to false. If the content provider doesn't persisit the outputs in the file document, this should be set to true. + */ + transientOutputs?: boolean; + + /** + * Controls if a cell metadata property change will trigger notebook document content change and if it will be used in the diff editor + * Default to false. If the content provider doesn't persisit a metadata property in the file document, it should be set to true. + */ + transientCellMetadata?: { [K in keyof NotebookCellMetadata]?: boolean }; + + /** + * Controls if a document metadata property change will trigger notebook document content change and if it will be used in the diff editor + * Default to false. If the content provider doesn't persisit a metadata property in the file document, it should be set to true. + */ + transientDocumentMetadata?: { [K in keyof NotebookDocumentMetadata]?: boolean }; + } + + export interface NotebookExecuteHandler { + /** + * @param cells The notebook cells to execute. + * @param notebook The notebook for which the execute handler is being called. + * @param controller The controller that the handler is attached to + */ + (this: NotebookController, cells: NotebookCell[], notebook: NotebookDocument, controller: NotebookController): void | Thenable + } + + export interface NotebookInterruptHandler { + /** + * @param notebook The notebook for which the interrupt handler is being called. + */ + (this: NotebookController, notebook: NotebookDocument): void | Thenable; + } + + export enum NotebookControllerAffinity { + Default = 1, + Preferred = 2 + } + + // todo@API this is called Controller + export class NotebookKernelPreload { + /** + * APIs that the preload provides to the renderer. These are matched + * against the `dependencies` and `optionalDependencies` arrays in the + * notebook renderer contribution point. + */ + readonly provides: string[]; + + /** + * URI for the file to preload + */ + readonly uri: Uri; + + /** + * @param uri URI for the file to preload + * @param provides Value for the `provides` property + */ + constructor(uri: Uri, provides?: string | string[]); + } + + export interface NotebookCellExecuteStartContext { + /** + * The time that execution began, in milliseconds in the Unix epoch. Used to drive the clock + * that shows for how long a cell has been running. If not given, the clock won't be shown. + */ + startTime?: number; + } + + export interface NotebookCellExecuteEndContext { + /** + * If true, a green check is shown on the cell status bar. + * If false, a red X is shown. + */ + success?: boolean; + + /** + * The time that execution finished, in milliseconds in the Unix epoch. + */ + endTime?: number; + } + + /** + * A NotebookCellExecutionTask is how the kernel modifies a notebook cell as it is executing. When + * {@link notebook.createNotebookCellExecutionTask `createNotebookCellExecutionTask`} is called, the cell + * enters the Pending state. When `start()` is called on the execution task, it enters the Executing state. When + * `end()` is called, it enters the Idle state. While in the Executing state, cell outputs can be + * modified with the methods on the run task. + * + * All outputs methods operate on this NotebookCellExecutionTask's cell by default. They optionally take + * a cellIndex parameter that allows them to modify the outputs of other cells. `appendOutputItems` and + * `replaceOutputItems` operate on the output with the given ID, which can be an output on any cell. They + * all resolve once the output edit has been applied. + */ + export interface NotebookCellExecutionTask { + readonly document: NotebookDocument; + readonly cell: NotebookCell; + readonly token: CancellationToken; + + start(context?: NotebookCellExecuteStartContext): void; + executionOrder: number | undefined; + end(result?: NotebookCellExecuteEndContext): void; + + clearOutput(cellIndex?: number): Thenable; + appendOutput(out: NotebookCellOutput | NotebookCellOutput[], cellIndex?: number): Thenable; + replaceOutput(out: NotebookCellOutput | NotebookCellOutput[], cellIndex?: number): Thenable; + appendOutputItems(items: NotebookCellOutputItem | NotebookCellOutputItem[], outputId: string): Thenable; + replaceOutputItems(items: NotebookCellOutputItem | NotebookCellOutputItem[], outputId: string): Thenable; + } + + export interface NotebookController { + + /** + * The identifier of this notebook controller. + */ + readonly id: string; + + /** + * The notebook view type this controller is for. + */ + readonly viewType: string; + + /** + * An array of language identifiers that are supported by this + * controller. Any language identifier from {@link languages.getLanguages `getLanguages`} + * is possible. When falsy all languages are supported. + * + * Samples: + * ```js + * // support JavaScript and TypeScript + * myController.supportedLanguages = ['javascript', 'typescript'] + * + * // support all languages + * myController.supportedLanguages = undefined; // falsy + * myController.supportedLanguages = []; // falsy + * ``` + */ + supportedLanguages?: string[]; + + /** + * The human-readable label of this notebook controller. + */ + label: string; + + /** + * The human-readable description which is rendered less prominent. + */ + description?: string; + + /** + * The human-readable detail which is rendered less prominent. + */ + detail?: string; + + /** + * Whether this controller supports execution order so that the + * editor can render placeholders for them. + */ + // todo@API rename to supportsExecutionOrder, usesExecutionOrder + hasExecutionOrder?: boolean; + + /** + * The execute handler is invoked when the run gestures in the UI are selected, e.g Run Cell, Run All, + * Run Selection etc. + */ + executeHandler: NotebookExecuteHandler; + + /** + * The interrupt handler is invoked the interrupt all execution. This is contrary to cancellation (available via + * [`NotebookCellExecutionTask#token`](NotebookCellExecutionTask#token)) and should only be used when + * execution-level cancellation is supported + */ + interruptHandler?: NotebookInterruptHandler + + /** + * Dispose and free associated resources. + */ + dispose(): void; + + /** + * A kernel can apply to one or many notebook documents but a notebook has only one active + * kernel. This event fires whenever a notebook has been associated to a kernel or when + * that association has been removed. + */ + readonly onDidChangeNotebookAssociation: Event<{ notebook: NotebookDocument, selected: boolean }>; + + /** + * A controller can set affinities for specific notebook documents. This allows a controller + * to be more important for some notebooks. + * + * @param notebook The notebook for which a priority is set. + * @param affinity A controller affinity + */ + updateNotebookAffinity(notebook: NotebookDocument, affinity: NotebookControllerAffinity): void; + + /** + * Create a cell execution task. + * + * This should be used in response to the {@link NotebookController.executeHandler execution handler} + * being calleed or when cell execution has been started else, e.g when a cell was already + * executing or when cell execution was triggered from another source. + * + * @param cell The notebook cell for which to create the execution. + * @returns A notebook cell execution. + */ + createNotebookCellExecutionTask(cell: NotebookCell): NotebookCellExecutionTask; + + // todo@API find a better name than "preloads" + // todo@API allow add, not remove + // ipc + readonly preloads: NotebookKernelPreload[]; + + /** + * An event that fires when a renderer (see `preloads`) has send a message to the controller. + */ + readonly onDidReceiveMessage: Event<{ editor: NotebookEditor, message: any }>; + + /** + * Send a message to the renderer of notebook editors. + * + * Note that only editors showing documents that are bound to this controller + * are receiving the message. + * + * @param message The message to send. + * @param editor A specific editor to send the message to. When `undefined` all applicable editors are receiving the message. + * @returns A promise that resolves to a boolean indicating if the message has been send or not. + */ + postMessage(message: any, editor?: NotebookEditor): Thenable; + + //todo@API validate this works + asWebviewUri(localResource: Uri): Uri; + } + + export enum NotebookCellExecutionState { + Idle = 1, + Pending = 2, + Executing = 3, + } + + export interface NotebookCellExecutionStateChangeEvent { + /** + * The {@link NotebookDocument notebook document} for which the cell execution state has changed. + */ + readonly document: NotebookDocument; + readonly cell: NotebookCell; + readonly executionState: NotebookCellExecutionState; + } + + /** + * Represents the alignment of status bar items. + */ + export enum NotebookCellStatusBarAlignment { + + /** + * Aligned to the left side. + */ + Left = 1, + + /** + * Aligned to the right side. + */ + Right = 2 + } + + export class NotebookCellStatusBarItem { + text: string; + alignment: NotebookCellStatusBarAlignment; + command?: string | Command; + tooltip?: string; + priority?: number; + accessibilityInformation?: AccessibilityInformation; + + constructor(text: string, alignment: NotebookCellStatusBarAlignment, command?: string | Command, tooltip?: string, priority?: number, accessibilityInformation?: AccessibilityInformation); + } + + export interface NotebookCellStatusBarItemProvider { + /** + * Implement and fire this event to signal that statusbar items have changed. The provide method will be called again. + */ + onDidChangeCellStatusBarItems?: Event; + + /** + * The provider will be called when the cell scrolls into view, when its content, outputs, language, or metadata change, and when it changes execution state. + */ + provideCellStatusBarItems(cell: NotebookCell, token: CancellationToken): ProviderResult; + } + + export namespace notebook { + + /** + * Register a {@link NotebookSerializer notebook serializer}. + * + * @param notebookType A notebook. + * @param serializer A notebook serialzier. + * @param options Optional context options that define what parts of a notebook should be persisted + * @return A {@link Disposable} that unregisters this serializer when being disposed. + */ + export function registerNotebookSerializer(notebookType: string, serializer: NotebookSerializer, options?: NotebookDocumentContentOptions): Disposable; + + /** + * Creates a new notebook controller. + * + * @param id Identifier of the controller. Must be unique per extension. + * @param viewType A notebook view type for which this controller is for. + * @param label The label of the controller + * @param handler + * @param preloads + */ + export function createNotebookController(id: string, viewType: string, label: string, handler?: NotebookExecuteHandler, preloads?: NotebookKernelPreload[]): NotebookController; + + // todo@API what is this used for? + // todo@API qualify cell, ...NotebookCell... + export const onDidChangeCellExecutionState: Event; + + // todo@API use viewType instead of NotebookSelector + export function registerNotebookCellStatusBarItemProvider(selector: NotebookSelector, provider: NotebookCellStatusBarItemProvider): Disposable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/106744, NotebookEditor + + export enum NotebookEditorRevealType { + /** + * 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 + } + + export interface NotebookEditor { + /** + * The document associated with this notebook editor. + */ + readonly document: NotebookDocument; + + /** + * The selections on this notebook editor. + * + * The primary selection (or focused range) is `selections[0]`. When the document has no cells, the primary selection is empty `{ start: 0, end: 0 }`; + */ + readonly selections: NotebookRange[]; + + /** + * The current visible ranges in the editor (vertically). + */ + readonly visibleRanges: NotebookRange[]; + + /** + * 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: NotebookRange, revealType?: NotebookEditorRevealType): void; + + /** + * The column in which this editor shows. + */ + readonly viewColumn?: ViewColumn; + } + + export interface NotebookDocumentMetadataChangeEvent { + /** + * The {@link NotebookDocument notebook document} for which the document metadata have changed. + */ + readonly document: NotebookDocument; + } + + export interface NotebookCellsChangeData { + readonly start: number; + // todo@API end? Use NotebookCellRange instead? + readonly deletedCount: number; + // todo@API removedCells, deletedCells? + readonly deletedItems: NotebookCell[]; + // todo@API addedCells, insertedCells, newCells? + readonly items: NotebookCell[]; + } + + export interface NotebookCellsChangeEvent { + /** + * The {@link NotebookDocument notebook document} for which the cells have changed. + */ + readonly document: NotebookDocument; + readonly changes: ReadonlyArray; + } + + export interface NotebookCellOutputsChangeEvent { + /** + * The {@link NotebookDocument notebook document} for which the cell outputs have changed. + */ + readonly document: NotebookDocument; + readonly cells: NotebookCell[]; + } + + export interface NotebookCellMetadataChangeEvent { + /** + * The {@link NotebookDocument notebook document} for which the cell metadata have changed. + */ + readonly document: NotebookDocument; + readonly cell: NotebookCell; + } + + export interface NotebookEditorSelectionChangeEvent { + /** + * The {@link NotebookEditor notebook editor} for which the selections have changed. + */ + readonly notebookEditor: NotebookEditor; + readonly selections: ReadonlyArray + } + + export interface NotebookEditorVisibleRangesChangeEvent { + /** + * The {@link NotebookEditor notebook editor} for which the visible ranges have changed. + */ + readonly notebookEditor: NotebookEditor; + readonly visibleRanges: ReadonlyArray; + } + + + export interface NotebookDocumentShowOptions { + viewColumn?: ViewColumn; + preserveFocus?: boolean; + preview?: boolean; + selections?: NotebookRange[]; + } + + export namespace notebook { + + export function openNotebookDocument(uri: Uri): Thenable; + + export const onDidOpenNotebookDocument: Event; + export const onDidCloseNotebookDocument: Event; + + export const onDidSaveNotebookDocument: Event; + + /** + * All currently known notebook documents. + */ + export const notebookDocuments: ReadonlyArray; + export const onDidChangeNotebookDocumentMetadata: Event; + export const onDidChangeNotebookCells: Event; + + // todo@API add onDidChangeNotebookCellOutputs + export const onDidChangeCellOutputs: Event; + + // todo@API add onDidChangeNotebookCellMetadata + export const onDidChangeCellMetadata: Event; + } + + export namespace window { + export const visibleNotebookEditors: NotebookEditor[]; + export const onDidChangeVisibleNotebookEditors: Event; + export const activeNotebookEditor: NotebookEditor | undefined; + export const onDidChangeActiveNotebookEditor: Event; + export const onDidChangeNotebookEditorSelection: Event; + export const onDidChangeNotebookEditorVisibleRanges: Event; + + export function showNotebookDocument(uri: Uri, options?: NotebookDocumentShowOptions): Thenable; + export function showNotebookDocument(document: NotebookDocument, options?: NotebookDocumentShowOptions): Thenable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/106744, NotebookEditorEdit + + // todo@API add NotebookEdit-type which handles all these cases? + // export class NotebookEdit { + // range: NotebookRange; + // newCells: NotebookCellData[]; + // newMetadata?: NotebookDocumentMetadata; + // constructor(range: NotebookRange, newCells: NotebookCellData) + // } + + // export class NotebookCellEdit { + // newMetadata?: NotebookCellMetadata; + // } + + // export interface WorkspaceEdit { + // set(uri: Uri, edits: TextEdit[] | NotebookEdit[]): void + // } + + export interface WorkspaceEdit { + // todo@API add NotebookEdit-type which handles all these cases? + replaceNotebookMetadata(uri: Uri, value: NotebookDocumentMetadata): void; + replaceNotebookCells(uri: Uri, range: NotebookRange, cells: NotebookCellData[], metadata?: WorkspaceEditEntryMetadata): void; + replaceNotebookCellMetadata(uri: Uri, index: number, cellMetadata: NotebookCellMetadata, metadata?: WorkspaceEditEntryMetadata): void; + } + + export interface NotebookEditorEdit { + replaceMetadata(value: NotebookDocumentMetadata): void; + replaceCells(start: number, end: number, cells: NotebookCellData[]): void; + replaceCellMetadata(index: number, metadata: NotebookCellMetadata): void; + } + + export interface NotebookEditor { + /** + * Perform an edit on the notebook associated with this notebook editor. + * + * The given callback-function is invoked with an {@link NotebookEditorEdit edit-builder} 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 {@link NotebookEditorEdit edit-builder}. + * @return A promise that resolves with a value indicating if the edits could be applied. + */ + // @jrieken REMOVE maybe + edit(callback: (editBuilder: NotebookEditorEdit) => void): Thenable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/119949, Notebook (deprecated) + + export interface NotebookFilter { + readonly viewType?: string; + readonly scheme?: string; + readonly pattern?: GlobPattern; + } + + export type NotebookSelector = NotebookFilter | string | ReadonlyArray; + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/106744, NotebookContentProvider + + + interface NotebookDocumentBackup { + /** + * Unique identifier for the backup. + * + * This id is passed back to your extension in `openNotebook` when opening a notebook editor from a backup. + */ + readonly id: string; + + /** + * Delete the current backup. + * + * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup + * is made or when the file is saved. + */ + delete(): void; + } + + interface NotebookDocumentBackupContext { + readonly destination: Uri; + } + + interface NotebookDocumentOpenContext { + readonly backupId?: string; + readonly untitledDocumentData?: Uint8Array; + } + + // todo@API use openNotebookDOCUMENT to align with openCustomDocument etc? + // todo@API rename to NotebookDocumentContentProvider + export interface NotebookContentProvider { + + readonly options?: NotebookDocumentContentOptions; + readonly onDidChangeNotebookContentOptions?: Event; + + /** + * Content providers should always use {@link FileSystemProvider file system providers} to + * resolve the raw content for `uri` as the resouce is not necessarily a file on disk. + */ + openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext, token: CancellationToken): NotebookData | Thenable; + + // todo@API use NotebookData instead + saveNotebook(document: NotebookDocument, token: CancellationToken): Thenable; + + // todo@API use NotebookData instead + saveNotebookAs(targetResource: Uri, document: NotebookDocument, token: CancellationToken): Thenable; + + // todo@API use NotebookData instead + backupNotebook(document: NotebookDocument, context: NotebookDocumentBackupContext, token: CancellationToken): Thenable; + } + + /** + * todo@API Not ready for production or development use yet. + */ + export interface NotebookRegistrationData { + displayName: string; + filenamePattern: (GlobPattern | { include: GlobPattern; exclude: GlobPattern; })[]; + exclusive?: boolean; + } + + export namespace notebook { + + // TODO@api use NotebookDocumentFilter instead of just notebookType:string? + // TODO@API options duplicates the more powerful variant on NotebookContentProvider + export function registerNotebookContentProvider(notebookType: string, provider: NotebookContentProvider, options?: NotebookDocumentContentOptions): Disposable; + + // SPECIAL overload with _NotebookRegistrationData + export function registerNotebookContentProvider(notebookType: string, provider: NotebookContentProvider, options?: NotebookDocumentContentOptions, registrationData?: NotebookRegistrationData): Disposable; + + // SPECIAL overload with _NotebookRegistrationData + export function registerNotebookSerializer(notebookType: string, serializer: NotebookSerializer, options?: NotebookDocumentContentOptions, registration?: NotebookRegistrationData): Disposable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/106744, NotebookEditorDecorationType + + export interface NotebookEditor { + setDecorations(decorationType: NotebookEditorDecorationType, range: NotebookRange): void; + } + + export interface NotebookDecorationRenderOptions { + backgroundColor?: string | ThemeColor; + borderColor?: string | ThemeColor; + top: ThemableDecorationAttachmentRenderOptions; + } + + export interface NotebookEditorDecorationType { + readonly key: string; + dispose(): void; + } + + export namespace notebook { + export function createNotebookEditorDecorationType(options: NotebookDecorationRenderOptions): NotebookEditorDecorationType; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/106744, NotebookConcatTextDocument + + export namespace notebook { + /** + * Create a document that is the concatenation of all notebook cells. By default all code-cells are included + * but a selector can be provided to narrow to down the set of cells. + * + * @param notebook + * @param selector + */ + // todo@API really needed? we didn't find a user here + export function createConcatTextDocument(notebook: NotebookDocument, selector?: DocumentSelector): NotebookConcatTextDocument; + } + + export interface NotebookConcatTextDocument { + readonly uri: Uri; + readonly isClosed: boolean; + dispose(): void; + readonly onDidChange: Event; + readonly version: number; + getText(): string; + getText(range: Range): string; + + offsetAt(position: Position): number; + positionAt(offset: number): Position; + validateRange(range: Range): Range; + validatePosition(position: Position): Position; + + locationAt(positionOrRange: Position | Range): Location; + positionAt(location: Location): Position; + contains(uri: Uri): boolean; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/39441 + + export interface CompletionItem { + /** + * Will be merged into CompletionItem#label + */ + label2?: CompletionItemLabel; + } + + export interface CompletionItemLabel { + /** + * The function or variable. Rendered leftmost. + */ + name: string; + + /** + * The parameters without the return type. Render after `name`. + */ + parameters?: string; + + /** + * The fully qualified name, like package name or file path. Rendered after `signature`. + */ + qualifier?: string; + + /** + * The return-type of a function or type of a property/variable. Rendered rightmost. + */ + type?: string; + } + + //#endregion + + //#region @eamodio - timeline: https://github.com/microsoft/vscode/issues/84297 + + export class TimelineItem { + /** + * A timestamp (in milliseconds since 1 January 1970 00:00:00) for when the timeline item occurred. + */ + timestamp: number; + + /** + * A human-readable string describing the timeline item. + */ + label: string; + + /** + * Optional id for the timeline item. It must be unique across all the timeline items provided by this source. + * + * If not provided, an id is generated using the timeline item's timestamp. + */ + id?: string; + + /** + * The icon path or {@link ThemeIcon} for the timeline item. + */ + iconPath?: Uri | { light: Uri; dark: Uri; } | ThemeIcon; + + /** + * A human readable string describing less prominent details of the timeline item. + */ + description?: string; + + /** + * The tooltip text when you hover over the timeline item. + */ + detail?: string; + + /** + * The {@link Command} that should be executed when the timeline item is selected. + */ + command?: Command; + + /** + * Context value of the timeline item. This can be used to contribute specific actions to the item. + * For example, a timeline item is given a context value as `commit`. When contributing actions to `timeline/item/context` + * using `menus` extension point, you can specify context value for key `timelineItem` in `when` expression like `timelineItem == commit`. + * ``` + * "contributes": { + * "menus": { + * "timeline/item/context": [ + * { + * "command": "extension.copyCommitId", + * "when": "timelineItem == commit" + * } + * ] + * } + * } + * ``` + * This will show the `extension.copyCommitId` action only for items where `contextValue` is `commit`. + */ + contextValue?: string; + + /** + * Accessibility information used when screen reader interacts with this timeline item. + */ + accessibilityInformation?: AccessibilityInformation; + + /** + * @param label A human-readable string describing the timeline item + * @param timestamp A timestamp (in milliseconds since 1 January 1970 00:00:00) for when the timeline item occurred + */ + constructor(label: string, timestamp: number); + } + + export interface TimelineChangeEvent { + /** + * The {@link Uri} of the resource for which the timeline changed. + */ + uri: Uri; + + /** + * A flag which indicates whether the entire timeline should be reset. + */ + reset?: boolean; + } + + export interface Timeline { + readonly paging?: { + /** + * A provider-defined cursor specifying the starting point of timeline items which are after the ones returned. + * Use `undefined` to signal that there are no more items to be returned. + */ + readonly cursor: string | undefined; + }; + + /** + * An array of {@link TimelineItem timeline items}. + */ + readonly items: readonly TimelineItem[]; + } + + export interface TimelineOptions { + /** + * A provider-defined cursor specifying the starting point of the timeline items that should be returned. + */ + cursor?: string; + + /** + * An optional maximum number timeline items or the all timeline items newer (inclusive) than the timestamp or id that should be returned. + * If `undefined` all timeline items should be returned. + */ + limit?: number | { timestamp: number; id?: string; }; + } + + export interface TimelineProvider { + /** + * An optional event to signal that the timeline for a source has changed. + * To signal that the timeline for all resources (uris) has changed, do not pass any argument or pass `undefined`. + */ + onDidChange?: Event; + + /** + * An identifier of the source of the timeline items. This can be used to filter sources. + */ + readonly id: string; + + /** + * A human-readable string describing the source of the timeline items. This can be used as the display label when filtering sources. + */ + readonly label: string; + + /** + * Provide {@link TimelineItem timeline items} for a {@link Uri}. + * + * @param uri The {@link Uri} of the file to provide the timeline for. + * @param options A set of options to determine how results should be returned. + * @param token A cancellation token. + * @return The {@link TimelineResult timeline result} or a thenable that resolves to such. The lack of a result + * can be signaled by returning `undefined`, `null`, or an empty array. + */ + provideTimeline(uri: Uri, options: TimelineOptions, token: CancellationToken): ProviderResult; + } + + export namespace workspace { + /** + * Register a timeline 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 scheme A scheme or schemes that defines which documents this provider is applicable to. Can be `*` to target all documents. + * @param provider A timeline provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerTimelineProvider(scheme: string | string[], provider: TimelineProvider): Disposable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/91555 + + export enum StandardTokenType { + Other = 0, + Comment = 1, + String = 2, + RegEx = 4 + } + + export interface TokenInformation { + type: StandardTokenType; + range: Range; + } + + export namespace languages { + export function getTokenInformationAtPosition(document: TextDocument, position: Position): Thenable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/16221 + + // todo@API Split between Inlay- and OverlayHints (InlayHint are for a position, OverlayHints for a non-empty range) + // todo@API add "mini-markdown" for links and styles + // (done) remove description + // (done) rename to InlayHint + // (done) add InlayHintKind with type, argument, etc + + export namespace languages { + /** + * Register a inlay hints 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 inlay hints provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerInlayHintsProvider(selector: DocumentSelector, provider: InlayHintsProvider): Disposable; + } + + export enum InlayHintKind { + Other = 0, + Type = 1, + Parameter = 2, + } + + /** + * Inlay hint information. + */ + export class InlayHint { + /** + * The text of the hint. + */ + text: string; + /** + * The position of this hint. + */ + position: Position; + /** + * The kind of this hint. + */ + kind?: InlayHintKind; + /** + * Whitespace before the hint. + */ + whitespaceBefore?: boolean; + /** + * Whitespace after the hint. + */ + whitespaceAfter?: boolean; + + // todo@API make range first argument + constructor(text: string, position: Position, kind?: InlayHintKind); + } + + /** + * The inlay hints provider interface defines the contract between extensions and + * the inlay hints feature. + */ + export interface InlayHintsProvider { + + /** + * An optional event to signal that inlay hints have changed. + * @see {@link EventEmitter} + */ + onDidChangeInlayHints?: Event; + + /** + * + * @param model The document in which the command was invoked. + * @param range The range for which inlay hints should be computed. + * @param token A cancellation token. + * @return A list of inlay hints or a thenable that resolves to such. + */ + provideInlayHints(model: TextDocument, range: Range, token: CancellationToken): ProviderResult; + } + //#endregion + + //#region https://github.com/microsoft/vscode/issues/104436 + + export enum ExtensionRuntime { + /** + * The extension is running in a NodeJS extension host. Runtime access to NodeJS APIs is available. + */ + Node = 1, + /** + * The extension is running in a Webworker extension host. Runtime access is limited to Webworker APIs. + */ + Webworker = 2 + } + + export interface ExtensionContext { + readonly extensionRuntime: ExtensionRuntime; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/102091 + + export interface TextDocument { + + /** + * The {@link NotebookDocument notebook} that contains this document as a notebook cell or `undefined` when + * the document is not contained by a notebook (this should be the more frequent case). + */ + notebook: NotebookDocument | undefined; + } + //#endregion + + //#region https://github.com/microsoft/vscode/issues/107467 + export namespace test { + /** + * Registers a controller that can discover and + * run tests in workspaces and documents. + */ + export function registerTestController(testController: TestController): Disposable; + + /** + * Requests that tests be run by their controller. + * @param run Run options to use + * @param token Cancellation token for the test run + */ + export function runTests(run: TestRunRequest, token?: CancellationToken): Thenable; + + /** + * Returns an observer that retrieves tests in the given workspace folder. + * @stability experimental + */ + export function createWorkspaceTestObserver(workspaceFolder: WorkspaceFolder): TestObserver; + + /** + * Returns an observer that retrieves tests in the given text document. + * @stability experimental + */ + export function createDocumentTestObserver(document: TextDocument): TestObserver; + + /** + * Creates a {@link TestRun}. This should be called by the + * {@link TestRunner} when a request is made to execute tests, and may also + * be called if a test run is detected externally. Once created, tests + * that are included in the results will be moved into the + * {@link TestResultState.Pending} state. + * + * @param request Test run request. Only tests inside the `include` may be + * modified, and tests in its `exclude` are ignored. + * @param name The human-readable name of the run. This can be used to + * disambiguate multiple sets of results in a test run. It is useful if + * tests are run across multiple platforms, for example. + * @param persist Whether the results created by the run should be + * persisted in VS Code. This may be false if the results are coming from + * a file already saved externally, such as a coverage information file. + */ + export function createTestRun(request: TestRunRequest, name?: string, persist?: boolean): TestRun; + + /** + * Creates a new managed {@link TestItem} instance. + * @param options Initial/required options for the item + * @param data Custom data to be stored in {@link TestItem.data} + */ + export function createTestItem(options: TestItemOptions, data: T): TestItem; + + /** + * Creates a new managed {@link TestItem} instance. + * @param options Initial/required options for the item + */ + export function createTestItem(options: TestItemOptions): TestItem; + + /** + * List of test results stored by VS Code, sorted in descnding + * order by their `completedAt` time. + * @stability experimental + */ + export const testResults: ReadonlyArray; + + /** + * Event that fires when the {@link testResults} array is updated. + * @stability experimental + */ + export const onDidChangeTestResults: Event; + } + + /** + * @stability experimental + */ + export interface TestObserver { + /** + * List of tests returned by test provider for files in the workspace. + */ + readonly tests: ReadonlyArray>; + + /** + * An event that fires when an existing test in the collection changes, or + * null if a top-level test was added or removed. When fired, the consumer + * should check the test item and all its children for changes. + */ + readonly onDidChangeTest: Event; + + /** + * An event that fires when all test providers have signalled that the tests + * the observer references have been discovered. Providers may continue to + * watch for changes and cause {@link onDidChangeTest} to fire as files + * change, until the observer is disposed. + * + * @todo as below + */ + readonly onDidDiscoverInitialTests: Event; + + /** + * Dispose of the observer, allowing VS Code to eventually tell test + * providers that they no longer need to update tests. + */ + dispose(): void; + } + + /** + * @stability experimental + */ + export interface TestsChangeEvent { + /** + * List of all tests that are newly added. + */ + readonly added: ReadonlyArray>; + + /** + * List of existing tests that have updated. + */ + readonly updated: ReadonlyArray>; + + /** + * List of existing tests that have been removed. + */ + readonly removed: ReadonlyArray>; + } + + /** + * Interface to discover and execute tests. + */ + export interface TestController { + /** + * Requests that tests be provided for the given workspace. This will + * be called when tests need to be enumerated for the workspace, such as + * when the user opens the test explorer. + * + * It's guaranteed that this method will not be called again while + * there is a previous uncancelled call for the given workspace folder. + * + * @param workspace The workspace in which to observe tests + * @param cancellationToken Token that signals the used asked to abort the test run. + * @returns the root test item for the workspace + */ + createWorkspaceTestRoot(workspace: WorkspaceFolder, token: CancellationToken): ProviderResult>; + + /** + * Requests that tests be provided for the given document. This will be + * called when tests need to be enumerated for a single open file, for + * instance by code lens UI. + * + * It's suggested that the provider listen to change events for the text + * document to provide information for tests that might not yet be + * saved. + * + * If the test system is not able to provide or estimate for tests on a + * per-file basis, this method may not be implemented. In that case, the + * editor will request and use the information from the workspace tree. + * + * @param document The document in which to observe tests + * @param cancellationToken Token that signals the used asked to abort the test run. + * @returns the root test item for the document + */ + createDocumentTestRoot?(document: TextDocument, token: CancellationToken): ProviderResult>; + + /** + * Starts a test run. When called, the controller should call + * {@link vscode.test.createTestRun}. All tasks associated with the + * run should be created before the function returns or the reutrned + * promise is resolved. + * + * @param options Options for this test run + * @param cancellationToken Token that signals the used asked to abort the test run. + */ + runTests(options: TestRunRequest, token: CancellationToken): Thenable | void; + } + + /** + * Options given to {@link test.runTests}. + */ + export interface TestRunRequest { + /** + * Array of specific tests to run. The controllers should run all of the + * given tests and all children of the given tests, excluding any tests + * that appear in {@link TestRunRequest.exclude}. + */ + tests: TestItem[]; + + /** + * An array of tests the user has marked as excluded in VS Code. May be + * omitted if no exclusions were requested. Test controllers should not run + * excluded tests or any children of excluded tests. + */ + exclude?: TestItem[]; + + /** + * Whether tests in this run should be debugged. + */ + debug: boolean; + } + + /** + * Options given to {@link TestController.runTests} + */ + export interface TestRun { + /** + * The human-readable name of the run. This can be used to + * disambiguate multiple sets of results in a test run. It is useful if + * tests are run across multiple platforms, for example. + */ + readonly name?: string; + + /** + * Updates the state of the test in the run. Calling with method with nodes + * outside the {@link TestRunRequest.tests} or in the + * {@link TestRunRequest.exclude} array will no-op. + * + * @param test The test to update + * @param state The state to assign to the test + * @param duration Optionally sets how long the test took to run + */ + setState(test: TestItem, state: TestResultState, duration?: number): void; + + /** + * Appends a message, such as an assertion error, to the test item. + * + * Calling with method with nodes outside the {@link TestRunRequest.tests} + * or in the {@link TestRunRequest.exclude} array will no-op. + * + * @param test The test to update + * @param state The state to assign to the test + * + */ + appendMessage(test: TestItem, message: TestMessage): void; + + /** + * Appends raw output from the test runner. On the user's request, the + * output will be displayed in a terminal. ANSI escape sequences, + * such as colors and text styles, are supported. + * + * @param output Output text to append + * @param associateTo Optionally, associate the given segment of output + */ + appendOutput(output: string): void; + + /** + * Signals that the end of the test run. Any tests whose states have not + * been updated will be moved into the {@link TestResultState.Unset} state. + */ + end(): void; + } + + /** + * Indicates the the activity state of the {@link TestItem}. + */ + export enum TestItemStatus { + /** + * All children of the test item, if any, have been discovered. + */ + Resolved = 1, + + /** + * The test item may have children who have not been discovered yet. + */ + Pending = 0, + } + + /** + * Options initially passed into `vscode.test.createTestItem` + */ + export interface TestItemOptions { + /** + * Unique identifier for the TestItem. This is used to correlate + * test results and tests in the document with those in the workspace + * (test explorer). This cannot change for the lifetime of the TestItem. + */ + id: string; + + /** + * URI this TestItem is associated with. May be a file or directory. + */ + uri?: Uri; + + /** + * Display name describing the test item. + */ + label: string; + } + + /** + * A test item is an item shown in the "test explorer" view. It encompasses + * both a suite and a test, since they have almost or identical capabilities. + */ + export interface TestItem { + /** + * Unique identifier for the TestItem. This is used to correlate + * test results and tests in the document with those in the workspace + * (test explorer). This must not change for the lifetime of the TestItem. + */ + readonly id: string; + + /** + * URI this TestItem is associated with. May be a file or directory. + */ + readonly uri?: Uri; + + /** + * A mapping of children by ID to the associated TestItem instances. + */ + readonly children: ReadonlyMap>; + + /** + * The parent of this item, if any. Assigned automatically when calling + * {@link TestItem.addChild}. + */ + readonly parent?: TestItem; + + /** + * Indicates the state of the test item's children. The editor will show + * TestItems in the `Pending` state and with a `resolveHandler` as being + * expandable, and will call the `resolveHandler` to request items. + * + * A TestItem in the `Resolved` state is assumed to have discovered and be + * watching for changes in its children if applicable. TestItems are in the + * `Resolved` state when initially created; if the editor should call + * the `resolveHandler` to discover children, set the state to `Pending` + * after creating the item. + */ + status: TestItemStatus; + + /** + * Display name describing the test case. + */ + label: string; + + /** + * Optional description that appears next to the label. + */ + description?: string; + + /** + * Location of the test item in its `uri`. This is only meaningful if the + * `uri` points to a file. + */ + range?: Range; + + /** + * May be set to an error associated with loading the test. Note that this + * is not a test result and should only be used to represent errors in + * discovery, such as syntax errors. + */ + error?: string | MarkdownString; + + /** + * Whether this test item can be run by providing it in the + * {@link TestRunRequest.tests} array. Defaults to `true`. + */ + runnable: boolean; + + /** + * Whether this test item can be debugged by providing it in the + * {@link TestRunRequest.tests} array. Defaults to `false`. + */ + debuggable: boolean; + + /** + * Custom extension data on the item. This data will never be serialized + * or shared outside the extenion who created the item. + */ + data: T; + + /** + * Marks the test as outdated. This can happen as a result of file changes, + * for example. In "auto run" mode, tests that are outdated will be + * automatically rerun after a short delay. Invoking this on a + * test with children will mark the entire subtree as outdated. + * + * Extensions should generally not override this method. + */ + invalidate(): void; + + /** + * A function provided by the extension that the editor may call to request + * children of the item, if the {@link TestItem.status} is `Pending`. + * + * When called, the item should discover tests and call {@link TestItem.addChild}. + * The items should set its {@link TestItem.status} to `Resolved` when + * discovery is finished. + * + * The item should continue watching for changes to the children and + * firing updates until the token is cancelled. The process of watching + * the tests may involve creating a file watcher, for example. After the + * token is cancelled and watching stops, the TestItem should set its + * {@link TestItem.status} back to `Pending`. + * + * The editor will only call this method when it's interested in refreshing + * the children of the item, and will not call it again while there's an + * existing, uncancelled discovery for an item. + * + * @param token Cancellation for the request. Cancellation will be + * requested if the test changes before the previous call completes. + */ + resolveHandler?: (token: CancellationToken) => void; + + /** + * Attaches a child, created from the {@link test.createTestItem} function, + * to this item. A `TestItem` may be a child of at most one other item. + */ + addChild(child: TestItem): void; + + /** + * Removes the test and its children from the tree. Any tokens passed to + * child `resolveHandler` methods will be cancelled. + */ + dispose(): void; + } + + /** + * Possible states of tests in a test run. + */ + export enum TestResultState { + // Initial state + Unset = 0, + // Test will be run, but is not currently running. + Queued = 1, + // Test is currently running + Running = 2, + // Test run has passed + Passed = 3, + // Test run has failed (on an assertion) + Failed = 4, + // Test run has been skipped + Skipped = 5, + // Test run failed for some other reason (compilation error, timeout, etc) + Errored = 6 + } + + /** + * Represents the severity of test messages. + */ + export enum TestMessageSeverity { + Error = 0, + Warning = 1, + Information = 2, + Hint = 3 + } + + /** + * Message associated with the test state. Can be linked to a specific + * source range -- useful for assertion failures, for example. + */ + export class TestMessage { + /** + * Human-readable message text to display. + */ + message: string | MarkdownString; + + /** + * Message severity. Defaults to "Error". + */ + severity: TestMessageSeverity; + + /** + * Expected test output. If given with `actualOutput`, a diff view will be shown. + */ + expectedOutput?: string; + + /** + * Actual test output. If given with `expectedOutput`, a diff view will be shown. + */ + actualOutput?: string; + + /** + * Associated file location. + */ + location?: Location; + + /** + * Creates a new TestMessage that will present as a diff in the editor. + * @param message Message to display to the user. + * @param expected Expected output. + * @param actual Actual output. + */ + static diff(message: string | MarkdownString, expected: string, actual: string): TestMessage; + + /** + * Creates a new TestMessage instance. + * @param message The message to show to the user. + */ + constructor(message: string | MarkdownString); + } + + /** + * TestResults can be provided to VS Code in {@link test.publishTestResult}, + * or read from it in {@link test.testResults}. + * + * The results contain a 'snapshot' of the tests at the point when the test + * run is complete. Therefore, information such as its {@link Range} may be + * out of date. If the test still exists in the workspace, consumers can use + * its `id` to correlate the result instance with the living test. + * + * @todo coverage and other info may eventually be provided here + */ + export interface TestRunResult { + /** + * Unix milliseconds timestamp at which the test run was completed. + */ + completedAt: number; + + /** + * Optional raw output from the test run. + */ + output?: string; + + /** + * List of test results. The items in this array are the items that + * were passed in the {@link test.runTests} method. + */ + results: ReadonlyArray>; + } + + /** + * A {@link TestItem}-like interface with an associated result, which appear + * or can be provided in {@link TestResult} interfaces. + */ + export interface TestResultSnapshot { + /** + * Unique identifier that matches that of the associated TestItem. + * This is used to correlate test results and tests in the document with + * those in the workspace (test explorer). + */ + readonly id: string; + + /** + * URI this TestItem is associated with. May be a file or file. + */ + readonly uri?: Uri; + + /** + * Display name describing the test case. + */ + readonly label: string; + + /** + * Optional description that appears next to the label. + */ + readonly description?: string; + + /** + * Location of the test item in its `uri`. This is only meaningful if the + * `uri` points to a file. + */ + readonly range?: Range; + + /** + * State of the test in each task. In the common case, a test will only + * be executed in a single task and the length of this array will be 1. + */ + readonly taskStates: ReadonlyArray; + + /** + * Optional list of nested tests for this item. + */ + readonly children: Readonly[]; + } + + export interface TestSnapshoptTaskState { + /** + * Current result of the test. + */ + readonly state: TestResultState; + + /** + * The number of milliseconds the test took to run. This is set once the + * `state` is `Passed`, `Failed`, or `Errored`. + */ + readonly duration?: number; + + /** + * Associated test run message. Can, for example, contain assertion + * failure information if the test fails. + */ + readonly messages: ReadonlyArray; + } + + //#endregion + + //#region Opener service (https://github.com/microsoft/vscode/issues/109277) + + /** + * Details if an `ExternalUriOpener` can open a uri. + * + * The priority is also used to rank multiple openers against each other and determine + * if an opener should be selected automatically or if the user should be prompted to + * select an opener. + * + * VS Code will try to use the best available opener, as sorted by `ExternalUriOpenerPriority`. + * If there are multiple potential "best" openers for a URI, then the user will be prompted + * to select an opener. + */ + export enum ExternalUriOpenerPriority { + /** + * The opener is disabled and will never be shown to users. + * + * Note that the opener can still be used if the user specifically + * configures it in their settings. + */ + None = 0, + + /** + * The opener can open the uri but will not cause a prompt on its own + * since VS Code always contributes a built-in `Default` opener. + */ + Option = 1, + + /** + * The opener can open the uri. + * + * VS Code's built-in opener has `Default` priority. This means that any additional `Default` + * openers will cause the user to be prompted to select from a list of all potential openers. + */ + Default = 2, + + /** + * The opener can open the uri and should be automatically selected over any + * default openers, include the built-in one from VS Code. + * + * A preferred opener will be automatically selected if no other preferred openers + * are available. If multiple preferred openers are available, then the user + * is shown a prompt with all potential openers (not just preferred openers). + */ + Preferred = 3, + } + + /** + * Handles opening uris to external resources, such as http(s) links. + * + * Extensions can implement an `ExternalUriOpener` to open `http` links to a webserver + * inside of VS Code instead of having the link be opened by the web browser. + * + * Currently openers may only be registered for `http` and `https` uris. + */ + export interface ExternalUriOpener { + + /** + * Check if the opener can open a uri. + * + * @param uri The uri being opened. This is the uri that the user clicked on. It has + * not yet gone through port forwarding. + * @param token Cancellation token indicating that the result is no longer needed. + * + * @return Priority indicating if the opener can open the external uri. + */ + canOpenExternalUri(uri: Uri, token: CancellationToken): ExternalUriOpenerPriority | Thenable; + + /** + * Open a uri. + * + * This is invoked when: + * + * - The user clicks a link which does not have an assigned opener. In this case, first `canOpenExternalUri` + * is called and if the user selects this opener, then `openExternalUri` is called. + * - The user sets the default opener for a link in their settings and then visits a link. + * + * @param resolvedUri The uri to open. This uri may have been transformed by port forwarding, so it + * may not match the original uri passed to `canOpenExternalUri`. Use `ctx.originalUri` to check the + * original uri. + * @param ctx Additional information about the uri being opened. + * @param token Cancellation token indicating that opening has been canceled. + * + * @return Thenable indicating that the opening has completed. + */ + openExternalUri(resolvedUri: Uri, ctx: OpenExternalUriContext, token: CancellationToken): Thenable | void; + } + + /** + * Additional information about the uri being opened. + */ + interface OpenExternalUriContext { + /** + * The uri that triggered the open. + * + * This is the original uri that the user clicked on or that was passed to `openExternal.` + * Due to port forwarding, this may not match the `resolvedUri` passed to `openExternalUri`. + */ + readonly sourceUri: Uri; + } + + /** + * Additional metadata about a registered `ExternalUriOpener`. + */ + interface ExternalUriOpenerMetadata { + + /** + * List of uri schemes the opener is triggered for. + * + * Currently only `http` and `https` are supported. + */ + readonly schemes: readonly string[] + + /** + * Text displayed to the user that explains what the opener does. + * + * For example, 'Open in browser preview' + */ + readonly label: string; + } + + namespace window { + /** + * Register a new `ExternalUriOpener`. + * + * When a uri is about to be opened, an `onOpenExternalUri:SCHEME` activation event is fired. + * + * @param id Unique id of the opener, such as `myExtension.browserPreview`. This is used in settings + * and commands to identify the opener. + * @param opener Opener to register. + * @param metadata Additional information about the opener. + * + * @returns Disposable that unregisters the opener. + */ + export function registerExternalUriOpener(id: string, opener: ExternalUriOpener, metadata: ExternalUriOpenerMetadata): Disposable; + } + + interface OpenExternalOptions { + /** + * Allows using openers contributed by extensions through `registerExternalUriOpener` + * when opening the resource. + * + * If `true`, VS Code will check if any contributed openers can handle the + * uri, and fallback to the default opener behavior. + * + * If it is string, this specifies the id of the `ExternalUriOpener` + * that should be used if it is available. Use `'default'` to force VS Code's + * standard external opener to be used. + */ + readonly allowContributedOpeners?: boolean | string; + } + + namespace env { + export function openExternal(target: Uri, options?: OpenExternalOptions): Thenable; + } + + //#endregion + + //#region https://github.com/Microsoft/vscode/issues/15178 + + // TODO@API must be a class + export interface OpenEditorInfo { + name: string; + resource: Uri; + } + + export namespace window { + export const openEditors: ReadonlyArray; + + // todo@API proper event type + export const onDidChangeOpenEditors: Event; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/120173 + /** + * The object describing the properties of the workspace trust request + */ + export interface WorkspaceTrustRequestOptions { + /** + * Custom message describing the user action that requires workspace + * trust. If omitted, a generic message will be displayed in the workspace + * trust request dialog. + */ + readonly message?: string; + } + + export namespace workspace { + /** + * Prompt the user to chose whether to trust the current workspace + * @param options Optional object describing the properties of the + * workspace trust request. + */ + export function requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Thenable; + } + + //#endregion + + //#region https://github.com/microsoft/vscode/issues/115616 @alexr00 + export enum PortAutoForwardAction { + Notify = 1, + OpenBrowser = 2, + OpenPreview = 3, + Silent = 4, + Ignore = 5 + } + + export interface PortAttributes { + port: number; + autoForwardAction: PortAutoForwardAction + } + + export interface PortAttributesProvider { + /** + * Provides attributes for the given port. For ports that your extension doesn't know about, simply + * return undefined. For example, if `providePortAttributes` is called with ports 3000 but your + * extension doesn't know anything about 3000 you should return undefined. + */ + providePortAttributes(port: number, pid: number | undefined, commandLine: string | undefined, token: CancellationToken): ProviderResult; + } + + export namespace workspace { + /** + * If your extension listens on ports, consider registering a PortAttributesProvider to provide information + * about the ports. For example, a debug extension may know about debug ports in it's debuggee. By providing + * this information with a PortAttributesProvider the extension can tell VS Code that these ports should be + * ignored, since they don't need to be user facing. + * + * @param portSelector If registerPortAttributesProvider is called after you start your process then you may already + * know the range of ports or the pid of your process. All properties of a the portSelector must be true for your + * provider to get called. + * The `portRange` is start inclusive and end exclusive. + * @param provider The PortAttributesProvider + */ + export function registerPortAttributesProvider(portSelector: { pid?: number, portRange?: [number, number], commandMatcher?: RegExp }, provider: PortAttributesProvider): Disposable; + } + //#endregion + + //#region https://github.com/microsoft/vscode/issues/119904 @eamodio + + export interface SourceControlInputBox { + + /** + * Sets focus to the input. + */ + focus(): void; + } + + //#endregion +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..9655c75 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,42 @@ +//@ts-check + +'use strict'; + +const path = require('path'); + +/**@type {import('webpack').Configuration}*/ +const config = { + target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'dist'), + filename: 'extension.js', + libraryTarget: 'commonjs2' + }, + devtool: 'nosources-source-map', + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vsceignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + } +}; +module.exports = config; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..8fd53c5 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2292 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/highlight@^7.10.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/eslint-scope@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" + integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.2.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.10.tgz#4b7a9368d46c0f8cd5408c23288a59aa2394d917" + integrity sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.47": + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== + +"@types/glob@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/minimatch@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + +"@types/mocha@^8.0.4": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== + +"@types/node@*": + version "15.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" + integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== + +"@types/node@^12.11.7": + version "12.20.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.12.tgz#fd9c1c2cfab536a2383ed1ef70f94adea743a226" + integrity sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg== + +"@types/vscode@^1.56.0": + version "1.56.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.56.0.tgz#2a75ee6d66e529295648b0b6ee43824564ed9c1a" + integrity sha512-Q5VmQxOx+L1Y6lIJiGcJzwcyV3pQo/eiW8P+7sNLhFI16tJCwtua2DLjHRcpjbCLNVYpQM73kzfFo1Z0HyP9eQ== + +"@typescript-eslint/eslint-plugin@^4.14.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.1.tgz#6bcdbaa4548553ab861b4e5f34936ead1349a543" + integrity sha512-kVTAghWDDhsvQ602tHBc6WmQkdaYbkcTwZu+7l24jtJiYvm9l+/y/b2BZANEezxPDiX5MK2ZecE+9BFi/YJryw== + dependencies: + "@typescript-eslint/experimental-utils" "4.22.1" + "@typescript-eslint/scope-manager" "4.22.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.1.tgz#3938a5c89b27dc9a39b5de63a62ab1623ab27497" + integrity sha512-svYlHecSMCQGDO2qN1v477ax/IDQwWhc7PRBiwAdAMJE7GXk5stF4Z9R/8wbRkuX/5e9dHqbIWxjeOjckK3wLQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.14.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.1.tgz#a95bda0fd01d994a15fc3e99dc984294f25c19cc" + integrity sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw== + dependencies: + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz#5bb357f94f9cd8b94e6be43dd637eb73b8f355b4" + integrity sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g== + dependencies: + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" + +"@typescript-eslint/types@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.1.tgz#bf99c6cec0b4a23d53a61894816927f2adad856a" + integrity sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw== + +"@typescript-eslint/typescript-estree@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz#dca379eead8cdfd4edc04805e83af6d148c164f9" + integrity sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A== + dependencies: + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz#6045ae25a11662c671f90b3a403d682dfca0b7a6" + integrity sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ== + dependencies: + "@typescript-eslint/types" "4.22.1" + eslint-visitor-keys "^2.0.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" + integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + +"@webassemblyjs/floating-point-hex-parser@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" + integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== + +"@webassemblyjs/helper-api-error@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" + integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== + +"@webassemblyjs/helper-buffer@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" + integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== + +"@webassemblyjs/helper-numbers@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" + integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.0" + "@webassemblyjs/helper-api-error" "1.11.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" + integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== + +"@webassemblyjs/helper-wasm-section@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" + integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + +"@webassemblyjs/ieee754@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" + integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" + integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" + integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== + +"@webassemblyjs/wasm-edit@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" + integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/helper-wasm-section" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + "@webassemblyjs/wasm-opt" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + "@webassemblyjs/wast-printer" "1.11.0" + +"@webassemblyjs/wasm-gen@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" + integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/ieee754" "1.11.0" + "@webassemblyjs/leb128" "1.11.0" + "@webassemblyjs/utf8" "1.11.0" + +"@webassemblyjs/wasm-opt@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" + integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + +"@webassemblyjs/wasm-parser@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" + integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-api-error" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/ieee754" "1.11.0" + "@webassemblyjs/leb128" "1.11.0" + "@webassemblyjs/utf8" "1.11.0" + +"@webassemblyjs/wast-printer@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" + integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9" + integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw== + +"@webpack-cli/info@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573" + integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e" + integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.1: + version "8.2.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" + integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big-integer@^1.6.17: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001219: + version "1.0.30001223" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001223.tgz#39b49ff0bfb3ee3587000d2f66c47addc6e14443" + integrity sha512-k/RYs6zc/fjbxTjaWZemeSmOjO0JJV+KguOBA3NwPup8uzxM1cMhR2BD9XmO86GuqaqTCO8CgkgH9Rz//vdDiA== + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +electron-to-chromium@^1.3.723: + version "1.3.727" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" + integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz#d9deae58f9d3773b6a111a5a46831da5be5c9ac0" + integrity sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +es-module-lexer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e" + integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.19.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.21" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +glob@^7.1.3, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + 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" + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.1: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.2, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" + integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== + +mime-types@^2.1.27: + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + dependencies: + mime-db "1.47.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +"mkdirp@>=0.5 0": + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^8.2.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.3.2.tgz#53406f195fa86fbdebe71f8b1c6fb23221d69fcc" + integrity sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^1.1.71: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@5.0.1, serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +setimmediate@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.0.4: + version "6.7.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2" + integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +terser-webpack-plugin@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" + integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q== + dependencies: + jest-worker "^26.6.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.5.1" + +terser@^5.5.1: + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + +ts-loader@^8.0.14: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.2.0.tgz#6a3aeaa378aecda543e2ed2c332d3123841d52e0" + integrity sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^4.0.0" + loader-utils "^2.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^4.1.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + +unzipper@^0.10.11: + version "0.10.11" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +vscode-dts@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/vscode-dts/-/vscode-dts-0.3.1.tgz#070554a7fc9aaf5e85466a0519bf32067308cdf4" + integrity sha512-8XZ+M7IQV5MnPXEhHLemGOk5FRBfT7HCBEughfDhn2i6wwPXlpv4OuQQdhs6XZVmF3GFdKqt+fXOgfsNBKP+fw== + dependencies: + minimist "^1.2.0" + prompts "^2.1.0" + rimraf "^3.0.0" + +vscode-test@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.5.2.tgz#d9ec3cab1815afae1d7d81923e3c685d13d32303" + integrity sha512-x9PVfKxF6EInH9iSFGQi0V8H5zIW1fC7RAer6yNQR6sy3WyOwlWkuT3I+wf75xW/cO53hxMi1aj/EvqQfDFOAg== + dependencies: + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + rimraf "^3.0.2" + unzipper "^0.10.11" + +watchpack@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-cli@^4.4.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35" + integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.0.3" + "@webpack-cli/info" "^1.2.4" + "@webpack-cli/serve" "^1.4.0" + colorette "^1.2.1" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" + integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack@^5.19.0: + version "5.36.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.36.2.tgz#6ef1fb2453ad52faa61e78d486d353d07cca8a0f" + integrity sha512-XJumVnnGoH2dV+Pk1VwgY4YT6AiMKpVoudUFCNOXMIVrEKPUgEwdIfWPjIuGLESAiS8EdIHX5+TiJz/5JccmRg== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.47" + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/wasm-edit" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + acorn "^8.2.1" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.0" + es-module-lexer "^0.4.0" + eslint-scope "^5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.0.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.1" + watchpack "^2.0.0" + webpack-sources "^2.1.1" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==